From 21e832d446952a704a2cd4b26c05616ada771d07 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 1 Aug 2023 17:03:49 +0200 Subject: [PATCH 01/33] WIP expressions refactoring --- build/pil_parser.js | 84 +- src/assert.js | 13 + src/assign.js | 8 +- src/constraints.js | 4 + src/expression.js | 405 +++--- src/expression_factory.js | 60 + src/expression_items.js | 37 + src/expression_items/array_of.js | 15 + src/expression_items/expression_item.js | 10 + src/expression_items/expression_reference.js | 5 + src/expression_items/fe_value.js | 12 + .../fixed_col.js | 4 +- src/expression_items/int_value.js | 22 + src/expression_items/proof_item.js | 9 + .../proofval.js} | 5 +- src/{pil_items => expression_items}/public.js | 4 +- .../publictable.js | 4 +- src/expression_items/reference.js | 11 + src/expression_items/runtime_item.js | 5 + src/expression_items/stack_item.js | 16 + src/expression_items/string_value.js | 18 + .../subproofval.js} | 4 +- src/expression_items/value_item.js | 18 + .../witness_col.js | 4 +- src/expression_legacy.js | 1199 +++++++++++++++++ src/expressions.js | 3 +- src/fixed_cols.js | 42 +- src/function.js | 5 +- src/indexable.js | 50 +- src/pil_parser.jison | 82 +- src/processor.js | 56 +- src/references.js | 19 +- src/runtime.js | 62 + src/variables.js | 9 +- src/witness_cols.js | 15 +- test/pil2/features/expressions.pil | 2 +- test/pil2/vadcop/byte4.pil | 2 +- 37 files changed, 1960 insertions(+), 363 deletions(-) create mode 100644 src/assert.js create mode 100644 src/expression_factory.js create mode 100644 src/expression_items.js create mode 100644 src/expression_items/array_of.js create mode 100644 src/expression_items/expression_item.js create mode 100644 src/expression_items/expression_reference.js create mode 100644 src/expression_items/fe_value.js rename src/{pil_items => expression_items}/fixed_col.js (90%) create mode 100644 src/expression_items/int_value.js create mode 100644 src/expression_items/proof_item.js rename src/{pil_items/proofvalue.js => expression_items/proofval.js} (59%) rename src/{pil_items => expression_items}/public.js (60%) rename src/{pil_items => expression_items}/publictable.js (58%) create mode 100644 src/expression_items/reference.js create mode 100644 src/expression_items/runtime_item.js create mode 100644 src/expression_items/stack_item.js create mode 100644 src/expression_items/string_value.js rename src/{pil_items/subproofvalue.js => expression_items/subproofval.js} (58%) create mode 100644 src/expression_items/value_item.js rename src/{pil_items => expression_items}/witness_col.js (64%) create mode 100644 src/expression_legacy.js create mode 100644 src/runtime.js diff --git a/build/pil_parser.js b/build/pil_parser.js index 79ae1ae..82de80b 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -73,7 +73,9 @@ */ var pil_parser = (function(){ var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,31,52,53,60,61,73,76,78,79,81,82,137,154],$V1=[1,30],$V2=[1,31],$V3=[1,21],$V4=[1,23],$V5=[1,24],$V6=[1,27],$V7=[1,28],$V8=[1,25],$V9=[1,26],$Va=[1,22],$Vb=[1,29],$Vc=[1,40],$Vd=[1,41],$Ve=[26,67,95,143],$Vf=[2,214],$Vg=[1,43],$Vh=[1,44],$Vi=[1,45],$Vj=[1,49],$Vk=[1,50],$Vl=[1,52],$Vm=[1,51],$Vn=[1,88],$Vo=[1,110],$Vp=[1,109],$Vq=[1,133],$Vr=[1,87],$Vs=[2,38],$Vt=[1,132],$Vu=[1,83],$Vv=[1,104],$Vw=[1,84],$Vx=[1,127],$Vy=[1,128],$Vz=[1,131],$VA=[1,134],$VB=[1,123],$VC=[1,124],$VD=[1,125],$VE=[1,118],$VF=[1,95],$VG=[1,126],$VH=[1,130],$VI=[1,108],$VJ=[1,93],$VK=[1,94],$VL=[1,111],$VM=[1,112],$VN=[1,113],$VO=[1,114],$VP=[1,115],$VQ=[1,116],$VR=[1,100],$VS=[1,101],$VT=[1,120],$VU=[1,102],$VV=[1,96],$VW=[1,97],$VX=[1,98],$VY=[1,106],$VZ=[1,122],$V_=[2,65],$V$=[1,152],$V01=[1,137],$V11=[1,140],$V21=[1,141],$V31=[1,142],$V41=[1,143],$V51=[1,144],$V61=[1,145],$V71=[1,146],$V81=[1,147],$V91=[1,148],$Va1=[1,149],$Vb1=[1,150],$Vc1=[1,151],$Vd1=[6,8,30,31,52,53,60,61,73,76,78,79,81,82,108,137,154],$Ve1=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vf1=[6,8,30,31,52,53,60,61,63,73,76,78,79,81,82,108,137,154],$Vg1=[2,254],$Vh1=[1,165],$Vi1=[1,166],$Vj1=[6,8,30,31,52,53,56,60,61,63,73,76,78,79,81,82,107,108,127,137,154],$Vk1=[6,8,30,31,52,53,60,61,63,73,76,78,79,81,82,107,108,137,154],$Vl1=[2,54],$Vm1=[1,176],$Vn1=[1,179],$Vo1=[1,180],$Vp1=[1,181],$Vq1=[1,182],$Vr1=[1,183],$Vs1=[21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vt1=[1,189],$Vu1=[8,30,108],$Vv1=[1,197],$Vw1=[1,191],$Vx1=[1,192],$Vy1=[1,193],$Vz1=[1,194],$VA1=[1,195],$VB1=[1,196],$VC1=[1,198],$VD1=[1,199],$VE1=[1,200],$VF1=[1,201],$VG1=[1,202],$VH1=[1,203],$VI1=[1,204],$VJ1=[1,205],$VK1=[1,206],$VL1=[1,207],$VM1=[1,208],$VN1=[1,209],$VO1=[1,210],$VP1=[1,211],$VQ1=[1,212],$VR1=[1,213],$VS1=[8,21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$VT1=[1,221],$VU1=[1,223],$VV1=[2,308],$VW1=[1,227],$VX1=[1,228],$VY1=[1,230],$VZ1=[1,231],$V_1=[1,232],$V$1=[1,233],$V02=[1,237],$V12=[1,236],$V22=[1,238],$V32=[1,240],$V42=[1,242],$V52=[1,247],$V62=[1,257],$V72=[1,258],$V82=[1,256],$V92=[8,30,107,108],$Va2=[1,267],$Vb2=[1,266],$Vc2=[1,262],$Vd2=[1,263],$Ve2=[1,264],$Vf2=[1,265],$Vg2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vh2=[2,337],$Vi2=[1,272],$Vj2=[1,271],$Vk2=[1,274],$Vl2=[1,280],$Vm2=[1,285],$Vn2=[1,290],$Vo2=[6,8,30,31,46,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vp2=[6,8,25,28,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vq2=[2,345],$Vr2=[1,305],$Vs2=[48,63],$Vt2=[6,8,26,28,30,31,48,52,53,55,56,58,60,61,63,64,67,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vu2=[6,8,30,31,52,53,60,61,73,76,78,79,81,82,107,108,137,154],$Vv2=[1,326],$Vw2=[1,339],$Vx2=[48,58,63],$Vy2=[8,21,24,26,28,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vz2=[1,372],$VA2=[1,376],$VB2=[1,377],$VC2=[26,31,46,61,67,69,70,71,73,77,95,121,123,141,142,143,170,171,172,178,180],$VD2=[1,380],$VE2=[1,389],$VF2=[2,190],$VG2=[2,241],$VH2=[1,418],$VI2=[1,422],$VJ2=[8,30,63,107,108],$VK2=[2,193],$VL2=[8,30,58,63,107,108,127],$VM2=[58,63],$VN2=[1,443],$VO2=[1,444],$VP2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167],$VQ2=[6,8,28,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VR2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,108,118,137,146,147,154,162,163,167],$VS2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,108,118,137,146,147,154,163,167],$VT2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172],$VU2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176],$VV2=[1,475],$VW2=[30,63],$VX2=[6,8,28,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VY2=[1,483],$VZ2=[1,485],$V_2=[2,41],$V$2=[8,107],$V03=[1,515],$V13=[1,539],$V23=[6,8,25,28,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,151,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$V33=[1,560],$V43=[1,561],$V53=[1,564],$V63=[1,565],$V73=[1,566],$V83=[58,63,64],$V93=[2,240],$Va3=[1,568],$Vb3=[8,30],$Vc3=[8,30,56,58,63,107,108,127],$Vd3=[6,8,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Ve3=[30,58,63],$Vf3=[6,8,30,31,48,52,53,60,61,63,73,76,78,79,81,82,107,108,137,154],$Vg3=[55,58,63,64],$Vh3=[6,8,21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vi3=[1,666],$Vj3=[1,674],$Vk3=[1,675],$Vl3=[1,714],$Vm3=[55,63],$Vn3=[30,116,119]; -var parser = {trace: function trace () { }, +var parser = {trace: function trace () { + Jison.print.apply(null, arguments); + }, yy: {}, symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"constant_definition":19,"use_directive":20,"USE":21,"name_reference":22,"no_closed_container_definition":23,"CONTAINER":24,"ALIAS":25,"IDENTIFIER":26,"closed_container_definition":27,"{":28,"declare_block":29,"}":30,"PROOF":31,"statement_block":32,"non_delimited_statement":33,"statement_closed":34,"lcs":35,"statement_no_closed":36,"statement_list":37,"statement_list_closed":38,"declare_list":39,"when_boundary":40,"FIRST":41,"LAST":42,"FRAME":43,"codeblock_closed":44,"WHEN":45,"(":46,"expression":47,")":48,"METADATA":49,"data_object":50,"function":51,"FUNCTION":52,"PRIVATE":53,"arguments":54,":":55,"[":56,"return_type_list":57,"]":58,"return_type":59,"FINAL":60,"SUBPROOF":61,"arguments_list":62,",":63,"DOTS_FILL":64,"argument":65,"basic_type":66,"REFERENCE":67,"type_array":68,"INT":69,"FE":70,"EXPR":71,"CONST":72,"COL":73,"WITNESS":74,"FIXED":75,"CHALLENGE":76,"T_STRING":77,"PROOF_VALUE":78,"SUBPROOF_VALUE":79,"AIR_VALUE":80,"PUBLIC":81,"PUBLIC_TABLE":82,"declare_item":83,"variable_declaration":84,"codeblock_no_closed":85,"===":86,"delayed_function_call":87,"data_value":88,"data_array":89,"function_call":90,"name_optional_index":91,"multiple_expression_list":92,"delayed_function_event":93,"defined_scopes":94,"AIR":95,"ON":96,"variable_assignment":97,"variable_multiple_assignment":98,"return_statement":99,"CONTINUE":100,"BREAK":101,"in_expression":102,"expression_list":103,"FOR":104,"for_init":105,"variable_assignment_list":106,"IN":107,"WHILE":108,"DO":109,"ONCE":110,"SWITCH":111,"case_body":112,"IF":113,"ELSE":114,"case_list":115,"DEFAULT":116,"case_value":117,"DOTS_RANGE":118,"CASE":119,"for_assignation":120,"INC":121,"name_id":122,"DEC":123,"variable_type_declaration":124,"variable_declaration_list":125,"variable_declaration_item":126,"=":127,"variable_declaration_array":128,"RETURN":129,"assign_operation":130,"+=":131,"-=":132,"*=":133,"left_variable_multiple_assignment_list":134,"left_variable_multiple_assignment":135,"sequence_definition":136,"INCLUDE":137,"flexible_string":138,"stage_definition":139,"STAGE":140,"NUMBER":141,"STRING":142,"TEMPLATE_STRING":143,"sequence_list":144,"sequence":145,"DOTS_ARITH_SEQ":146,"DOTS_GEOM_SEQ":147,"declaration_array":148,"col_declaration_item":149,"col_declaration_ident":150,".":151,"col_declaration_list":152,"AGGREGATE":153,"CONSTANT":154,"EQ":155,"NE":156,"LT":157,"GT":158,"LE":159,"GE":160,"IS":161,"AND":162,"?":163,"B_AND":164,"B_OR":165,"B_XOR":166,"OR":167,"SHL":168,"SHR":169,"!":170,"+":171,"-":172,"*":173,"%":174,"/":175,"\\\\":176,"POW":177,"POSITIONAL_PARAM":178,"casting":179,"'":180,"array_index":181,"name_reference_right":182,"$accept":0,"$end":1}, terminals_: {2:"error",6:"EOF",8:"CS",21:"USE",24:"CONTAINER",25:"ALIAS",26:"IDENTIFIER",28:"{",30:"}",31:"PROOF",41:"FIRST",42:"LAST",43:"FRAME",45:"WHEN",46:"(",48:")",49:"METADATA",52:"FUNCTION",53:"PRIVATE",55:":",56:"[",58:"]",60:"FINAL",61:"SUBPROOF",63:",",64:"DOTS_FILL",67:"REFERENCE",69:"INT",70:"FE",71:"EXPR",72:"CONST",73:"COL",74:"WITNESS",75:"FIXED",76:"CHALLENGE",77:"T_STRING",78:"PROOF_VALUE",79:"SUBPROOF_VALUE",80:"AIR_VALUE",81:"PUBLIC",82:"PUBLIC_TABLE",86:"===",95:"AIR",96:"ON",100:"CONTINUE",101:"BREAK",104:"FOR",107:"IN",108:"WHILE",109:"DO",110:"ONCE",111:"SWITCH",113:"IF",114:"ELSE",116:"DEFAULT",118:"DOTS_RANGE",119:"CASE",121:"INC",123:"DEC",127:"=",129:"RETURN",131:"+=",132:"-=",133:"*=",137:"INCLUDE",140:"STAGE",141:"NUMBER",142:"STRING",143:"TEMPLATE_STRING",146:"DOTS_ARITH_SEQ",147:"DOTS_GEOM_SEQ",151:".",153:"AGGREGATE",154:"CONSTANT",155:"EQ",156:"NE",157:"LT",158:"GT",159:"LE",160:"GE",161:"IS",162:"AND",163:"?",164:"B_AND",165:"B_OR",166:"B_XOR",167:"OR",168:"SHL",169:"SHR",170:"!",171:"+",172:"-",173:"*",174:"%",175:"/",176:"\\\\",177:"POW",178:"POSITIONAL_PARAM",180:"'"}, @@ -303,13 +305,13 @@ case 122: this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] break; case 123: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = runtime_expr({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) break; case 124: this.$ = {data: {}}; this.$.data[$$[$0-2]] = $$[$0] break; case 125: - this.$ = {data: {}}; this.$.data[$$[$0]] = runtime_expr({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) break; case 126: case 153: case 221: case 242: case 247: this.$ = $$[$0-2]; this.$.values.push($$[$0]) @@ -713,106 +715,106 @@ case 281: this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } break; case 282: - this.$ = insert_expr($$[$0-2], 'eq', $$[$0]) + this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) break; case 283: - this.$ = insert_expr($$[$0-2], 'ne', $$[$0]) + this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) break; case 284: - this.$ = insert_expr($$[$0-2], 'lt', $$[$0]) + this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) break; case 285: - this.$ = insert_expr($$[$0-2], 'gt', $$[$0]) + this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) break; case 286: - this.$ = insert_expr($$[$0-2], 'le', $$[$0]) + this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) break; case 287: - this.$ = insert_expr($$[$0-2], 'ge', $$[$0]) + this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) break; case 288: - this.$ = insert_expr($$[$0-2], 'in', $$[$0]) + this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) break; case 289: - this.$ = insert_expr($$[$0-2], 'is', runtime_expr({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})) + this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})); break; case 290: - this.$ = insert_expr($$[$0-2], 'and', $$[$0]) + this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; case 291: - this.$ = insert_expr($$[$0-4], 'if', $$[$0-2], $$[$0]) + this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) break; case 292: - this.$ = insert_expr($$[$0-2], 'band', $$[$0]) + this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) break; case 293: - this.$ = insert_expr($$[$0-2], 'bor', $$[$0]) + this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) break; case 294: - this.$ = insert_expr($$[$0-2], 'bxor', $$[$0]) + this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) break; case 295: - this.$ = insert_expr($$[$0-2], 'or', $$[$0]) + this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) break; case 296: - this.$ = insert_expr($$[$0-2], 'shl', $$[$0]) + this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) break; case 297: - this.$ = insert_expr($$[$0-2], 'shr', $$[$0]) + this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; case 298: - this.$ = insert_expr($$[$0], 'not') + this.$ = $$[$0-1].insert('not') break; case 299: - this.$ = insert_expr($$[$0-2], 'add', $$[$0]) + this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) break; case 300: - this.$ = insert_expr($$[$0-2], 'sub', $$[$0]) + this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) break; case 301: - this.$ = insert_expr($$[$0-2], 'mul', $$[$0]) + this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) break; case 302: - this.$ = insert_expr($$[$0-2], 'mod', $$[$0]) + this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) break; case 303: - this.$ = insert_expr($$[$0-2], 'div', $$[$0]) + this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) break; case 304: - this.$ = insert_expr($$[$0-2], 'intdiv', $$[$0]) + this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) break; case 305: - this.$ = insert_expr($$[$0-2], 'pow', $$[$0]) + this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) break; case 307: - this.$ = insert_expr($$[$0], 'neg') + this.$ = $$[$0].insert('neg') break; case 308: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) break; case 309: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) break; case 310: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) break; case 311: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) break; case 312: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) break; case 313: - this.$ = new Expression(); this.$.setValue(BigInt($$[$0])) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($$[$0])}) break; case 314: - this.$ = runtime_expr({...$$[$0], op: 'string'}) + this.$ = ExpressionFactory.fromObject({...$$[$0], op: 'string'}) break; case 316: case 318: - this.$ = runtime_expr({...$$[$0]}) + this.$ = ExpressionFactory.fromObject({...$$[$0]}) break; case 317: - this.$ = runtime_expr({position: $$[$0], op: 'positional_param'}) + this.$ = ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) break; case 319: this.$ = { op: 'cast', cast: 'int', value: $$[$0-1]} @@ -854,7 +856,7 @@ case 331: this.$ = { ...$$[$0-4], next:$$[$0-1] } break; case 332: - this.$ = { ...$$[$0-2], next: runtime_expr({position: $$[$0], op: 'positional_param'}) } + this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) } break; case 333: this.$ = { ...$$[$0], prior:1 } @@ -866,7 +868,7 @@ case 335: this.$ = { ...$$[$0], prior:$$[$0-3] } break; case 336: - this.$ = { ...$$[$0], prior:runtime_expr({position: $$[$0-2], op: 'positional_param'}) } + this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], op: 'positional_param'}) } break; case 338: this.$ = { ...$$[$0], dim: 0 } @@ -1046,10 +1048,12 @@ parse: function parse(input) { const DEFAULT_STAGE = 1; const util = require('util'); const Expression = require('../src/expression.js'); +const ExpressionFactory = require('../src/expression_factory.js'); function showcode(title, info) { console.log(title+` ${info.last_line}:${info.last_column}`); } +/* function runtime_expr(value) { let res = new Expression(); if (value.type) { @@ -1067,7 +1071,7 @@ function insert_expr(e, op, ...values) { // console.log(values); e.insert.apply(e, [op, ...values]); return e; -} +}*/ // console.log(`STATE ${state} ${(this.terminals_[symbol] || symbol)}`); /* generated by jison-lex 0.3.4 */ var lexer = (function(){ diff --git a/src/assert.js b/src/assert.js new file mode 100644 index 0000000..be91e6d --- /dev/null +++ b/src/assert.js @@ -0,0 +1,13 @@ +const _assert = require("chai").assert; + +function assertLog(condition, info) { + if (!condition) { + console.log(info); + } + _assert(condition); +} + +module.exports = { + assert: _assert, + assertLog +} \ No newline at end of file diff --git a/src/assign.js b/src/assign.js index caa74bb..104cceb 100644 --- a/src/assign.js +++ b/src/assign.js @@ -1,6 +1,7 @@ const References = require("./references.js"); const Expressions = require("./expressions.js"); const Expression = require("./expression.js"); +const {assert, assertLog} = require('./assert.js'); module.exports = class Assign { constructor (Fr, parent, context, references, expressions) { @@ -14,17 +15,16 @@ module.exports = class Assign { assign (name, indexes, value) { // console.log(value.stack[0].operands[0]); const _value = value.eval(); - if (typeof _value !== 'undefined') { + if (typeof _value !== 'undefined' && _value !== null) { value = _value; } + assert(value !== null); return this.__assign(name, indexes, value); } __assign(name, indexes, value) { const [type, reference, array] = this.references.getTypeR(name, indexes); + console.log([type, reference, array]); const dim = (array && array.dim) ? array.dim : 0; - if (this.parent.context.sourceRef === 'assigns.pil:115') { - debugger; - } if (dim > 0) { return this.assignArray(name, indexes, value, array); } diff --git a/src/constraints.js b/src/constraints.js index 8a529be..14e2fea 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -1,3 +1,5 @@ +const {assert, assertLog} = require('./assert.js'); +const Expression = require('./expression.js'); module.exports = class Constraints { constructor (Fr, expressions) { @@ -19,6 +21,8 @@ module.exports = class Constraints { } define(left, right, boundery, sourceRef) { + assertLog(left instanceof Expression, left); + assertLog(right instanceof Expression, right); if (left.isRuntime()) { left.dump('LEFT CONSTRAINT'); throw new Error(`left constraint has runtime no resolved elements`); diff --git a/src/expression.js b/src/expression.js index f14bc02..96f4ac4 100644 --- a/src/expression.js +++ b/src/expression.js @@ -3,17 +3,19 @@ const {cloneDeep} = require('lodash'); const {assert} = require("chai"); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const PilItem = require('./pil_item.js'); +const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); -const OP_VALUE = 0; -const OP_ID_REF = 1; -const OP_STACK = 2; -const OP_RUNTIME = 3; +const OP_VALUE = 'value'; +const OP_ID_REF = 'idref'; +const OP_STACK = 'stack'; +const OP_RUNTIME = 'runtime'; const NATIVE_REFS = ['witness', 'fixed', 'public', 'challenge', 'subproofvalue', 'proofvalue', 'publictable']; const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; class ExpressionStackEvaluating {}; -module.exports = class Expression { +class InstanceArray extends Error {}; +module.exports = class Expression extends ExpressionItem { // op (string) // operands (array) @@ -25,6 +27,7 @@ module.exports = class Expression { // offset (number) static parent; + static context; // TODO: add all operations as if, static operations = { mul: { type: 'arith', label: '*', prec: 96, args: 2, handle: (a, b) => a * b, handleFr: (Fr, a, b) => Fr.mul(a, b)}, @@ -51,6 +54,7 @@ module.exports = class Expression { } constructor () { + super(); this.stack = []; this.fixedRowAccess = false; } @@ -59,6 +63,10 @@ module.exports = class Expression { Expression.parent = parent; } + static setContext (context) { + Expression.context = context; + } + clone() { let cloned = new Expression(); cloned.fixedRowAccess = this.fixedRowAccess; @@ -156,7 +164,9 @@ module.exports = class Expression { isReference () { // TODO: review if best place? - return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference'); + // TODO: review if next/prior + // return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference' ); + return (this.isAlone() && this.stack[0].operands[0] instanceof Reference); } // OP_VALUE (value) @@ -170,7 +180,7 @@ module.exports = class Expression { } this.stack.push({op: false, operands: [cloneDeep(operand)]}); } - +/* setIdReference (id, refType, next) { assert(typeof refType === 'string'); this._set({type: OP_ID_REF, id, refType, next}); @@ -189,17 +199,18 @@ module.exports = class Expression { } this._set({type: OP_RUNTIME, ...value}); } - +*/ isRuntime () { return this.stack.some(st => this.isRuntimeStackPos(st)); } isRuntimeStackPos(st) { - return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(ope => this.isRuntimeOperand(ope))); + return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(operand => operand instanceof RuntimeItem)); } - isRuntimeOperand(ope) { +/* isRuntimeOperand(ope) { return (ope.type === OP_RUNTIME); - } + }*/ insertOne (op, b) { + assert(b instanceof Expression); const aIsEmpty = this.stack.length === 0; const bIsEmpty = b.stack.length === 0; @@ -214,25 +225,34 @@ module.exports = class Expression { this.stack[0].operands.push(b.cloneAlone()); return this; } - let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; - this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); + // let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; + // this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); + let operandA = aIsEmpty ? [] : [new StackItem(1)]; + this.stack.push({op, operands: [operandA, b.cloneAlone()]}); return this; } // !aIsAlone (aIsEmpty?) && !bIsAlone const count = this.pushStack(b); if (aIsEmpty) { - this.stack.push({op, operands: [{type: OP_STACK, offset: 1}]}); + this.stack.push({op, operands: [new StackItem(1)]}); return this; } - this.stack.push({op, operands: [{type: OP_STACK, offset: count + 1}, {type: OP_STACK, offset: 1}]}); + this.stack.push({op, operands: [new StackItem(count + 1), new StackItem(1)]}); return this; } - insert (op, ...bs) { + insert (op, bs) { + if (!Array.isArray(bs)) { + return this.insertOne(op, bs); + } if (bs.length === 1) { return this.insertOne(op, bs[0]); } + // verify that all bs are expressions + assert(bs.reduce((isExpression, b) => isExpresion = isExpression && b instanceof Expression, true)); + + const anyEmptyB = bs.some((b) => b.stack.length === 0); const aIsEmpty = this.stack.length === 0; @@ -283,58 +303,6 @@ module.exports = class Expression { } return operand.__value; } - evaluateOperandValue(ope, pos, deeply, instance = false) { - if (deeply) { - if (ope.type === OP_STACK) { - const stackPos = pos-ope.offset; - this.evaluateStackPosValue(stackPos); // TODO: cache and infinite-loops - ope.__value = this.stack[stackPos].__value; - } - } else if (ope.type === OP_VALUE ) { - ope.__value = ope.value; - - } else if (ope.type === OP_ID_REF ) { - ope.__value = new NonRuntimeEvaluable(); - - } else if (ope.type === OP_RUNTIME ) { - let res = this.evaluateRuntime(ope, deeply); - console.log(res); - console.log(instance); - // BUG: if type was an expression not apply value !! - // if (!(res instanceof Expression)) { - if (instance) { - console.log(res); - if (res instanceof Expression && res.isAlone()) { - res = res.getAloneOperand(); - } - console.log(res); - if (res instanceof Expression) { - res.dump(); - console.log(ope); - ope.__value = res; - } else { - assert(!(res instanceof Expression)); - Object.keys(ope).forEach(key => delete ope[key]); - if (typeof res === 'bigint') { - ope.type = OP_VALUE; - ope.value = res; - } else { - console.log(res); - // assert(NATIVE_REFS.includes(res.type)); - assert(NATIVE_REFS.includes(res.refType)); - ope.type = OP_ID_REF; - ope.refType = res.refType; - ope.id = res.id; - if (res.next) ope.next = res.next; - assert(typeof ope.id === 'number'); - } - delete ope.op; - } - } else { - ope.__value = res; - } - } - } assertInstanced() { try { for (let ist = 0; ist < this.stack.length; ++ist) { @@ -433,67 +401,206 @@ module.exports = class Expression { this.evaluateIndexes(dope); return dope; } - instance(simplify = false) { + isArray() { + // only a reference could be and array. + if (!this.isReference() || this.stack[0].operands[0].next || this.stack[0].operands[0].prior) return false; + + let ref = this.getReference(); + console.log(ref); + EXIT_HERE; + + } + // stackResults[pos][0] contains result of this stack position, + // in stackResults[pos][1] contains a results array of this stack position operands + instance() { + this.dump(); let dup = this.clone(); - dup.evaluateOperands(false, true); - dup.evaluateOperands(true, true); - dup.instanceExpressions(); - const top = dup.stack.length-1; - dup.evaluateStackPosValue(top, true); - dup.instanceValues(); - if (simplify) { - console.log('=== SIMPLIFY ==='); - dup.dump(); - dup.simplify(); - dup.assertInstanced(); - dup.dump(); - } - dup.dump(); - return dup; - } - eval(deeply = false) { + const options = {instance: true} + let stackResults = dup.evaluateOperands(options); + // dup.extendExpressions(options); + dup.evaluateFullStack(stackResults, options); + console.log(stackResults); + } + eval() { if (this.stack.length === 0) { return this; } - if (this.stack[0].op === false) { - delete this.stack[0].operands[0].__value; - } - this.evaluateOperands(deeply); - this.evaluateStackPosValue(this.stack.length-1); - return this.stack[this.stack.length-1].__value ?? this; + let options = {}; + this.dump(); + let stackResults = this.evaluateOperands(options); + // this.instanceExpressions(options); + this.evaluateFullStack(stackResults, options); + console.log('====[ RESULT ]====> ', stackResults[0][0]); + return stackResults[this.stack.length-1][0]; + } + evaluateFullStack(stackResults, options) { + this.evaluateStackPos(stackResults, this.stack.length - 1, options); } - evaluateStackPosValue(pos, instance = false) { + evaluateStackPos(stackResults, pos, options) { const st = this.stack[pos]; + const results = stackResults[pos]; + console.log(st); + console.log(stackResults[pos]); - this.evaluateStackPosOperands(pos, true, instance); - - delete st.__value; - const res = this.calculate(st); - if (res !== null) { - st.__value = res; + if (results[0] !== null) { + console.log(['RETURN', results[0]]) + return results[0]; + } + /* if (st.op === false) { + if (st.operands[0].type === OP_VALUE) { + } + return stackResults[pos]; + }*/ + + let value; + let values = results[1]; + console.log(values); + for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { + const operand = st.operands[operandIndex]; + if (values[operandIndex] !== null) { + console.log(value); + continue; + } + value = null; + console.log(operand); + switch (typeof operand) { + case 'IntValue': + value = operand.getValue(); + console.log(value); + break; + case 'StackItem': + value = this.evaluateStackPos(stackResults, pos - operand.getOffset()); + console.log(value); + break; + default: + console.log(['DEFAULT', value]); + } + values[operandIndex] = value; + } + console.log([st.op, ...values]); + value = null; + if (values.some(value => value === null)) { + value = null; + } else if (st.op === false) { + value = values[0]; + } else { + value = this.applyOperation(st.op, values); } + results[0] = value; + return value; } - calculate(st) { - if (st.op === false) { - return st.operands[0].__value; + applyOperation(operation, values) { + const opfunc = Expression.operations[operation] ?? false; + if (opfunc === false) { + throw new Error(`NOT FOUND OPERATION (${operation})`); } - - if (st.operands.some(x => (typeof x === 'object' && x.type !== OP_VALUE && typeof x.__value !== 'bigint'))) { + let value; + try { + console.log(values); + const intvalues = values.map(x => x.getValue()); + console.log(intvalues); + value = opfunc.handle.apply(this, intvalues); + } catch (e) { + console.log([{op: operation},...values]); + throw e; + } + return new IntValue(value); + } + evaluateValue(value, options) { + console.log(value); + if (typeof value === 'undefined') { + return 0; + } + // stack references not replaced + // expression references not extended (inserted) + console.log(value); + if (value instanceof Expression) { + value.dump(); + } + assert(value instanceof ExpressionItem); + if (value instanceof StackItem) { + return null; + } else if (value instanceof ValueItem) { + return value; + } else if (value instanceof ProofItem) { return null; + } else if (value instanceof Reference) { + let res = Expression.context.runtime.eval(value, {}); + return res; + } else { + console.log(value); + return value; + EXIT_HERE; } + return value; + } + evaluateValues(values, options) { + // do array of evaluates, for example to evaluate + // indexes o call arguments, this method call n times + // evaluations + if (typeof values === 'undefined') { + return 0; + } + assert (Array.isArray(values)); + let result = []; + for (const value of values) { + result.push(this.evaluateValue(value, options)); + } + return result; + } + getArrayResult(results, indexes, options) { + // this method take one of results using indexes + } + evaluateOperands(options) { + // evaluation must be from left to right (l2r) operands, inside operand + // also evaluation is l2r: prior, value, arguments (l2r), indexes (l2r) + // at end of this operand evaluation, must manage increment/decrement + // options. + + // stackResults is used to store operand evaluations needed by full stack + // evaluation. + + let stackResults = []; + for (let stpos = 0; stpos < this.stack.length; ++stpos) { + let results = [null, []]; + stackResults.push(results); + let operandResults = results[1]; + for (let ope of this.stack[stpos].operands) { + let next = 0; + // if no prior defined priorValue was 0 + let priorValue = this.evaluateValue(ope.prior, options); + + let result = this.evaluateValue(ope, stackResults, options); + console.log(['RESULT', result]); + let indexes = this.evaluateValues(ope.indexes, options); + if (indexes.length) { + // TODO: fixed access + result = this.getArrayResult(result, indexes, options); + } + // if no prior defined nextValue was 0 + let nextValue = this.evaluateValue(ope.next, options); - const opfunc = Expression.operations[st.op] ?? false; - if (opfunc === false) { - throw new Error(`NOT FOUND OPERATION (${st.op})`); + // prior and next are excl + if (priorValue && nextValue) { + throw new Error(`prior and next for same operand it's ambiguous`); + } + next = nextValue - priorValue; + operandResults.push(result); + } + } + return stackResults; + } + _calculate(st, pos, stackResults) { + if (st.op === false) { + return stackResults[pos][0]; } - const values = st.operands.map(x => x.type === 0 ? x.value : x.__value); - try { - return opfunc.handle.apply(this, values); - } catch (e) { - console.log([{op: st.op},...values]); - throw e; + if (stackResults[pos][1].some(x => !(x instanceof IntValue))) { + return null; } + + stackResults[pos][0] = this.applyOperation(st.op, stackResults[pos][1]); + return stackResults[pos][0]; } isRuntimeCalculable(e) { const te = typeof e; @@ -506,13 +613,15 @@ module.exports = class Expression { } // this method instance the expression references to include them inside // TODO: view how these affects to optimization. - instanceExpressions() { + instanceExpressions(options) { let pos = 0; while (pos < this.stack.length) { let nextPos = true; for (let ope of this.stack[pos].operands) { // assert(ope.__value instanceof Expression === false); if (ope.type !== OP_RUNTIME) continue; + console.log(ope); + EXIT_HERE; if (ope.__value instanceof Expression) { ope.type = OP_STACK; const exprToInsert = ope.__value.instance(); @@ -526,7 +635,11 @@ module.exports = class Expression { // TODO: twice evaluations, be carefull double increment evaluations,etc.. const res = this.evaluateRuntime(ope); - if (res instanceof Expression) { + if (res.value && res.value.type === OP_ID_REF) { + ope.type = OP_ID_REF; + ope.refType = res.refType; + ope.id = res.id; + } else if (res instanceof Expression) { ope.type = OP_STACK; const exprToInsert = res.instance(); const next = typeof ope.next === 'number' ? ope.next : ope.__next; @@ -709,59 +822,6 @@ module.exports = class Expression { // return if expression was updated return stackLen > this.stack.length; } - evaluateOperands(deeply = false, instance = false) { - for (let index = 0; index < this.stack.length; ++index) { - this.evaluateStackPosOperands(index, deeply, instance); - } - } - evaluateStackPosOperands(pos, deeply, instance = false) { - console.log([this.stack, pos]); - for (let ope of this.stack[pos].operands) { - this.evaluateOperand(ope, pos, deeply, instance); - } - } - evaluateOperand(ope, pos, deeply, instance = false) { - if (!deeply) { - this.clearNext(ope); - this.evaluatePrior(ope); - this.evaluateIndexes(ope); - this.evaluateNext(ope); - // TODO: for optimizations - if (instance) { - // indexes not exists when instanced !!! - ope.next = ope.__next; - delete ope.__next; - } - } - this.evaluateOperandValue(ope, pos, deeply, instance); - if (instance) { - delete ope.indexes; - delete ope._indexes; - } - } - - clearNext(ope) { - ope.__next = 0; - } - evaluatePrior(ope) { - if (typeof ope.prior === 'undefined') { - return 0; - } - ope.__next = -this.evaluateContent(ope.prior); - return ope.__next; - } - - evaluateIndexes(ope) { - if (typeof ope.indexes === 'undefined') { - return []; - } - ope.__indexes = []; - for (let index of ope.indexes) { - ope.__indexes.push(this.evaluateContent(index)); - } - return ope.__indexes; - } - evaluateNext(ope) { if (typeof ope.next === 'undefined') { return 0; @@ -822,6 +882,9 @@ module.exports = class Expression { const cType = '\x1B[38;5;76m'; const cProp = '\x1B[38;5;250m'; const cValue = '\x1B[38;5;40m'; + if (op instanceof ExpressionItem) { + return op.dump({cType, cProp, cValue}); + } switch (op.type) { case OP_VALUE: return `${cType}VALUE ${cValue}${op.value}`; @@ -839,7 +902,7 @@ module.exports = class Expression { } return `${cType}RUNTIME${props}`; } - return `\x1B[1;31m¿¿${op.type}??\x1B[0m`; + return `\x1B[1;31m¿¿${op.constructor.name ?? op.type}??\x1B[0m`; } // TODO: cache of next instanceNext(next) { @@ -885,6 +948,8 @@ module.exports = class Expression { return res; } operandToString(ope, pos, pprec, options) { + return ope.dump(); +/* switch (ope.type) { case OP_VALUE: @@ -910,7 +975,7 @@ module.exports = class Expression { return `RUNTIME{${ope.op}(${ope.name??''})}`; //console.log(ope); - } + }*/ } pack(container, options) { diff --git a/src/expression_factory.js b/src/expression_factory.js new file mode 100644 index 0000000..f3b136c --- /dev/null +++ b/src/expression_factory.js @@ -0,0 +1,60 @@ +const util = require('util'); +const {cloneDeep} = require('lodash'); +const Expression = require("./expression.js"); +const {Reference, IntValue} = require("./expression_items.js"); +const Router = require("./router.js"); +const {assert, assertLog} = require('./assert'); +module.exports = class ExpressionFactory { + + static router = new Router(this, 'op', {defaultPrefix: 'from', pre: (method, obj) => delete obj.op}); + static fromObject(obj) { + if (obj instanceof Expression) { + return obj; + } + console.log(obj); + assert(typeof obj === 'object'); + assert(obj.type == 'expr'); + obj = {...obj}; + delete obj.type; + + assert(obj.op !== 'object' && obj.op !== 'objects'); + if (obj.dim === 0) delete obj.dim; + if (obj.next === 0 || obj.next === false) delete obj.next; + + let item = ExpressionFactory.router.go(obj); + + let unknownProperties = []; + for (const prop in obj) { + if (prop.startsWith('__')) continue; + if (prop === 'debug') continue; + unknownProperties.push(prop); + } + + if (unknownProperties.length > 0) { + console.log(obj); + throw new Error(`Invalid properties: ${unknownProperties.join(',')} on ${obj.debug}`); + } + let expr = new Expression(); + expr._set(item); + return expr; + } + static fromObjects(objs) { + let expressions = []; + for (const obj of objects) { + expressions.push(ExpressionFactory.fromObject(obj)); + } + return expressions; + } + static fromReference(obj) { + let res = new Reference(obj.name, obj.indexes ?? []); + delete obj.name; + delete obj.indexes; + delete obj.dim; + return res; + } + static fromNumber(obj) { + let res = new IntValue(obj.value); + delete obj.value; + return res; + } +} diff --git a/src/expression_items.js b/src/expression_items.js new file mode 100644 index 0000000..c178c86 --- /dev/null +++ b/src/expression_items.js @@ -0,0 +1,37 @@ +const ExpressionItem = require("./expression_items/expression_item.js") +const ExpressionReference = require("./expression_items/expression_reference.js"); +const FeValue = require("./expression_items/fe_value.js"); +const FixedCol = require("./expression_items/fixed_col.js"); +const IntValue = require("./expression_items/int_value.js"); +const ProofItem = require("./expression_items/proof_item.js"); +const Proofval = require("./expression_items/proofval.js"); +const Public = require("./expression_items/public.js"); +const Publictable = require("./expression_items/publictable.js"); +const Reference = require("./expression_items/reference.js"); +const RuntimeItem = require("./expression_items/runtime_item.js"); +const StackItem = require("./expression_items/stack_item.js"); +const StringValue = require("./expression_items/string_value.js"); +const Subproofval = require("./expression_items/subproofval.js"); +const ValueItem = require("./expression_items/value_item.js"); +const WitnessCol = require("./expression_items/witness_col.js"); +const ArrayOf = require("./expression_items/array_of.js"); + +module.exports = { + ExpressionItem, + ExpressionReference, + FeValue, + FixedCol, + IntValue, + ProofItem, + Proofval, + Public, + Publictable, + Reference, + RuntimeItem, + StackItem, + StringValue, + Subproofval, + ValueItem, + WitnessCol, + ArrayOf +} diff --git a/src/expression_items/array_of.js b/src/expression_items/array_of.js new file mode 100644 index 0000000..1fd1823 --- /dev/null +++ b/src/expression_items/array_of.js @@ -0,0 +1,15 @@ +const LabelRanges = require("../label_ranges.js"); +const RuntimeItem = require("./runtime_item.js"); + +module.exports = class ArrayOf extends RuntimeItem { + constructor (baseCls, id, type, instance) { + super(); + this.baseCls = baseCls; + this.id = id; + this.rtype = type; + this.instance = instance; + } + clone() { + return new ArrayOf(this.baseCls, this.id, this.rtype, this. instance); + } +} diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js new file mode 100644 index 0000000..2fa9a19 --- /dev/null +++ b/src/expression_items/expression_item.js @@ -0,0 +1,10 @@ +const LabelRanges = require("../label_ranges.js"); +module.exports = class ExpressionItem { + dump(options) { + return `${this.constructor.name}()`; + } + get type() { + console.log(this); + NO_USE_TYPE_PROPERTY; + } +} diff --git a/src/expression_items/expression_reference.js b/src/expression_items/expression_reference.js new file mode 100644 index 0000000..52573e1 --- /dev/null +++ b/src/expression_items/expression_reference.js @@ -0,0 +1,5 @@ +const LabelRanges = require("../label_ranges.js"); +const Sequence = require("../sequence.js"); +const RuntimeItem = require("./runtime_item.js"); +module.exports = class ExpressionReference extends RuntimeItem { +} diff --git a/src/expression_items/fe_value.js b/src/expression_items/fe_value.js new file mode 100644 index 0000000..d608876 --- /dev/null +++ b/src/expression_items/fe_value.js @@ -0,0 +1,12 @@ +const LabelRanges = require("../label_ranges.js"); +const ValueItem = require("./value_item.js"); + +module.exports = class FeValue extends ValueItem { + constructor (value = 0n) { + super(value); + } + clone() { + return new FeValue(this.value); + } + +} diff --git a/src/pil_items/fixed_col.js b/src/expression_items/fixed_col.js similarity index 90% rename from src/pil_items/fixed_col.js rename to src/expression_items/fixed_col.js index 600d16c..c405a87 100644 --- a/src/pil_items/fixed_col.js +++ b/src/expression_items/fixed_col.js @@ -1,7 +1,7 @@ const LabelRanges = require("../label_ranges.js"); const Sequence = require("../sequence.js"); -const PilItem = require("../pil_item.js"); -module.exports = class FixedCol extends PilItem { +const ProofItem = require("./proof_item.js"); +module.exports = class FixedCol extends ProofItem { constructor (id) { super(id); this.rows = 0; diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js new file mode 100644 index 0000000..b3ce3cc --- /dev/null +++ b/src/expression_items/int_value.js @@ -0,0 +1,22 @@ +const {assert, assertLog} = require('../assert.js'); +const ValueItem = require("./value_item.js"); + +module.exports = class IntValue extends ValueItem { + constructor (value = 0n) { + if (value instanceof IntValue) { + value = value.value; + } + if (typeof value === 'number') { + value = BigInt(value); + } + assertLog(typeof value === 'bigint', value); + super(value); + } + setValue(value) { + if (typeof value === 'number') { + value = BigInt(value); + } + assert(typeof value === 'bigint'); + this.value = value; + } +} diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js new file mode 100644 index 0000000..3770c04 --- /dev/null +++ b/src/expression_items/proof_item.js @@ -0,0 +1,9 @@ +const LabelRanges = require("../label_ranges.js"); +const ExpressionItem = require("./expression_item.js"); +module.exports = class ProofItem extends ExpressionItem { + constructor (id) { + super(); + this.id = id; + } +} + diff --git a/src/pil_items/proofvalue.js b/src/expression_items/proofval.js similarity index 59% rename from src/pil_items/proofvalue.js rename to src/expression_items/proofval.js index 38efd82..4f6950a 100644 --- a/src/pil_items/proofvalue.js +++ b/src/expression_items/proofval.js @@ -1,6 +1,7 @@ const LabelRanges = require("../label_ranges.js"); -const PilItem = require("../pil_item.js") -module.exports = class Proofvalue extends PilItem { +const ProofItem = require("./proof_item.js"); + +module.exports = class Proofval extends ProofItem { constructor (id) { super(id); } diff --git a/src/pil_items/public.js b/src/expression_items/public.js similarity index 60% rename from src/pil_items/public.js rename to src/expression_items/public.js index 58636d0..25bdcd4 100644 --- a/src/pil_items/public.js +++ b/src/expression_items/public.js @@ -1,6 +1,6 @@ const LabelRanges = require("../label_ranges.js"); -const PilItem = require("../pil_item.js") -module.exports = class Public extends PilItem { +const ProofItem = require("./proof_item.js"); +module.exports = class Public extends ProofItem { constructor (id) { super(id); } diff --git a/src/pil_items/publictable.js b/src/expression_items/publictable.js similarity index 58% rename from src/pil_items/publictable.js rename to src/expression_items/publictable.js index 39b33ed..450b50c 100644 --- a/src/pil_items/publictable.js +++ b/src/expression_items/publictable.js @@ -1,6 +1,6 @@ const LabelRanges = require("../label_ranges.js"); -const PilItem = require("../pil_item.js") -module.exports = class PublicTable extends PilItem { +const ProofItem = require("./proof_item.js"); +module.exports = class PublicTable extends ProofItem { constructor (id) { super(id); } diff --git a/src/expression_items/reference.js b/src/expression_items/reference.js new file mode 100644 index 0000000..c0cf663 --- /dev/null +++ b/src/expression_items/reference.js @@ -0,0 +1,11 @@ +const RuntimeItem = require("./runtime_item.js"); +module.exports = class Reference extends RuntimeItem { + constructor (name, indexes = []) { + super(); + this.name = name; + this.indexes = indexes; + } + dump(options) { + return `Reference(${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''})`; + } +} diff --git a/src/expression_items/runtime_item.js b/src/expression_items/runtime_item.js new file mode 100644 index 0000000..a15a42a --- /dev/null +++ b/src/expression_items/runtime_item.js @@ -0,0 +1,5 @@ +const LabelRanges = require("../label_ranges.js"); +const ExpressionItem = require("./expression_item.js"); +module.exports = class RuntimeItem extends ExpressionItem { +} + diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js new file mode 100644 index 0000000..9e0d6a6 --- /dev/null +++ b/src/expression_items/stack_item.js @@ -0,0 +1,16 @@ +const LabelRanges = require("../label_ranges.js"); +const ExpressionItem = require("./expression_item.js"); + +module.exports = class StackItem extends ExpressionItem { + constructor (offset) { + super(); + this.offset = offset; + } + getOffset() { + return this.offset; + } + setOffset(value) { + this.offset = value; + return value; + } +} diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js new file mode 100644 index 0000000..d0f033b --- /dev/null +++ b/src/expression_items/string_value.js @@ -0,0 +1,18 @@ +const {assert, assertLog} = require("../assert.js"); +const RuntimeItem = require("./runtime_item.js"); + +module.exports = class StringValue extends RuntimeItem { + constructor (value = '') { + super(); + assertLog(typeof value === 'string', value); + this.value = value; + } + getValue() { + return this.value; + } + setValue(value) { + assert(typeof value === 'string') + this.value = value; + return this.value; + } +} diff --git a/src/pil_items/subproofvalue.js b/src/expression_items/subproofval.js similarity index 58% rename from src/pil_items/subproofvalue.js rename to src/expression_items/subproofval.js index c031123..7781268 100644 --- a/src/pil_items/subproofvalue.js +++ b/src/expression_items/subproofval.js @@ -1,6 +1,6 @@ const LabelRanges = require("../label_ranges.js"); -const PilItem = require("../pil_item.js") -module.exports = class Subproofvalue extends PilItem { +const ProofItem = require("./proof_item.js"); +module.exports = class Subproofval extends ProofItem { constructor (id) { super(id); } diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js new file mode 100644 index 0000000..bb9fa16 --- /dev/null +++ b/src/expression_items/value_item.js @@ -0,0 +1,18 @@ +const LabelRanges = require("../label_ranges.js"); +const ExpressionItem = require("./expression_item.js"); + +module.exports = class ValueItem extends ExpressionItem { + constructor (value) { + super(); + this.value = value; + } + getValue() { + return this.value; + } + setValue(value) { + this.value = value; + } + dump() { + return `${this.constructor.name}(${this.value})`; + } +} diff --git a/src/pil_items/witness_col.js b/src/expression_items/witness_col.js similarity index 64% rename from src/pil_items/witness_col.js rename to src/expression_items/witness_col.js index eed7065..d6f80b7 100644 --- a/src/pil_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,6 +1,6 @@ const LabelRanges = require("../label_ranges.js"); -const PilItem = require("../pil_item.js") -module.exports = class WitnessCol extends PilItem { +const ProofItem = require("./proof_item.js"); +module.exports = class WitnessCol extends ProofItem { constructor (id, stage = 1) { super(id); this.stage = stage; diff --git a/src/expression_legacy.js b/src/expression_legacy.js new file mode 100644 index 0000000..c7adbac --- /dev/null +++ b/src/expression_legacy.js @@ -0,0 +1,1199 @@ +const util = require('util'); +const {cloneDeep} = require('lodash'); +const {assert} = require("chai"); +const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); +const PilItem = require('./pil_item.js'); + +const OP_VALUE = 0; +const OP_ID_REF = 1; +const OP_STACK = 2; +const OP_RUNTIME = 3; +const NATIVE_REFS = ['witness', 'fixed', 'public', 'challenge', 'subproofvalue', 'proofvalue', 'publictable']; +const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; +const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; + +class ExpressionStackEvaluating {}; +class InstanceArray extends Error {}; +module.exports = class Expression { + + // op (string) + // operands (array) + + // op_type --> (OP_CONST, OP_NAME_REF, OP_ID_REF, OP_STACK) + // name (string) + // indexes (array) --> be carrefull with clone + // value (bingint) + // offset (number) + + static parent; + // TODO: add all operations as if, + static operations = { + mul: { type: 'arith', label: '*', prec: 96, args: 2, handle: (a, b) => a * b, handleFr: (Fr, a, b) => Fr.mul(a, b)}, + add: { type: 'arith', label: '+', prec: 10, args: 2, handle: (a, b) => a + b, handleFr: (Fr, a, b) => Fr.add(a, b)}, + sub: { type: 'arith', label: '-', prec: 11, args: 2, handle: (a, b) => a - b, handleFr: (Fr, a, b) => Fr.sub(a, b)}, + pow: { type: 'arith', label: '**', prec: 98, args: 2, handle: (a, b) => a ** b, handleFr: (Fr, a, b) => Fr.pow(a, b)}, + neg: { type: 'arith', label: '-', prec: 102, args: 1, handle: (a) => -a, handleFr: (Fr, a) => Fr.neg(a, b)}, + div: { type: 'arith', label: '/', prec: 94, args: 2, handle: (a, b) => a / b}, + mod: { type: 'arith', label: '%', prec: 92, args: 1, handle: (a, b) => a % b}, + gt: { type: 'cmp', label: '>', prec: 76, args: 2, handle: (a, b) => (a > b ? 1n : 0n)}, + ge: { type: 'cmp', label: '>=', prec: 72, args: 2, handle: (a, b) => (a >= b ? 1n : 0n)}, + lt: { type: 'cmp', label: '<', prec: 78, args: 2, handle: (a, b) => (a < b ? 1n : 0n)}, + le: { type: 'cmp', label: '<=', prec: 74, args: 2, handle: (a, b) => (a <= b ? 1n : 0n)}, + eq: { type: 'cmp', label: '==', prec: 66, args: 2, handle: (a, b) => (a == b ? 1n : 0n)}, + ne: { type: 'cmp', label: '!=', prec: 64, args: 2, handle: (a, b) => (a != b ? 1n : 0n)}, + and: { type: 'logical', label: '&&', prec: 46, args: 2, handle: (a, b) => (a && b ? 1n : 0n)}, + or: { type: 'logical', label: '||', prec: 44, args: 2, handle: (a, b) => (a || b ? 1n : 0n)}, + shl: { type: 'bit', label: '<<', prec: 86, args: 2, handle: (a, b) => (a << b ? 1n : 0n)}, + shr: { type: 'bit', label: '>>', prec: 84, args: 2, handle: (a, b) => (a >> b ? 1n : 0n)}, + band: { type: 'bit', label: '&', prec: 58, args: 2, handle: (a, b) => (a & b ? 1n : 0n)}, + bor: { type: 'bit', label: '|', prec: 56, args: 2, handle: (a, b) => (a | b ? 1n : 0n)}, + bxor: { type: 'bit', label: '^', prec: 54, args: 2, handle: (a, b) => (a ^ b ? 1n : 0n)}, + not: { type: 'logical', label: '!', prec: 100, args: 1, handle: (a) => (a ? 0n : 1n)}, + } + + constructor () { + this.stack = []; + this.fixedRowAccess = false; + } + + static setParent (parent) { + Expression.parent = parent; + } + + clone() { + let cloned = new Expression(); + cloned.fixedRowAccess = this.fixedRowAccess; + cloned.pushStack(this); + return cloned; + } + + pushStack(e) { + if (!(e instanceof Expression)) { + throw new Error(`pushStack parameter must be an Expression`); + } + const count = e.stack.length; + for (let index = 0; index < count; ++index) { + this.stack.push(this.cloneDeep(e.stack[index], 'pushStack')); + } + return count; + } + + cloneDeep(e, label = '') { + const res = cloneDeep(e); + return res; + } + + next(dnext) { + for (let stack of this.stack) { + for (let ope of stack.operands) { + switch (ope.type) { + case OP_VALUE: + case OP_STACK: + break; + case OP_ID_REF: + const pnext = Number(ope.next); + ope.next = ope.next ? pnext + Number(dnext) : Number(dnext); + break; + case OP_RUNTIME: + throw new Error(`Instance first do next operation`); + } + } + } + } + insertStack(e, pos) { + const delta = e.stack.length; + for (let index = pos; index < this.stack.length; ++index) { + for (const ope of this.stack[index].operands) { + if (ope.type === OP_STACK && (index - ope.offset) < pos) { + ope.offset += delta; + } + } + } + for (let index = this.stack.length - 1; index >= pos; --index) { + this.stack[index + delta] = this.stack[index]; + } + for (let index = 0; index < delta; ++index) { + this.stack[index + pos] = this.cloneDeep(e.stack[index]); + } + this.fixedRowAccess = this.fixedRowAccess || e.fixedRowAccess; + return 1; + } + cloneOperand(operator) { + return cloneDeep(operator); + } + + cloneAlone() { + return this.cloneOperand(this.stack[0].operands[0]); + } + + isAlone () { + return this.stack.length === 1 && this.stack[0].op === false; + } + pushAloneIndex(index) { + assert(this.isAlone()); + let operand = this.getAloneOperand(); + if (typeof operand.indexes === 'undefined') { + operand.indexes = []; + operand.__indexes = []; + operand.dim = 0; + } + operand.indexes.push(index); + operand.__indexes.push(index); + ++operand.dim; + } + popAloneIndex() { + assert(this.isAlone()); + let operand = this.getAloneOperand(); + --operand.dim; + operand.indexes.pop(); + return operand.__indexes.pop(); + } + getAloneOperand () { + return this.stack[0].operands[0]; + } + cloneAloneOperand () { + return cloneDeep(this.getAloneOperand()); + } + + isReference () { + // TODO: review if best place? + // TODO: review if next/prior + return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference' ); + } + + // OP_VALUE (value) + // OP_ID_REF (id, refType, next) refType = [im,witness,fixed,prover,public,((expression))] At end need to calculate next of expression + // OP_STACK (offset) NOTE: absolute_index = current_index - offset; + // OP_RUNTIME (data) + + _set (operand) { + if (this.stack.length) { + throw new Error(`Set only could be used with empty stack`); + } + this.stack.push({op: false, operands: [cloneDeep(operand)]}); + } + + setIdReference (id, refType, next) { + assert(typeof refType === 'string'); + this._set({type: OP_ID_REF, id, refType, next}); + } + + setValue (value) { + if (typeof value === 'object') { + throw new Error(`object(${value.constructor.name}) as value not allowed`); + } + this._set({type: OP_VALUE, value}); + } + + setRuntime (value) { + if (value.type) { + throw new Error(`setRuntime value has a not allowed type property`); + } + this._set({type: OP_RUNTIME, ...value}); + } + + isRuntime () { + return this.stack.some(st => this.isRuntimeStackPos(st)); + } + isRuntimeStackPos(st) { + return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(ope => this.isRuntimeOperand(ope))); + } + isRuntimeOperand(ope) { + return (ope.type === OP_RUNTIME); + } + insertOne (op, b) { + const aIsEmpty = this.stack.length === 0; + const bIsEmpty = b.stack.length === 0; + + if (bIsEmpty) { + throw new Error(`insert without operands`); + } + const aIsAlone = this.isAlone(); + const bIsAlone = b.isAlone(); + if (bIsAlone) { // aIsAlone => !aIsEmpty + if (aIsAlone) { + this.stack[0].op = op; + this.stack[0].operands.push(b.cloneAlone()); + return this; + } + let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; + this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); + return this; + } + + // !aIsAlone (aIsEmpty?) && !bIsAlone + const count = this.pushStack(b); + if (aIsEmpty) { + this.stack.push({op, operands: [{type: OP_STACK, offset: 1}]}); + return this; + } + this.stack.push({op, operands: [{type: OP_STACK, offset: count + 1}, {type: OP_STACK, offset: 1}]}); + return this; + } + + insert (op, ...bs) { + if (bs.length === 1) { + return this.insertOne(op, bs[0]); + } + const anyEmptyB = bs.some((b) => b.stack.length === 0); + const aIsEmpty = this.stack.length === 0; + + // this.runtime = this.runtime || NATIVE_OPS.indexOf(op) < 0 || bs.some((b) => b.runtime); + + if (anyEmptyB) { + throw new Error(`insert without operands`); + } + const aIsAlone = this.isAlone(); + const allBsAreAlone = bs.reduce((res, b) => res && b.isAlone(), true); + + let elem = {op, operands: []}; + if (aIsAlone && allBsAreAlone) { + this.stack[0].op = op; + for (const b of bs) { + this.stack[0].operands.push(b.cloneAlone()); + } + return this; + } + + let counts = []; + for (const b of bs) { + counts.push(b.isAlone() ? 0 : this.pushStack(b)); + } + counts.push(1); + for (let index = counts.length - 2; index >= 0; --index) { + counts[index] += counts[index + 1]; + } + + if (!aIsEmpty) { + elem = {op, operands: [{type: OP_STACK, offset: counts[0]}]}; + } + let index = 0; + for (const b of bs) { + elem.operands.push(b.isAlone() ? b.cloneAlone() : {type: OP_STACK, offset: counts[++index]}); + } + this.stack.push(elem); + return this; + } + evaluateAloneReference() { + assert(this.isAlone()); + let operand = this.getAloneOperand(); + if (operand.type === OP_RUNTIME || operand.op === 'reference') { + const res = this.evaluateRuntime(operand, true); + if (!(res instanceof Expression)) { + operand.__value = res; + } + } + return operand.__value; + } + evaluateOperandValue(ope, pos, deeply, instance = false) { + console.log(deeply); + console.log(ope); + + if (deeply) { + if (ope.type === OP_STACK) { + const stackPos = pos-ope.offset; + this.evaluateStackPosValue(stackPos); // TODO: cache and infinite-loops + ope.__value = this.stack[stackPos].__value; + } + } else if (ope.type === OP_VALUE ) { + ope.__value = ope.value; + + } else if (ope.type === OP_ID_REF ) { + ope.__value = new NonRuntimeEvaluable(); + + } else if (ope.type === OP_RUNTIME ) { + let res = this.evaluateRuntime(ope, deeply); + console.log(res); + console.log(instance); + // BUG: if type was an expression not apply value !! + // if (!(res instanceof Expression)) { + if (instance) { + console.log(res); + if (res instanceof Expression && res.isAlone()) { + res = res.getAloneOperand(); + } + console.log(res); + if (res instanceof Expression) { + res.dump(); + console.log(ope); + ope.__value = res; + } else { + assert(!(res instanceof Expression)); + Object.keys(ope).forEach(key => delete ope[key]); + if (typeof res === 'bigint') { + ope.type = OP_VALUE; + ope.value = res; + delete ope.op; + } else { + if (res.value) { + res = res.value; + } + if (res.refType) { + console.log(res); + // assert(NATIVE_REFS.includes(res.type)); + assert(NATIVE_REFS.includes(res.refType)); + ope.type = OP_ID_REF; + ope.refType = res.refType; + ope.id = res.id; + if (res.next) ope.next = res.next; + assert(typeof ope.id === 'number'); + delete ope.op; + } else if (res.array) { + throw new InstanceArray(); + } else { + console.log(res); + EXIT_HERE; + } + } + } + } else { + ope.__value = res; + } + } + } + assertInstanced() { + try { + for (let ist = 0; ist < this.stack.length; ++ist) { + const st = this.stack[ist]; + assert(VALID_NATIVE_OPS.includes(st.op), `invalid operation ${st.op} on stackpos ${ist}`); + for (let iope = 0; iope < st.operands.length; ++iope) { + const ope = st.operands[iope]; + const ref = `operand #${iope} of stackpos ${ist}`; + assert([OP_STACK, OP_VALUE, OP_ID_REF].includes(ope.type), `${ref} has invalid type ${ope.type}`); + switch (ope.type) { + case OP_STACK: + assert(typeof ope.offset === 'number', `invalid offset type (${typeof ope.offset}) on ${ref}`); + assert(ope.offset > 0, `invalid offset value (${ope.offset}) on ${ref}`); + break; + + case OP_VALUE: + assert(typeof ope.value === 'bigint', `invalid value type (${typeof ope.offset}) on ${ref}`); + break; + + case OP_ID_REF: + assert(NATIVE_REFS.includes(ope.refType), `invalid refType (${ope.refType}) on ${ref}`) + assert(typeof ope.id === 'number', `invalid ope.id type (${typeof ope.id}) on ${ref}`); + break; + + } + if (ope.indexes) { + const indexesType = typeof ope.indexes; + assert(indexesType === 'array', `${ref} has invalid indexes type ${indexesType}`); + for (let index = 0; index < ope.indexes.length; ++index) { + const indexType = typeof ope.indexes[index]; + assert(indexType === 'number', `${ref} has invalid index[${index}] type ${indexType}`); + } + } + } + } + } catch (e) { + this.dump(); + throw e; + } + } + evaluateRuntime(op, deeply = false) { + let res = Expression.parent.evalRuntime(op, this, deeply); + return res; + } + instanceValues() { + for (let se of this.stack) { + for (let index = 0; index < se.operands.length; ++index) { + if (se.operands[index].type !== OP_RUNTIME) continue; + const value = se.operands[index].__value; + if (typeof value === 'bigint') { + se.operands[index] = {type: OP_VALUE, value: value}; + continue; + } + if (typeof value === 'object' && value.type && + ['constant','witness', 'fixed', 'im', 'public', 'expr', 'challenge','subproofvalue', 'proofvalue'].includes(value.type)) { + let ope = {}; + if (value.array) { + // incomplete reference, is a subarray. + ope.type = OP_RUNTIME; + ope.array = value.array; + ope.op = 'idref'; + } else { + ope.type = OP_ID_REF; + ope.array = false; + } + if (typeof value.value === 'undefined' || value.value === null) { + ope.id = value.id; + } else { + ope.id = typeof value.value === 'object' ? value.value.id : value.value; + } + assert(typeof value.type === 'string'); + ope.refType = value.type; + if (value.next) ope.next = value.next; + if (value.prior) ope.next = value.prior; + if (typeof value.row !== 'undefined') { + ope.row = value.row; + } + se.operands[index] = ope; + continue; + } + console.log(value); + console.log(se.operands[index]); +// value.dump(); + throw new Error('Invalid value'); + } + } + } + getReference() { + if (!this.isAlone()) { + throw new Error(`Invalid expression by reference`); + } + let dope = this.cloneAloneOperand(); + if (dope.next || dope.prior) { + throw new Error(`Invalid expression by reference`); + } + this.evaluateIndexes(dope); + return dope; + } + isArray() { + // only a reference could be and array. + if (!this.isReference() || this.stack[0].operands[0].next || this.stack[0].operands[0].prior) return false; + + let ref = this.getReference(); + console.log(ref); + EXIT_HERE; + + } + _instance() { + let dup = this.clone(); + const options = {instance: true} + let stackResults = dup._evaluateOperands(options); + dup._extendExpressions(options); + dup._evaluteFullStack(stackResults, options); + } + _evaluate(value, options) { + // stack references not replaced + // expression references not extended (inserted) + } + _evaluates(values, options) { + // do array of evaluates, for example to evaluate + // indexes o call arguments, this method call n times + // evaluations + if (typeof values === 'undefined') { + return 0; + } + assert (Array.isArray(values)); + let result = []; + for (const value of values) { + result.push(this._evaluate(value, options)); + } + return result; + } + getArrayResult(results, indexes, options) { + // this method take one of results using indexes + } + _evaluateOperands(options) { + // evaluation must be from left to right (l2r) operands, inside operand + // also evaluation is l2r: prior, value, arguments (l2r), indexes (l2r) + // at end of this operand evaluation, must manage increment/decrement + // options. + + // stackResults is used to store operand evaluations needed by full stack + // evaluation. + + let stackResults = []; + for (let stpos = 0; stpos < this.stack.length; ++stpos) { + if (!options.instance) { + // prepare stack of results + stackResults.push([]); + } + for (let ope of this.stack[stpos].operands) { + let next = 0; + // if no prior defined priorValue was 0 + let priorValue = this._evaluate(ope.prior, options); + + let result = this._evaluateOperandValue(ope, stackResults, options); + let indexes = this._evaluates(ope.indexes, options); + if (indexes.length) { + // TODO: fixed access + result = this.getArrayResult(result, indexes, options); + } + // if no prior defined nextValue was 0 + let nextValue = this._evaluate(ope.next, options); + + // prior and next are excl + if (priorValue && nextValue) { + throw new Error(`prior and next for same operand it's ambiguous`); + } + next = nextValue - priorValue; + if (!options.instance) { + // store operand result + stackResults[stpos].push([]); + } + } + } + } + evaluateOperandValue(ope, pos, deeply, instance = false) { + console.log(deeply); + console.log(ope); + + if (deeply) { + if (ope.type === OP_STACK) { + const stackPos = pos-ope.offset; + this.evaluateStackPosValue(stackPos); // TODO: cache and infinite-loops + ope.__value = this.stack[stackPos].__value; + } + } else if (ope.type === OP_VALUE ) { + ope.__value = ope.value; + + } else if (ope.type === OP_ID_REF ) { + ope.__value = new NonRuntimeEvaluable(); + + } else if (ope.type === OP_RUNTIME ) { + let res = this.evaluateRuntime(ope, deeply); + console.log(res); + console.log(instance); + // BUG: if type was an expression not apply value !! + // if (!(res instanceof Expression)) { + if (instance) { + console.log(res); + if (res instanceof Expression && res.isAlone()) { + res = res.getAloneOperand(); + } + console.log(res); + if (res instanceof Expression) { + res.dump(); + console.log(ope); + ope.__value = res; + } else { + assert(!(res instanceof Expression)); + Object.keys(ope).forEach(key => delete ope[key]); + if (typeof res === 'bigint') { + ope.type = OP_VALUE; + ope.value = res; + delete ope.op; + } else { + if (res.value) { + res = res.value; + } + if (res.refType) { + console.log(res); + // assert(NATIVE_REFS.includes(res.type)); + assert(NATIVE_REFS.includes(res.refType)); + ope.type = OP_ID_REF; + ope.refType = res.refType; + ope.id = res.id; + if (res.next) ope.next = res.next; + assert(typeof ope.id === 'number'); + delete ope.op; + } else if (res.array) { + throw new InstanceArray(); + } else { + console.log(res); + EXIT_HERE; + } + } + } + } else { + ope.__value = res; + } + } + } + instance(simplify = false) { + let dup = this.clone(); + try { + dup.dump(); + dup.evaluateOperands(true, true); + dup.instanceExpressions(); + dup.dump(); + const top = dup.stack.length-1; + dup.evaluateStackPosValue(top, true); + dup.instanceValues(); + if (simplify) { + console.log('=== SIMPLIFY ==='); + dup.dump(); + dup.simplify(); + dup.assertInstanced(); + dup.dump(); + } + dup.dump(); + } catch (e) { + // It isn't possible instance an array, because not was an expression, it's an + // array of expressions + if (e instanceof InstanceArray) { + throw new Error('Instancing an array'); + } + throw e; + } + return dup; + } + eval(deeply = false) { + if (this.stack.length === 0) { + return this; + } + if (this.stack[0].op === false) { + delete this.stack[0].operands[0].__value; + } + this.evaluateOperands(deeply); + this.evaluateStackPosValue(this.stack.length-1); + return this.stack[this.stack.length-1].__value ?? this; + } + evaluateStackPosValue(pos, instance = false) { + const st = this.stack[pos]; + + this.evaluateStackPosOperands(pos, true, instance); + + delete st.__value; + const res = this.calculate(st); + if (res !== null) { + st.__value = res; + } + } + _calculate(st, pos, stackResults) { + if (st.op === false) { + return stackResults[pos][0]; + } + + if (st.operands.some((x, index) => (typeof x === 'object' && x.type !== OP_VALUE && typeof stackResults[pos][index] !== 'bigint'))) { + return null; + } + + const opfunc = Expression.operations[st.op] ?? false; + if (opfunc === false) { + throw new Error(`NOT FOUND OPERATION (${st.op})`); + } + + try { + return opfunc.handle.apply(this, stackResults[pos]); + } catch (e) { + console.log([{op: st.op},...stackResults[pos]]); + throw e; + } + } + + calculate(st) { + if (st.op === false) { + return st.operands[0].__value; + } + + if (st.operands.some(x => (typeof x === 'object' && x.type !== OP_VALUE && typeof x.__value !== 'bigint'))) { + return null; + } + + const opfunc = Expression.operations[st.op] ?? false; + if (opfunc === false) { + throw new Error(`NOT FOUND OPERATION (${st.op})`); + } + + const values = st.operands.map(x => x.type === 0 ? x.value : x.__value); + try { + return opfunc.handle.apply(this, values); + } catch (e) { + console.log([{op: st.op},...values]); + throw e; + } + } + isRuntimeCalculable(e) { + const te = typeof e; + if (te === 'string' || te === 'number' || te === 'bigint' /* || te === 'fe' */) { + return true; + } + if (te === 'object' && e.type) { + if (e.type === 'witness' && e.type === 'fixed') return false; + } + } + // this method instance the expression references to include them inside + // TODO: view how these affects to optimization. + instanceExpressions() { + let pos = 0; + while (pos < this.stack.length) { + let nextPos = true; + for (let ope of this.stack[pos].operands) { + // assert(ope.__value instanceof Expression === false); + if (ope.type !== OP_RUNTIME) continue; + console.log(ope); + if (ope.__value instanceof Expression) { + ope.type = OP_STACK; + const exprToInsert = ope.__value.instance(); + const next = typeof ope.next === 'number' ? ope.next : ope.__next; + if (next) exprToInsert.next(next); + ope.offset = this.insertStack(exprToInsert, pos); + nextPos = false; + break; + } + if (typeof ope.__value !== 'undefined' && !(ope.__value instanceof NonRuntimeEvaluable)) continue; + + // TODO: twice evaluations, be carefull double increment evaluations,etc.. + const res = this.evaluateRuntime(ope); + if (res.value && res.value.type === OP_ID_REF) { + ope.type = OP_ID_REF; + ope.refType = res.refType; + ope.id = res.id; + } else if (res instanceof Expression) { + ope.type = OP_STACK; + const exprToInsert = res.instance(); + const next = typeof ope.next === 'number' ? ope.next : ope.__next; + if (next) exprToInsert.next(next); + ope.offset = this.insertStack(exprToInsert, pos); + nextPos = false; + break; + } + } + if (nextPos) ++pos; + } + } + simplify() { + let loop = 0; + while (this.stack.length > 0) { + let updated = false; + for (const st of this.stack) { + updated = this.simplifyOperation(st) || updated; + } + this.compactStack(); + if (!updated) break; + } + } + simplifyRuntimeToValue(st) { + for (let index = 0; index < st.operands.length; ++index) { + const value = st.operands[index].__value; + if (['string', 'number', 'bigint'].includes(value)) { + st.operands[index] = {type: OP_VALUE, value}; + } + } + } + + // this method simplify trivial operations as 0 + x or 1 * x, also + // simplify operations between values, not only direct values also + // referenced and solved values (as runtime variable) + + simplifyOperation(st) { + if (st.op === false || st.operands.length > 2) { + return false; + } + + this.simplifyRuntimeToValue(st); + const firstValue = st.operands[0].type === OP_VALUE ? st.operands[0].value : false; + const secondValue = (st.operands.length > 1 && st.operands[1].type === OP_VALUE) ? st.operands[1].value : false; + + // [op,v1,v2] ==> [v1 op v2] + if (firstValue !== false && secondValue !== false) { + assert(!firstValue || (!firstValue.next && !firstValue.__next)); + assert(!secondValue || (!secondValue.next && !secondValue.__next)); + const res = this.calculate(st); + if (res === null) return false; + st.operands = [{type: OP_VALUE, value: res}]; + st.op = false; + delete st.__value; + delete st.__indexes; + delete st.__next; + return true; + } + + // [neg,value] ==> [false,-value] + if (st.op === 'neg' && firstValue !== false) { + assert(!firstValue.next && !firstValue.__next); + st.op = false; + st.operands[0].value = -st.operands[0].value; + return true; + } + + const firstZero = firstValue === 0n; + + if (firstZero || secondValue === 0n) { + // [mul, 0, x] ==> [0] + // [mul, x, 0] ==> [0] + if (st.op === 'mul') { + st.op = false; + st.operands = [st.operands[firstZero ? 0:1]]; + return true; + } + // [add, 0, x] ==> [x] + // [add, x, 0] ==> [x] + if (st.op === 'add') { + st.op = false; + st.operands = [st.operands[firstZero ? 1:0]]; + return true; + } + + // [sub, x, 0] ==> [x] + if (st.op === 'sub' && !firstZero) { + st.op = false; + return true; + } + } + + const firstOne = firstValue === 1n; + + // [mul, 1, x] ==> [x] + // [mul, x, 1] ==> [x] + if (st.op === 'mul' && (firstOne || secondValue === 1n)) { + st.op = false; + st.operands = [st.operands[firstOne ? 1:0]]; + return true; + } + + // TODO: be carrefull with next, prior, inc, dec + // x - x = 0 ??? + // (x - (- y)) = x + y + // (x + (- y)) = x - y + // v1 * x + v2 * x = (v1+v2) * x + // v1 * x - v2 * x = (v1-v2) * x + + // TODO: binary cols optimizations, each kind of optimization has a key to enable/disable + // this specific optimization. + // BC(y) ==> y * x + (1 - y) * z = y * (z - x) + x + + + // TODO: evaluate all expressions with different prime values (valid values as binary constraints 🤔) + // detect same expressions (as bigints or as fe, bigints same implies fe same 🤔). + // After, check matchs with other 100% sure method. + + return false; + } + + // this method compact stack positions with one element where operation + // was false, replace reference of this stack operation by directly value + compactStack() { + let translate = []; + let stackPos = 0; + let stackLen = this.stack.length; + for (let istack = 0; istack < stackLen; ++istack) { + const st = this.stack[istack]; + if (st.op === false) { + const ope = st.operands[0]; + // two situations, for alone stack reference, use its reference and it must + // be purged + translate[istack] = ope.type === OP_STACK ? [true, translate[istack - ope.offset][1]] : [true, istack]; + continue; + } + + translate[istack] = [false, stackPos++]; + + // foreach operand if it's a stack reference, must be replaced by + // new reference or by copy of reference if it was alone (no operation) + for (let iope = 0; iope < st.operands.length; ++iope) { + if (st.operands[iope].type !== OP_STACK) continue; + const absolutePos = istack - st.operands[iope].offset; + const [purge, newAbsolutePos] = translate[absolutePos]; + assert(absolutePos < istack); + if (purge && this.stack[newAbsolutePos].op === false) { + // if purge and referenced position was alone, it is copied (duplicated) + this.stack[istack].operands[iope] = cloneDeep(this.stack[newAbsolutePos].operands[0]); + } else { + // stackPos - 1 is new really istack after clear simplified stack positions + // calculate relative position (offset) + const newOffset = (stackPos - 1) - newAbsolutePos; + assert(newOffset > 0); + this.stack[istack].operands[iope].offset = newOffset; + } + } + + } + // DEBUG: + translate.forEach((value, index) => console.log(`#${index} => ${value}`)); + + // move stackpositions to definitive positions, from end to begin to avoid + // overwriting, updating last position used to remove rest of stack positions + let lastPosUsed = false; + for (let istack = 0; istack < stackLen; ++istack) { + const [purge, absoluteNewPos] = translate[istack]; + if (purge) continue; + + this.stack[absoluteNewPos] = this.stack[istack]; + lastPosUsed = absoluteNewPos; + } + if (lastPosUsed !== false) { + this.stack.splice(lastPosUsed + 1); + } else { + // all stack positions must be removed, but at least need position #0 + this.stack.splice(1); + } + + // return if expression was updated + return stackLen > this.stack.length; + } + evaluateOperands(deeply = false, instance = false) { + for (let index = 0; index < this.stack.length; ++index) { + this.evaluateStackPosOperands(index, deeply, instance); + } + } + evaluateStackPosOperands(pos, deeply, instance = false) { + console.log([this.stack, pos]); + for (let ope of this.stack[pos].operands) { + this.evaluateOperand(ope, pos, deeply, instance); + } + } + evaluateOperand(ope, pos, deeply, instance = false) { + if (!deeply) { + this.clearNext(ope); + this.evaluatePrior(ope); + this.evaluateIndexes(ope); + this.evaluateNext(ope); + // TODO: for optimizations + if (instance) { + // indexes not exists when instanced !!! + ope.next = ope.__next; + delete ope.__next; + } + } + this.evaluateOperandValue(ope, pos, deeply, instance); + if (instance) { + delete ope.indexes; + delete ope._indexes; + } + } + + clearNext(ope) { + ope.__next = 0; + } + evaluatePrior(ope) { + if (typeof ope.prior === 'undefined') { + return 0; + } + ope.__next = -this.evaluateContent(ope.prior); + return ope.__next; + } + + evaluateIndexes(ope) { + if (typeof ope.indexes === 'undefined') { + return []; + } + ope.__indexes = []; + for (let index of ope.indexes) { + ope.__indexes.push(this.evaluateContent(index)); + } + return ope.__indexes; + } + + evaluateNext(ope) { + if (typeof ope.next === 'undefined') { + return 0; + } + const nextValue = this.evaluateContent(ope.next); + if (nextValue && ope.__next !== 0) { + // it isn't possible by grammar + throw new Error(`next and prior are incompatible between them`); + } + if (nextValue) { + ope.__next = nextValue; + } + return ope.__next; + } + + evaluateContent(e) { + if (typeof e === 'bigint' || typeof e === 'number' || typeof e == 'string' || typeof e == 'boolean') { + return e; + } + if (e.op == 'reference') { + return this.evaluateReference(e); + } + if (e instanceof Expression) { + return e.eval(); + } + console.log(e); + EXIT_HERE; + } + + evaluateReference(e) { + return Expression.parent.evaluateReference(e); + } +/* evaluateRuntime(e) { + // function_call op:'call' function: arguments: + // positional_param op:'positional_param' position: + // casting op:'cast' cast: value: dim: ?? + }*/ + dump(title) { + // console.trace(); + let caller = ''; + try { + throw new Error(); + } catch (e) { + caller = e.stack.split('\n')[2].trim().substring(3); + } + title = title ? `(${title}) `:''; + console.log(`\x1B[38;5;214m|==========> DUMP ${title}${caller} <==========|\x1B[0m`); + for (let index = this.stack.length-1; index >=0; --index) { + const st = this.stack[index]; + let info =`\x1B[38;5;214m#${index} ${st.op}`; + for (const operand of st.operands) { + info = info + ' [\x1B[38;5;76m' + this.dumpOperand(operand,index)+'\x1B[38;5;214m]'; + } + console.log(info+'\x1B[0m'); + } + } + dumpOperand(op, pos) { + const cType = '\x1B[38;5;76m'; + const cProp = '\x1B[38;5;250m'; + const cValue = '\x1B[38;5;40m'; + switch (op.type) { + case OP_VALUE: + return `${cType}VALUE ${cValue}${op.value}`; + case OP_ID_REF: + // refType, [offset], next + const next = op.next ? `${cProp}next:${cValue}${op.next}`:''; + return `${cType}ID_REF ${cProp}refType:${cValue}${op.refType} ${cProp}id:${cValue}${op.id}${next}`; + case OP_STACK: + return `${cType}STACK ${cProp}pos:${cValue}${pos - op.offset}[-${op.offset}]`; + case OP_RUNTIME: + let props = '' + for (const prop in op) { + if (prop === '__yystate' || prop === 'debug' || prop === 'type') continue; + props = props + ` ${cProp}${prop}:${cValue}${op[prop]}`; + } + return `${cType}RUNTIME${props}`; + } + return `\x1B[1;31m¿¿${op.type}??\x1B[0m`; + } + // TODO: cache of next + instanceNext(next) { + let _next = this.instance(); + } + updateOperandNext(op, next) { + assert(op.type != RUNTIME); + + if (op.type === OP_ID_REF) { + op.next += next; + } + } + toString(options) { + let top = this.stack.length-1; + if (top < 0) { + return '(empty expression)'; + } + return this.stackPosToString(top ,0, options); + } + stackPosToString(pos, pprec, options) { + const st = this.stack[pos]; + if (typeof st === 'undefined') { + console.log(pos); + console.log(this.stack); + } + if (st.op === false) { + return this.operandToString(st.operands[0], pos, pprec, options); + } + const opinfo = Expression.operations[st.op]; + let res; + if (st.operands.length === 1) { + res = Expression.operations[st.op].label + this.operandToString(st.operands[0], pos, opinfo.prec, options); + + } else if (st.operands.length === 2) { + res = this.operandToString(st.operands[0], pos, opinfo.prec, options) + ' ' + Expression.operations[st.op].label + ' ' + + this.operandToString(st.operands[1], pos, opinfo.prec, options); + } else { + TODO_EXIT + } + if (pprec > opinfo.prec) { + res = '(' + res + ')'; + } + return res; + } + operandToString(ope, pos, pprec, options) { + switch (ope.type) { + + case OP_VALUE: + return ope.value.toString(); + case OP_ID_REF: + // refType, [offset], next + let res = (Expression.parent && (!options || !options.hideLabel))? Expression.parent.getLabel(ope.refType, ope.id, options) : false; + if (!res) { + res = `${ope.refType}@${ope.id}`; + } + if (ope.next < 0) res = `${ope.next==-1?'':-ope.next}'${res}`; + if (ope.next > 0) res = `${res}'${ope.next==1?'':ope.next}`; + return res; + case OP_STACK: + if ((pos - ope.offset ) < 0) { + console.log(`invalid offset ${pos - ope.offset} pos:${pos} offset:${ope.offset}`); + } + return this.stackPosToString(pos-ope.offset, pprec, options); + case OP_RUNTIME: + if (ope.op === 'reference' && ope.name) { + return `RUNTIME{${ope.name}}` + } + return `RUNTIME{${ope.op}(${ope.name??''})}`; + //console.log(ope); + + } + + } + pack(container, options) { + let top = this.stack.length-1; + return this.stackPosPack(container, top, options); + } + stackPosPack(container, pos, options) { + const st = this.stack[pos]; + if (st.op === false) { + this.operandPack(container, st.operands[0], pos, options); + return false; + } + for (const ope of st.operands) { + this.operandPack(container, ope, pos, options); + } + switch (st.op) { + case 'mul': + return container.mul(); + + case 'add': + return container.add(); + + case 'sub': + return container.sub(); + + case 'neg': + return container.neg(); + + default: + throw new Error(`Invalid operation ${st.op} on packed expression`); + } + } + + operandPack(container, ope, pos, options) { + switch (ope.type) { + case OP_VALUE: + container.pushConstant(ope.value); + break; + + case OP_ID_REF: + console.log(['PACK_OP_ID_REF',ope.refType, ope.id, ope.next]); + this.referencePack(container, ope.refType, ope.id, ope.next, options); + break; + + case OP_STACK: + // TODO: expression == false; + const eid = this.stackPosPack(container, pos-ope.offset, options); + if (eid !== false) { // eid === false => alone operand + container.pushExpression(eid); + } + break; + + default: + console.log(ope); + throw new Error(`Invalid reference ${ope.type} on packed expression`); + } + + } + referencePack(container, type, id, next, options) { + // TODO stage + switch (type) { + case 'im': + container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); + break; + + case 'witness': + container.pushWitnessCol(id, next); // TODO: stage + break; + + case 'fixed': + container.pushFixedCol(id, next); + break; + + case 'public': + container.pushPublicValue(id); + break; + + default: + throw new Error(`Invalid reference type ${type} to pack`); + } + } + resolve() { + const res = this.eval(); + if (res instanceof Expression) { + return res.instance(true); + } + return res; + } +} diff --git a/src/expressions.js b/src/expressions.js index 65cf51b..fde83b3 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -1,7 +1,7 @@ const util = require('util'); const LabelRanges = require('./label_ranges.js'); const Expression = require('./expression.js'); -const WitnessCol = require('./pil_items/witness_col.js'); +const WitnessCol = require('./expression_items/witness_col.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); module.exports = class Expressions { @@ -33,6 +33,7 @@ module.exports = class Expressions { return res; } get(id) { + console.log(this.expressions); if (this.isDefined(id)) { return this.expressions[id]; } diff --git a/src/fixed_cols.js b/src/fixed_cols.js index 4fe42e5..7af8f8f 100644 --- a/src/fixed_cols.js +++ b/src/fixed_cols.js @@ -1,45 +1,9 @@ const LabelRanges = require("./label_ranges.js"); const Indexable = require("./indexable.js"); -const FixedCol = require("./pil_items/fixed_col.js"); +const FixedCol = require("./expression_items/fixed_col.js"); module.exports = class FixedCols extends Indexable { - constructor (Fr) { - super(Fr, 'fixed'); - } - - getEmptyValue(id, index) { - return new FixedCol(id); - } - - get(id, offset) { - return this.values[id + offset] - } - - getLabel(id, options) { - return this.labelRanges.getLabel(id, options); - } - - getTypedValue(id, offset = 0) { - const res = { type: this.type, value: this.values[id + offset] }; - return res; - } - - isDefined(id) { - return (typeof this.values[id] != 'undefined') - } - - define(id, value) { - if (this.isDefined(id)) { - throw new Error(`${id} already defined on ....`) - } - this.set(id, 0, value); - } - - set(id, value, control) { - if (control) { - EXIT_HERE_ONLY_TWO_PARAMETERS; - } - // console.log([`SET@${this.type}[${id}]`, value]); - this.values[id].set(value); + constructor () { + super('fixed', FixedCol); } } diff --git a/src/function.js b/src/function.js index 9b528fb..b02754f 100644 --- a/src/function.js +++ b/src/function.js @@ -103,7 +103,10 @@ module.exports = class Function { console.log(s.arguments[iarg]); EXIT_HERE; } else { - const value = s.arguments[iarg].instance().getAloneOperand(); + // const value = s.arguments[iarg].instance().getAloneOperand(); + // const value = s.arguments[iarg].getAloneOperand(); + // const value = s.arguments[iarg].getReference(); + const value = s.arguments[iarg].evaluateAloneReference(); const dim = value.array ? value.array.dim : 0; if (dim !== argDim) { throw new Error(`Invalid array on ${this.parent.sourceRef}`); diff --git a/src/indexable.js b/src/indexable.js index 0dde9dc..3b7b977 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -1,13 +1,29 @@ const LabelRanges = require("./label_ranges.js"); +const {cloneDeep} = require('lodash'); +const {assert, assertLog} = require('./assert.js'); module.exports = class Indexable { - - constructor (Fr, type, rtype) { - this.Fr = Fr; + constructor (type, cls, rtype) { + this.cls = cls; this.values = []; this.type = type; this.rtype = rtype ?? type; this.labelRanges = new LabelRanges(); this.debug = false; + this._undefined = null; + if (this.cls) { + try { + this._undefined = new this.cls(); + } catch (e) { } + } + } + get undefined() { + if (this._undefined instanceof Object) { + return cloneDeep(this._undefined); + } + return this._undefined; + } + getEmptyValue(id) { + return this.undefined; } dup() { @@ -22,9 +38,6 @@ module.exports = class Indexable { getType(id) { return this.rtype; } - getEmptyValue(id) { - return null; - } reserve(count, label, multiarray) { const id = this.values.length; for (let index = 0; index < count; ++index) { @@ -39,13 +52,13 @@ module.exports = class Indexable { } return id; } - get(id) { - const res = this.values[id] ?? this.undefined; - /* if (typeof res === 'number') { - console.log([id, this.type, res]); - throw new Error('Invalid value'); - }*/ + let res = this.values[id]; + if (typeof res === 'undefined') { + res = this.undefined; + } else { + assertLog(!this.cls || res instanceof this.cls, [this.cls.constructor.name, res]); + } if (this.debug) { console.log(`GET ${this.constructor.name}.${this.type} @${id} ${res}`); } @@ -57,8 +70,9 @@ module.exports = class Indexable { } getTypedValue(id) { - const res = { type: this.rtype, value: this.get(id) }; - return res; + // const res = { type: this.rtype, value: this.get(id) }; + console.log(['getTypedValue', this.type, this.cls.constructor.name, id]); + return this.get(id); } isDefined(id) { @@ -73,9 +87,11 @@ module.exports = class Indexable { } set(id, value) { - if (typeof value === 'number') { - console.log([id, this.type, value]); - throw new Error('Invalid value'); + if (this.cls) { + if ((value instanceof this.cls) === false) { + console.log([this.type, this.cls.constructor.name, value]); + value = new this.cls(value); + } } this.values[id] = value; if (this.debug) { diff --git a/src/pil_parser.jison b/src/pil_parser.jison index 56c574b..aa889b6 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -162,10 +162,12 @@ frame { return 'FRAME' } const DEFAULT_STAGE = 1; const util = require('util'); const Expression = require('../src/expression.js'); +const ExpressionFactory = require('../src/expression_factory.js'); function showcode(title, info) { console.log(title+` ${info.last_line}:${info.last_column}`); } +/* function runtime_expr(value) { let res = new Expression(); if (value.type) { @@ -183,7 +185,7 @@ function insert_expr(e, op, ...values) { // console.log(values); e.insert.apply(e, [op, ...values]); return e; -} +}*/ // console.log(`STATE ${state} ${(this.terminals_[symbol] || symbol)}`); %} @@ -619,13 +621,13 @@ data_object { $$ = $1; $$.data[$3] = $5 } | data_object ',' IDENTIFIER - { $$ = $1; $$.data[$3] = runtime_expr({ type: 'expr', op: 'reference', next: false, name: $3 }) } + { $$ = $1; $$.data[$3] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $3 }) } | IDENTIFIER ':' data_value { $$ = {data: {}}; $$.data[$1] = $3 } | IDENTIFIER - { $$ = {data: {}}; $$.data[$1] = runtime_expr({ type: 'expr', op: 'reference', next: false, name: $1 }) } + { $$ = {data: {}}; $$.data[$1] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $1 }) } ; data_array @@ -1213,115 +1215,115 @@ constant_definition /* */ expression : expression EQ expression - { $$ = insert_expr($1, 'eq', $3) } + { $$ = $1.insert('eq', ExpressionFactory.fromObject($3)) } | expression NE expression - { $$ = insert_expr($1, 'ne', $3) } + { $$ = $1.insert('ne', ExpressionFactory.fromObject($3)) } | expression LT expression - { $$ = insert_expr($1, 'lt', $3) } + { $$ = $1.insert('lt', ExpressionFactory.fromObject($3)) } | expression GT expression - { $$ = insert_expr($1, 'gt', $3) } + { $$ = $1.insert('gt', ExpressionFactory.fromObject($3)) } | expression LE expression - { $$ = insert_expr($1, 'le', $3) } + { $$ = $1.insert('le', ExpressionFactory.fromObject($3)) } | expression GE expression - { $$ = insert_expr($1, 'ge', $3) } + { $$ = $1.insert('ge', ExpressionFactory.fromObject($3)) } | expression IN expression %prec IN - { $$ = insert_expr($1, 'in', $3) } + { $$ = $1.insert('in', ExpressionFactory.fromObject($3)) } | expression IS return_type %prec IS - { $$ = insert_expr($1, 'is', runtime_expr({op: 'type', vtype: $3.type, dim: $3.dim})) } + { $$ = $1.insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $3.type, dim: $3.dim})); } | expression AND expression %prec AND - { $$ = insert_expr($1, 'and', $3) } + { $$ = $1.insert('and', ExpressionFactory.fromObject($3)) } | expression '?' expression ':' expression %prec '?' - { $$ = insert_expr($1, 'if', $3, $5) } + { $$ = $1.insert('if', ExpressionFactory.fromObjects($3, $5)) } | expression B_AND expression %prec AND - { $$ = insert_expr($1, 'band', $3) } + { $$ = $1.insert('band', ExpressionFactory.fromObject($3)) } | expression B_OR expression %prec AND - { $$ = insert_expr($1, 'bor', $3) } + { $$ = $1.insert('bor', ExpressionFactory.fromObject($3)) } | expression B_XOR expression %prec AND - { $$ = insert_expr($1, 'bxor', $3) } + { $$ = $1.insert('bxor', ExpressionFactory.fromObject($3)) } | expression OR expression %prec OR - { $$ = insert_expr($1, 'or', $3) } + { $$ = $1.insert('or', ExpressionFactory.fromObject($3)) } | expression SHL expression %prec AND - { $$ = insert_expr($1, 'shl', $3) } + { $$ = $1.insert('shl', ExpressionFactory.fromObject($3)) } | expression SHR expression %prec OR - { $$ = insert_expr($1, 'shr', $3) } + { $$ = $1.insert('shr', ExpressionFactory.fromObject($3)) } | '!' expression %prec '!' - { $$ = insert_expr($2, 'not') } + { $$ = $1.insert('not') }) | expression '+' expression %prec '+' - { $$ = insert_expr($1, 'add', $3) } + { $$ = $1.insert('add', ExpressionFactory.fromObject($3)) } | expression '-' expression %prec '-' - { $$ = insert_expr($1, 'sub', $3) } + { $$ = $1.insert('sub', ExpressionFactory.fromObject($3)) } | expression '*' expression %prec '*' - { $$ = insert_expr($1, 'mul', $3) } + { $$ = $1.insert('mul', ExpressionFactory.fromObject($3)) } | expression '%' expression %prec '%' - { $$ = insert_expr($1, 'mod', $3) } + { $$ = $1.insert('mod', ExpressionFactory.fromObject($3)) } | expression '/' expression %prec '/' - { $$ = insert_expr($1, 'div', $3) } + { $$ = $1.insert('div', ExpressionFactory.fromObject($3)) } | expression '\\' expression %prec '\\' - { $$ = insert_expr($1, 'intdiv', $3) } + { $$ = $1.insert('intdiv', ExpressionFactory.fromObject($3)) } | expression POW expression %prec POW - { $$ = insert_expr($1, 'pow', $3) } + { $$ = $1.insert('pow', ExpressionFactory.fromObject($3)) } | '+' expression %prec UPLUS { $$ = $2 } | '-' expression %prec UMINUS - { $$ = insert_expr($2, 'neg') } + { $$ = $2.insert('neg') } | name_id - { $$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$1 }) } + { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$1 }) } | INC name_id - { $$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$2, inc: 'pre'}) } + { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$2, inc: 'pre'}) } | DEC name_id - { $$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$2, dec: 'pre'}) } + { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$2, dec: 'pre'}) } | name_id INC - { $$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$1, inc: 'post'}) } + { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$1, inc: 'post'}) } | name_id DEC - { $$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$1, dec: 'post'}) } + { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$1, dec: 'post'}) } | NUMBER %prec EMPTY - { $$ = new Expression(); $$.setValue(BigInt($1)) } + { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($1)}) } | flexible_string %prec EMPTY - { $$ = runtime_expr({...$1, op: 'string'}) } + { $$ = ExpressionFactory.fromObject({...$1, op: 'string'}) } | '(' expression ')' { $$ = $2 } | function_call - { $$ = runtime_expr({...$1}) } + { $$ = ExpressionFactory.fromObject({...$1}) } | POSITIONAL_PARAM - { $$ = runtime_expr({position: $1, op: 'positional_param'}) } + { $$ = ExpressionFactory.fromObject({position: $1, op: 'positional_param'}) } | casting - { $$ = runtime_expr({...$1}) } + { $$ = ExpressionFactory.fromObject({...$1}) } ; @@ -1370,7 +1372,7 @@ name_id { $$ = { ...$1, next:$4 } } | name_optional_index "'" POSITIONAL_PARAM - { $$ = { ...$1, next: runtime_expr({position: $3, op: 'positional_param'}) } } + { $$ = { ...$1, next: ExpressionFactory.fromObject({position: $3, op: 'positional_param'}) } } | "'" name_optional_index %prec LOWER_PREC { $$ = { ...$2, prior:1 } } @@ -1382,7 +1384,7 @@ name_id { $$ = { ...$5, prior:$2 } } | POSITIONAL_PARAM "'" name_optional_index - { $$ = { ...$3, prior:runtime_expr({position: $1, op: 'positional_param'}) } } + { $$ = { ...$3, prior: ExpressionFactory.fromObject({position: $1, op: 'positional_param'}) } } | name_optional_index { $$ = $1 } diff --git a/src/processor.js b/src/processor.js index ac51c7f..b728a27 100644 --- a/src/processor.js +++ b/src/processor.js @@ -22,7 +22,10 @@ const FixedCols = require("./fixed_cols.js"); const WitnessCols = require("./witness_cols.js"); const Iterator = require("./iterator.js"); const Context = require("./context.js"); +const Runtime = require("./runtime.js"); const {FlowAbortCmd, BreakCmd, ContinueCmd, ReturnCmd} = require("./flow_cmd.js") +const {Reference, ExpressionItem, FeValue, IntValue, ProofItem, + ExpressionReference, StringValue, FixedCol, WitnessCol } = require("./expression_items.js"); const fs = require('fs'); const { log2, getKs, getRoots } = require("./utils.js"); @@ -34,35 +37,39 @@ module.exports = class Processor { this.context = new Context(this.Fr, this); this.scope = new Scope(this.Fr); this.references = new References(Fr, this.context, this.scope); + this.runtime = new Runtime(this.context); + + Expression.setContext(this.context); + this.scope.mark('proof'); this.delayedCalls = {}; this.airId = 0; this.subproofId = 0; - this.ints = new Variables(Fr, 'int'); + this.ints = new Variables('int', IntValue); this.references.register('int', this.ints); - this.fes = new Variables(Fr, 'fe'); + this.fes = new Variables('fe', FeValue); this.references.register('fe', this.fes); - this.strings = new Variables(Fr, 'string'); + this.strings = new Variables('string', StringValue); this.references.register('string', this.strings); - this.vexprs = new Variables(Fr, 'expr'); + this.vexprs = new Variables('expr', Expression); this.references.register('expr', this.vexprs); - this.lexprs = new Variables(Fr, 'lexpr'); + this.lexprs = new Variables('lexpr', Expression); this.references.register('lexpr', this.lexprs); - this.fixeds = new FixedCols(Fr); + this.fixeds = new Indexable('fixed', FixedCol); this.fixeds.runtimeRows = true; this.references.register('fixed', this.fixeds); - this.witness = new WitnessCols(Fr); + this.witness = new Indexable('witness', WitnessCol); this.references.register('witness', this.witness); - this.constants = new Indexable(Fr, 'constant', 'int'); + this.constants = new Indexable('constant', 'int'); this.references.register('constant', this.constants); this.publics = new Ids('public'); @@ -255,11 +262,15 @@ module.exports = class Processor { // TODO: move to assign class const indexes = this.decodeIndexes(st.name.indexes) const names = this.context.getNames(st.name.name); + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> EXEC-ASSIGN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'); if (st.name.reference) { assert(indexes.length === 0); - this.assign.assignReference(names, st.value.instance()); + const assignedValue = st.value.instance(); + console.log(assignedValue); + this.assign.assignReference(names, assignedValue); return; } + console.log(st.value); this.assign.assign(names, indexes, st.value); // this.references.set(st.name.name, [], this.expressions.eval(st.value)); } @@ -536,9 +547,9 @@ module.exports = class Processor { console.log([air.bits, air.rows]); // create built-in constants - this.references.set('N', [], BigInt(air.rows)); - this.references.set('BITS', [], BigInt(air.bits)); - this.references.set('__SUBPROOF__', [], subproofName); + this.references.set('N', [], new IntValue(air.rows)); + this.references.set('BITS', [], new IntValue(air.bits)); + this.references.set('__SUBPROOF__', [], new StringValue(subproofName)); this.context.push(false, subproofName); this.scope.push('air'); @@ -717,7 +728,13 @@ module.exports = class Processor { console.log(`Ignore once section because it has already executed ${s.debug}`); } execConstraint(s) { - const id = this.constraints.define(s.left.instance(true), s.right.instance(true),false,this.sourceRef); + const left = s.left.instance(true); + const right = s.right.instance(true); + s.left.dump(); + console.log(left); + s.right.dump(); + console.log(right); + const id = this.constraints.define(left, right, false, this.sourceRef); const expr = this.constraints.getExpr(id); console.log(`\x1B[1;36;44mCONSTRAINT > ${expr.toString({hideClass:true, hideLabel:false})} === 0 (${this.sourceRef})\x1B[0m`); console.log(`\x1B[1;36;44mCONSTRAINT (RAW)> ${expr.toString({hideClass:true, hideLabel:true})} === 0 (${this.sourceRef})\x1B[0m`); @@ -726,9 +743,12 @@ module.exports = class Processor { // REVIEW used only inside loop (increment) in other cases was an expression const name = s.name; const value = this.references.get(name, []); - this.references.set(name, [], value + s.pre + s.post); + // REVIEW: could be an expression (if expression x+1+1 = x+2) + console.log(s.pre, s.post, value.getValue()); + this.references.set(name, [], value.getValue() + s.pre + s.post); } execVariableDeclaration(s) { + console.log('VARIABLE DECLARATION '+this.context.sourceRef+' init:'+s.init); const init = typeof s.init !== 'undefined'; // console.log(s); const count = s.items.length; @@ -744,15 +764,19 @@ module.exports = class Processor { const scope = s.scope ?? false; let initValue = null; if (init) { + console.log(s.vtype); if (s.vtype === 'expr') { // s.init[index].expr.dump('INIT1 '+name); - initValue = this.expressions.instance(s.init[index]); + console.log(s.init[index]); + initValue = s.init[index].eval(); + console.log(initValue); // initValue.dump('INIT2 '+name); } else { - initValue = this.expressions.e2value(s.init[index]); + initValue = new IntValue(this.expressions.e2value(s.init[index])); } } + console.log(initValue); this.references.declare(name, s.vtype, lengths, { scope, sourceRef }, initValue); // if (initValue !== null) this.references.set(name, [], initValue); } diff --git a/src/references.js b/src/references.js index 9b0bb65..600b7a0 100644 --- a/src/references.js +++ b/src/references.js @@ -1,6 +1,7 @@ -const {assert} = require("chai"); +const {assert, assertLog} = require('./assert.js'); const {MultiArray} = require("./multi_array.js"); const Expression = require("./expression.js"); +const {ExpressionItem, ArrayOf} = require("./expression_items.js"); module.exports = class References { constructor (Fr, context, scope) { @@ -14,6 +15,7 @@ module.exports = class References { this.containers = {}; this.currentContainer = false; this.scope.setReferences(this); + this.context.references = this; this.aliases = {}; this.uses = []; } @@ -165,7 +167,7 @@ module.exports = class References { assert(!name.includes('.object')); const nameInfo = this.decodeName(name); - console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${this.scope.deep}`, data); + console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${this.scope.deep} ${initValue}`, data); let [array, size] = this.getArrayAndSize(lengths); @@ -288,14 +290,19 @@ module.exports = class References { if (typeof indexes === 'undefined') indexes = []; const [instance, info, def] = this._getInstanceAndLocator(name, indexes); + console.log(info); let tvalue; if (info.array) { // array info, could not be resolved - tvalue = {type: info.type ?? def.type, id: info.locator + info.offset }; + console.log('***** ARRAY ******'); + tvalue = new ArrayOf(instance.cls, info.locator + info.offset, info.type ?? def.type, instance); } else { // no array could be resolved + console.log([instance.constructor.name, info.type]); tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); } + assertLog(tvalue instanceof ExpressionItem, {name, tvalue}); + console.log(tvalue); if (typeof info.row !== 'undefined') { tvalue.row = info.row; } @@ -493,6 +500,12 @@ module.exports = class References { this.definitions[name] = cdef; } set (name, indexes, value) { + console.log('SET', name, indexes, value); + assert(value !== null); + if (value === null) { + return; + } + // console.log({name, indexes, value}); // if (name === 'N_MAX') debugger; const [instance, info] = this._getInstanceAndLocator(name, indexes); diff --git a/src/runtime.js b/src/runtime.js new file mode 100644 index 0000000..7803935 --- /dev/null +++ b/src/runtime.js @@ -0,0 +1,62 @@ +const util = require('util'); +const Expression = require('./expression.js'); +const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); +const {assert, assertLog} = require('./assert.js'); +const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); + +module.exports = class Runtime { + + constructor (context) { + context.runtime = this; + this.context = context; + } + + eval(operand, options) { + + if (operand instanceof Reference) { + return this.resolveReference(operand, options); + } + EXIT_HERE; + // TODO: if not runtime evaluable return null or + const op = operand.op; + switch (op) { + case 'string': return this.evalString(operand); + case 'number': return this.evalNumber(operand); + case 'call': return this.evalCall(operand); + case 'idref': return this.evalIdref(operand); +// case 'reference': return this.evalReference(operand, expr, options); + case 'reference': return this.resolveReference(operand, options); + } + throw new Error(`Invalid runtime operation ${op}`); + } + resolveReference(operand, options) { + const names = this.context.getNames(operand.name); + + let getTypeValueOptions = {}; + if (operand.inc === 'pre') { + getTypeValueOptions.preDelta = 1n; + } + if (operand.inc === 'post') { + getTypeValueOptions.postDelta = 1n; + } + if (operand.dec === 'pre') { + getTypeValueOptions.preDelta = -1n; + + } + if (operand.dec === 'post') { + getTypeValueOptions.postDelta = -1n; + } + console.log(names, operand.__indexes ?? [], options); + let res = this.context.references.getTypedValue(names, operand.__indexes ?? [], options); + if (typeof operand.__next !== 'undefined') { + res.__next = res.next = operand.__next; + } else if (typeof operand.next !== 'number' && (operand.next || operand.prior)) { + console.log(operand); + throw new Error(`INTERNAL: next and prior must be previouly evaluated`); + } else if (typeof operand.next === 'number' && operand.next) { + res.next = operand.next; + } + console.log(res); + return res; + } +} diff --git a/src/variables.js b/src/variables.js index 3cd379f..2b8a158 100644 --- a/src/variables.js +++ b/src/variables.js @@ -1,12 +1,9 @@ +const {assert, assertLog} = require('./assert.js'); const Indexable = require("./indexable.js"); module.exports = class Variables extends Indexable { - constructor (Fr, type) { - super(Fr, type); - this.undefined = 0n; - } - getEmptyValue(id) { - return 0; + constructor (type, cls) { + super(type, cls); } } diff --git a/src/witness_cols.js b/src/witness_cols.js index 49ceef6..7ca9f2b 100644 --- a/src/witness_cols.js +++ b/src/witness_cols.js @@ -1,18 +1,9 @@ const LabelRanges = require("./label_ranges.js"); const Indexable = require("./indexable.js"); -const WitnessCol = require("./pil_items/witness_col.js"); +const WitnessCol = require("./expression_items/witness_col.js"); module.exports = class WitnessCols extends Indexable { - constructor (Fr) { - super(Fr, 'witness'); + constructor () { + super('witness'); } - - getEmptyValue(id) { - return new WitnessCol(id); - } -/* - set(id, offset, value) { - console.log([`SET@${this.type}[${id}]`, value]); - this.values[id] = value; - }*/ } diff --git a/test/pil2/features/expressions.pil b/test/pil2/features/expressions.pil index 0b284a6..cc53330 100644 --- a/test/pil2/features/expressions.pil +++ b/test/pil2/features/expressions.pil @@ -3,7 +3,7 @@ subproof Expressions(2**16) { col witness byteIn; col witness bits[8]; - expr byteFromBits = 0; + expr byteFromBits = 22; for (int i = 0; i < 8; ++i) { byteFromBits = byteFromBits + bits[i] * 2**i; // bits[i] * (1 - bits[i]) === 0; diff --git a/test/pil2/vadcop/byte4.pil b/test/pil2/vadcop/byte4.pil index 7740782..ab7c80b 100644 --- a/test/pil2/vadcop/byte4.pil +++ b/test/pil2/vadcop/byte4.pil @@ -22,5 +22,5 @@ subproof Byte4(2**16) { } byteFromBits === byteIn; - multiset_provide(BYTE4_ID, result, [out]); + multiset_provide(BYTE4_ID, result, [out, byteIn]); } \ No newline at end of file From b9e98eaba2a1d46dff1eea53cda491b20d237af3 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Fri, 4 Aug 2023 13:31:11 +0200 Subject: [PATCH 02/33] WIP - refactoring expressions --- src/expression.js | 16 ++++++++++++++-- src/expression_factory.js | 6 +++++- src/expression_items.js | 2 +- src/expression_items/expression_item.js | 3 +-- src/expression_items/expression_reference.js | 2 -- src/expression_items/fixed_col.js | 15 ++++++++++++--- src/expression_items/int_value.js | 8 ++++++++ src/expression_items/proof_item.js | 1 - src/expression_items/proofval.js | 4 +++- src/expression_items/public.js | 4 +++- src/expression_items/publictable.js | 4 +++- src/expression_items/reference.js | 12 +++++++++--- src/expression_items/stack_item.js | 4 +++- src/expression_items/string_value.js | 3 +++ src/expression_items/subproofval.js | 4 +++- src/expression_items/value_item.js | 4 +++- src/expression_items/witness_col.js | 4 +++- src/fixed_cols.js | 1 - src/indexable.js | 3 ++- src/iterator.js | 2 +- src/processor.js | 10 +++++++--- src/sequence.js | 8 ++++++-- 22 files changed, 90 insertions(+), 30 deletions(-) diff --git a/src/expression.js b/src/expression.js index 16b3a0b..bcdf481 100644 --- a/src/expression.js +++ b/src/expression.js @@ -3,8 +3,13 @@ const {cloneDeep} = require('lodash'); const {assert} = require("chai"); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const PilItem = require('./pil_item.js'); -const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); - +const Reference = require("./expression_items/reference.js"); +const StackItem = require("./expression_items/stack_item.js"); +const ExpressionItem = require("./expression_items/expression_item.js"); +const ValueItem = require("./expression_items/value_item.js"); +const IntValue = require("./expression_items/int_value.js"); +const ProofItem = require("./expression_items/proof_item.js"); +// const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); const OP_VALUE = 'value'; const OP_ID_REF = 'idref'; const OP_STACK = 'stack'; @@ -54,6 +59,7 @@ module.exports = class Expression extends ExpressionItem { } constructor () { + super(); this.stack = []; this.fixedRowAccess = false; @@ -67,6 +73,9 @@ module.exports = class Expression extends ExpressionItem { Expression.context = context; } + get isExpression() { + return true; + } clone() { let cloned = new Expression(); cloned.fixedRowAccess = this.fixedRowAccess; @@ -548,6 +557,9 @@ module.exports = class Expression extends ExpressionItem { } return result; } + /* evalAsIntValue() { + return IntValue.castTo(this.eval()); + }*/ getArrayResult(results, indexes, options) { // this method take one of results using indexes } diff --git a/src/expression_factory.js b/src/expression_factory.js index f3b136c..8506085 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -6,7 +6,9 @@ const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); module.exports = class ExpressionFactory { + // pre function to delete property op only used by routing static router = new Router(this, 'op', {defaultPrefix: 'from', pre: (method, obj) => delete obj.op}); + static fromObject(obj) { if (obj instanceof Expression) { return obj; @@ -46,10 +48,12 @@ module.exports = class ExpressionFactory { return expressions; } static fromReference(obj) { - let res = new Reference(obj.name, obj.indexes ?? []); + let res = new Reference(obj.name, obj.indexes ?? [], (obj.next ?? 0) - (obj.prior ?? 0)); delete obj.name; delete obj.indexes; delete obj.dim; + delete obj.next; + delete obj.prior; return res; } static fromNumber(obj) { diff --git a/src/expression_items.js b/src/expression_items.js index c178c86..3bd971e 100644 --- a/src/expression_items.js +++ b/src/expression_items.js @@ -1,7 +1,6 @@ const ExpressionItem = require("./expression_items/expression_item.js") const ExpressionReference = require("./expression_items/expression_reference.js"); const FeValue = require("./expression_items/fe_value.js"); -const FixedCol = require("./expression_items/fixed_col.js"); const IntValue = require("./expression_items/int_value.js"); const ProofItem = require("./expression_items/proof_item.js"); const Proofval = require("./expression_items/proofval.js"); @@ -15,6 +14,7 @@ const Subproofval = require("./expression_items/subproofval.js"); const ValueItem = require("./expression_items/value_item.js"); const WitnessCol = require("./expression_items/witness_col.js"); const ArrayOf = require("./expression_items/array_of.js"); +const FixedCol = require("./expression_items/fixed_col.js"); module.exports = { ExpressionItem, diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 2fa9a19..859457f 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -1,10 +1,9 @@ -const LabelRanges = require("../label_ranges.js"); module.exports = class ExpressionItem { dump(options) { return `${this.constructor.name}()`; } get type() { console.log(this); - NO_USE_TYPE_PROPERTY; + throw new Error(`FATAL: use type obsolete-property`) } } diff --git a/src/expression_items/expression_reference.js b/src/expression_items/expression_reference.js index 52573e1..6651b7c 100644 --- a/src/expression_items/expression_reference.js +++ b/src/expression_items/expression_reference.js @@ -1,5 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); -const Sequence = require("../sequence.js"); const RuntimeItem = require("./runtime_item.js"); module.exports = class ExpressionReference extends RuntimeItem { } diff --git a/src/expression_items/fixed_col.js b/src/expression_items/fixed_col.js index c405a87..62db10e 100644 --- a/src/expression_items/fixed_col.js +++ b/src/expression_items/fixed_col.js @@ -1,6 +1,5 @@ -const LabelRanges = require("../label_ranges.js"); -const Sequence = require("../sequence.js"); const ProofItem = require("./proof_item.js"); +const Sequence = require("../sequence.js"); module.exports = class FixedCol extends ProofItem { constructor (id) { super(id); @@ -22,7 +21,7 @@ module.exports = class FixedCol extends ProofItem { return this.sequence.getValue(row); } set(value) { - if (value instanceof Sequence) { + /* if (value instanceof Sequence) { if (this.sequence !== null) { EXIT_HERE; } @@ -35,6 +34,16 @@ module.exports = class FixedCol extends ProofItem { else { console.log(value); EXIT_HERE; + }*/ + } + clone() { + let cloned = new FixedCol(this.id); + cloned.rows = this.rows; + cloned.values = [...this.values]; + cloned.fullFilled = this.fullFilled; + if (this.sequence) { + cloned.sequence = this.sequence.clone(); } + return cloned; } } diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index b3ce3cc..79957b7 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -19,4 +19,12 @@ module.exports = class IntValue extends ValueItem { assert(typeof value === 'bigint'); this.value = value; } + clone() { + return new IntValue(value); + } + static castTo(value) { + if (value instanceof IntValue) { + return value.value; + } + } } diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 3770c04..28b5c07 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ExpressionItem = require("./expression_item.js"); module.exports = class ProofItem extends ExpressionItem { constructor (id) { diff --git a/src/expression_items/proofval.js b/src/expression_items/proofval.js index 4f6950a..cb708d6 100644 --- a/src/expression_items/proofval.js +++ b/src/expression_items/proofval.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ProofItem = require("./proof_item.js"); module.exports = class Proofval extends ProofItem { @@ -8,4 +7,7 @@ module.exports = class Proofval extends ProofItem { getId() { return this.id; } + clone() { + return new Proofval(this.id); + } } diff --git a/src/expression_items/public.js b/src/expression_items/public.js index 25bdcd4..52b84d1 100644 --- a/src/expression_items/public.js +++ b/src/expression_items/public.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ProofItem = require("./proof_item.js"); module.exports = class Public extends ProofItem { constructor (id) { @@ -7,4 +6,7 @@ module.exports = class Public extends ProofItem { getId() { return this.id; } + clone() { + return new Public(this.id); + } } diff --git a/src/expression_items/publictable.js b/src/expression_items/publictable.js index 450b50c..28b63f1 100644 --- a/src/expression_items/publictable.js +++ b/src/expression_items/publictable.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ProofItem = require("./proof_item.js"); module.exports = class PublicTable extends ProofItem { constructor (id) { @@ -7,4 +6,7 @@ module.exports = class PublicTable extends ProofItem { getId() { return this.id; } + clone() { + return new PublicTable(this.id); + } } diff --git a/src/expression_items/reference.js b/src/expression_items/reference.js index c0cf663..2367b1f 100644 --- a/src/expression_items/reference.js +++ b/src/expression_items/reference.js @@ -1,11 +1,17 @@ const RuntimeItem = require("./runtime_item.js"); module.exports = class Reference extends RuntimeItem { - constructor (name, indexes = []) { + constructor (name, indexes = [], next = 0) { super(); this.name = name; - this.indexes = indexes; + this.indexes = [...indexes]; + this.next = next; } dump(options) { - return `Reference(${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''})`; + const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; + const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; + return `Reference(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + } + clone() { + return new Reference(this.name, this.indexes, this.next); } } diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js index 9e0d6a6..908d85c 100644 --- a/src/expression_items/stack_item.js +++ b/src/expression_items/stack_item.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ExpressionItem = require("./expression_item.js"); module.exports = class StackItem extends ExpressionItem { @@ -13,4 +12,7 @@ module.exports = class StackItem extends ExpressionItem { this.offset = value; return value; } + clone() { + return new StackItem(this.offset); + } } diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index d0f033b..d225ed4 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -15,4 +15,7 @@ module.exports = class StringValue extends RuntimeItem { this.value = value; return this.value; } + clone() { + return new StringValue(this.value); + } } diff --git a/src/expression_items/subproofval.js b/src/expression_items/subproofval.js index 7781268..f77901b 100644 --- a/src/expression_items/subproofval.js +++ b/src/expression_items/subproofval.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ProofItem = require("./proof_item.js"); module.exports = class Subproofval extends ProofItem { constructor (id) { @@ -7,4 +6,7 @@ module.exports = class Subproofval extends ProofItem { getId() { return this.id; } + clone() { + return new Subproofval(this.id); + } } diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index bb9fa16..589b783 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ExpressionItem = require("./expression_item.js"); module.exports = class ValueItem extends ExpressionItem { @@ -15,4 +14,7 @@ module.exports = class ValueItem extends ExpressionItem { dump() { return `${this.constructor.name}(${this.value})`; } + clone() { + return new ValueItem(this.value); + } } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index d6f80b7..020f028 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,4 +1,3 @@ -const LabelRanges = require("../label_ranges.js"); const ProofItem = require("./proof_item.js"); module.exports = class WitnessCol extends ProofItem { constructor (id, stage = 1) { @@ -8,4 +7,7 @@ module.exports = class WitnessCol extends ProofItem { getId() { return this.id; } + clone() { + return new WitnessCol(this.id, this.stage); + } } diff --git a/src/fixed_cols.js b/src/fixed_cols.js index 7af8f8f..8e8331c 100644 --- a/src/fixed_cols.js +++ b/src/fixed_cols.js @@ -1,4 +1,3 @@ -const LabelRanges = require("./label_ranges.js"); const Indexable = require("./indexable.js"); const FixedCol = require("./expression_items/fixed_col.js"); module.exports = class FixedCols extends Indexable { diff --git a/src/indexable.js b/src/indexable.js index 5c576a5..97d0a46 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -98,9 +98,10 @@ module.exports = class Indexable { } set(id, value) { + console.log(value); if (this.cls) { +// if (typeof value !== 'object' || (value instanceof this.cls) === false) { if ((value instanceof this.cls) === false) { - console.log([this.type, this.cls.constructor.name, value]); value = new this.cls(value); } } diff --git a/src/iterator.js b/src/iterator.js index 799976e..19afbb5 100644 --- a/src/iterator.js +++ b/src/iterator.js @@ -7,7 +7,7 @@ module.exports = class Iterator { } setExpression(expr) { console.log(expr); - if (expr instanceof Expression === false || expr.isReference() === false) { + if ((expr instanceof Expression) === false || expr.isReference() === false) { throw new Error(`Invalid iterator`); } this.index = 0; diff --git a/src/processor.js b/src/processor.js index 9dbc804..29256d2 100644 --- a/src/processor.js +++ b/src/processor.js @@ -69,7 +69,7 @@ module.exports = class Processor { this.witness = new Indexable('witness', WitnessCol); this.references.register('witness', this.witness); - this.constants = new Indexable('constant', 'int'); + this.constants = new Indexable('constant', IntValue); this.references.register('constant', this.constants); this.publics = new Ids('public'); @@ -201,6 +201,7 @@ module.exports = class Processor { } traceLog(text, color = '') { if (!this.trace) return; + console.log([Expression.constructor.name]); if (color) console.log(`\x1B[${color}m${text}\x1B[0m`); else console.log(text); } @@ -246,6 +247,7 @@ module.exports = class Processor { } res = this[method](st); } catch (e) { + console.log([Expression.constructor.name]); console.log("EXCEPTION ON "+st.debug+" ("+this.callstack.join(' > ')+")"); throw e; } @@ -475,8 +477,10 @@ module.exports = class Processor { this.references.set(func.name, [], func); } getExprNumber(expr, s, title) { + console.log(s); + expr.dump(); // expr.expr.dump(); - const se = this.expressions.eval(expr); + const se = IntValue.castTo(expr.eval()); if (typeof se !== 'bigint') { // if (se.op !== 'number') { console.log('ERROR'); @@ -563,7 +567,7 @@ module.exports = class Processor { subproof.airs.define(airName, air); // TO-DO loop with different rows - console.log([air.bits, air.rows]); + console.log([air.bits, air.rows, Expression.constructor.name]); // create built-in constants this.references.set('N', [], new IntValue(air.rows)); diff --git a/src/sequence.js b/src/sequence.js index a084f55..0886b8a 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -1,5 +1,4 @@ -const chai = require("chai"); -const assert = chai.assert; +const {assert, assertLog} = require("./assert.js"); const Router = require("./router.js"); const Expression = require("./expression.js"); @@ -10,6 +9,7 @@ class SequencePadding { this.size = size; } } +console.log("LOADING SEQUENCE"); module.exports = class Sequence { static cacheGeomN = []; // TODO: Review compiler estructures @@ -31,6 +31,10 @@ module.exports = class Sequence { this.valueCounter = 0; this.sizeOf(expression); } + clone() { + let cloned = new Sequence(this.parent, this.expression, this.maxSize); + return cloned; + } preRoute(method, e) { if (e.debug) this.debug = e.debug; } From 6ca44429ad2e7aaeaa00bbe5e8cc3dbd67e86415 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Sat, 5 Aug 2023 06:45:02 +0200 Subject: [PATCH 03/33] WIP --- build/pil_parser.js | 718 +++++++++++------------ src/expression.js | 32 +- src/expression_items.js | 2 + src/expression_items/challenge.js | 9 + src/expression_items/fe_value.js | 7 +- src/expression_items/function_call.js | 18 + src/expression_items/int_value.js | 6 + src/expression_items/proof_item.js | 3 + src/expression_items/proof_stage_item.js | 11 + src/expression_items/proofval.js | 3 - src/expression_items/reference.js | 6 +- src/expression_items/subproofval.js | 13 +- src/expression_items/witness_col.js | 10 +- src/ids.js | 8 +- src/indexable.js | 4 +- src/processor.js | 13 +- src/sequence.js | 44 +- 17 files changed, 496 insertions(+), 411 deletions(-) create mode 100644 src/expression_items/challenge.js create mode 100644 src/expression_items/function_call.js create mode 100644 src/expression_items/proof_stage_item.js diff --git a/build/pil_parser.js b/build/pil_parser.js index 4ec517f..6f0b677 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -86,58 +86,58 @@ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* actio var $0 = $$.length - 1; switch (yystate) { case 1: - this.$ = $$[$0-2]; return this.$; + this.$ = $$[$0-2]; return this.$; break; case 2: - this.$ = [...$$[$0-2], $$[$0]] + this.$ = [...$$[$0-2], $$[$0]] break; case 3: - this.$ = [] + this.$ = [] break; case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 27: case 29: case 51: case 52: case 62: case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 106: case 107: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 129: case 130: case 131: case 132: case 134: case 135: case 137: case 140: case 159: case 165: case 166: case 167: case 190: case 240: case 254: case 307: case 338: - this.$ = $$[$0] + this.$ = $$[$0] break; case 17: - this.$ = { type: 'use', name: $$[$0].name } + this.$ = { type: 'use', name: $$[$0].name } break; case 18: - this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } + this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } break; case 19: - this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } + this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } break; case 20: - this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } break; case 21: - this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } break; case 22: - this.$ = { type: 'proof', statements: $$[$0-1].statements } + this.$ = { type: 'proof', statements: $$[$0-1].statements } break; case 23: case 37: case 39: case 164: - this.$ = $$[$0]; + this.$ = $$[$0]; break; case 24: case 40: - this.$ = $$[$0-1]; + this.$ = $$[$0-1]; break; case 26: case 120: case 141: case 151: case 316: - this.$ = $$[$0-1] + this.$ = $$[$0-1] break; case 28: - this.$ = $$[$0-1]; this.$.statements.push($$[$0]); + this.$ = $$[$0-1]; this.$.statements.push($$[$0]); break; case 30: - this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } + this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } break; case 31: case 32: - this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } + this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } break; case 33: case 96: case 211: - this.$ = { statements: [$$[$0]] } + this.$ = { statements: [$$[$0]] } break; case 34: case 35: - this.$ = { statements: [$$[$0-1]] } + this.$ = { statements: [$$[$0-1]] } break; case 44: this.$ = { boundary: 'first' } @@ -149,25 +149,25 @@ case 46: this.$ = { boundary: 'frame' } break; case 47: - this.$ = { type: 'code', statements: $$[$0] }; + this.$ = { type: 'code', statements: $$[$0] }; break; case 48: - this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } + this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } break; case 49: - this.$ = { ...$$[$0-1], type: "when", statements: $$[$0] } + this.$ = { ...$$[$0-1], type: "when", statements: $$[$0] } break; case 50: - this.$ = { type: 'metadata', data: $$[$0-1] } + this.$ = { type: 'metadata', data: $$[$0-1] } break; case 53: - this.$ = { type: 'scope_definition', ...$$[$0-1] }; + this.$ = { type: 'scope_definition', ...$$[$0-1] }; break; case 54: - this.$ = {private: false, funcname: $$[$0]} + this.$ = {private: false, funcname: $$[$0]} break; case 55: - this.$ = {private: true, funcname: $$[$0]} + this.$ = {private: true, funcname: $$[$0]} break; case 56: this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } @@ -188,405 +188,405 @@ case 61: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 63: - this.$ = $$[$0-2]; this.$.vargs = true + this.$ = $$[$0-2]; this.$.vargs = true break; case 64: this.$ = { args: [], varargs: false } break; case 65: - this.$ = { args: [], varargs: false } + this.$ = { args: [], varargs: false } break; case 66: - this.$ = $$[$0-2]; this.$.args.push($$[$0]) + this.$ = $$[$0-2]; this.$.args.push($$[$0]) break; case 67: - this.$ = { args: [ $$[$0] ] } + this.$ = { args: [ $$[$0] ] } break; case 68: - this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } + this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } break; case 69: - this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } + this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } break; case 70: - this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } + this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } break; case 71: - this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } + this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } break; case 72: - this.$ = { type: 'int' } + this.$ = { type: 'int' } break; case 73: - this.$ = { type: 'fe' } + this.$ = { type: 'fe' } break; case 74: - this.$ = { type: 'expr' } + this.$ = { type: 'expr' } break; case 75: - this.$ = { type: 'int', const: true } + this.$ = { type: 'int', const: true } break; case 76: - this.$ = { type: 'fe', const: true } + this.$ = { type: 'fe', const: true } break; case 77: - this.$ = { type: 'expr', const: true } + this.$ = { type: 'expr', const: true } break; case 78: - this.$ = { type: 'witness' } + this.$ = { type: 'witness' } break; case 79: - this.$ = { type: 'fixed' } + this.$ = { type: 'fixed' } break; case 80: - this.$ = { type: 'challenge' } + this.$ = { type: 'challenge' } break; case 81: - this.$ = { type: 'string' } + this.$ = { type: 'string' } break; case 82: - this.$ = { type: 'string', const: true } + this.$ = { type: 'string', const: true } break; case 83: - this.$ = { type: 'proof' } + this.$ = { type: 'proof' } break; case 84: - this.$ = { type: 'subproof' } + this.$ = { type: 'subproof' } break; case 85: - this.$ = { type: 'air' } + this.$ = { type: 'air' } break; case 86: - this.$ = { type: 'public' } + this.$ = { type: 'public' } break; case 87: - this.$ = { type: 'publicTable' } + this.$ = { type: 'publicTable' } break; case 88: - this.$ = { type: 'function' } + this.$ = { type: 'function' } break; case 89: - this.$ = {returns: [...$$[$0-2], $$[$0]]} + this.$ = {returns: [...$$[$0-2], $$[$0]]} break; case 90: - this.$.returns = [$$[$0]] + this.$.returns = [$$[$0]] break; case 91: - this.$ = {dim: $$[$0-2].dim + 1} + this.$ = {dim: $$[$0-2].dim + 1} break; case 92: - this.$ = {dim: 1} + this.$ = {dim: 1} break; case 93: - this.$ = { type: $$[$0].type, dim: 0 } + this.$ = { type: $$[$0].type, dim: 0 } break; case 94: - this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } + this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } break; case 95: case 210: - this.$ = $$[$0-2]; this.$.statements.push($$[$0]); + this.$ = $$[$0-2]; this.$.statements.push($$[$0]); break; case 105: - this.$ = { type: 'code', statements: $$[$0] } + this.$ = { type: 'code', statements: $$[$0] } break; case 108: - this.$ = { type: 'expr', expr: $$[$0] } + this.$ = { type: 'expr', expr: $$[$0] } break; case 109: - this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } + this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } break; case 110: - this.$ = {...$$[$0], type: 'delayed_function_call'} + this.$ = {...$$[$0], type: 'delayed_function_call'} break; case 121: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = $$[$02] + this.$ = $$[$0-2]; this.$.data[$$[$0]] = $$[$02] break; case 122: - this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] + this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] break; case 123: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) break; case 124: - this.$ = {data: {}}; this.$.data[$$[$0-2]] = $$[$0] + this.$ = {data: {}}; this.$.data[$$[$0-2]] = $$[$0] break; case 125: - this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) break; case 126: case 153: case 221: case 242: case 247: - this.$ = $$[$0-2]; this.$.values.push($$[$0]) + this.$ = $$[$0-2]; this.$.values.push($$[$0]) break; case 127: - this.$ = { values: [ $$[$0] ]} + this.$ = { values: [ $$[$0] ]} break; case 128: - this.$ = { op: 'call', function: $$[$0-3], arguments: $$[$0-1].values } + this.$ = { op: 'call', function: $$[$0-3], arguments: $$[$0-1].values } break; case 133: - this.$ = { op: 'delayed_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], arguments: $$[$0-1].values } + this.$ = { op: 'delayed_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], arguments: $$[$0-1].values } break; case 136: - this.$ = {...$$[$0], ...$$[$01]} + this.$ = {...$$[$0], ...$$[$01]} break; case 138: - this.$ = { type: 'continue' } + this.$ = { type: 'continue' } break; case 139: - this.$ = { type: 'break' } + this.$ = { type: 'break' } break; case 142: - this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } + this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } break; case 143: - this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } + this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } break; case 144: - this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } + this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } break; case 145: case 146: - this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } + this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } break; case 147: - this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } + this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } break; case 148: - this.$ = $$[$0-4] + this.$ = $$[$0-4] break; case 149: - this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } + this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } break; case 150: - this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} + this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} break; case 152: - this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) + this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) break; case 154: - this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) + this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) break; case 155: - this.$ = { values: [$$[$0]] } + this.$ = { values: [$$[$0]] } break; case 156: - this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } + this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } break; case 157: - this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) + this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) break; case 158: - this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} + this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} break; case 160: - this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } + this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } break; case 161: - this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } + this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } break; case 162: - this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } + this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } break; case 163: - this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } + this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } break; case 168: - this.$ = {...$$[$0], const: false} + this.$ = {...$$[$0], const: false} break; case 169: - this.$ = {...$$[$0], const: true } + this.$ = {...$$[$0], const: true } break; case 170: - this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } break; case 171: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } break; case 172: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } break; case 173: - this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } break; case 174: - this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } break; case 175: - this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } break; case 176: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } break; case 177: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } break; case 178: - this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } break; case 179: - this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } break; case 180: - this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } break; case 181: - this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } break; case 182: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } break; case 183: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } break; case 184: - this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } break; case 185: - this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } break; case 186: - this.$ = { dim: 1, lengths: [null]} + this.$ = { dim: 1, lengths: [null]} break; case 187: - this.$ = { dim: 1, lengths: [$$[$0-1]]} + this.$ = { dim: 1, lengths: [$$[$0-1]]} break; case 188: - this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) + this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) break; case 189: - this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) + this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) break; case 191: case 340: - this.$ = { ...$$[$0-1], ...$$[$0] } + this.$ = { ...$$[$0-1], ...$$[$0] } break; case 192: - this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); + this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); break; case 193: - this.$ = {items: [{...$$[$0], _d_:2}]} + this.$ = {items: [{...$$[$0], _d_:2}]} break; case 194: - this.$ = { type: 'return', value: null } + this.$ = { type: 'return', value: null } break; case 195: - this.$ = { type: 'return', value: $$[$0] } + this.$ = { type: 'return', value: $$[$0] } break; case 196: - this.$ = { type: 'return', values: $$[$0-1] } + this.$ = { type: 'return', values: $$[$0-1] } break; case 197: - this.$ = { type: 'assign' } + this.$ = { type: 'assign' } break; case 198: - this.$ = { type: 'increment' } + this.$ = { type: 'increment' } break; case 199: - this.$ = { type: 'substract' } + this.$ = { type: 'substract' } break; case 200: - this.$ = { type: 'product' } + this.$ = { type: 'product' } break; case 201: - this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) + this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) break; case 202: - this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) + this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) break; case 203: - this.$ = { names: [$$[$0]] } + this.$ = { names: [$$[$0]] } break; case 204: - this.$ = $$[$0-2] + this.$ = $$[$0-2] break; case 205: - this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) + this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) break; case 206: - this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } + this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } break; case 207: - this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } + this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } break; case 208: - this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } break; case 209: - this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } break; case 212: - this.$ = { type: 'include', file: $$[$0] } + this.$ = { type: 'include', file: $$[$0] } break; case 213: - this.$ = { stage: $$[$0-2] } + this.$ = { stage: $$[$0-2] } break; case 214: - this.$ = { stage: DEFAULT_STAGE } + this.$ = { stage: DEFAULT_STAGE } break; case 215: - this.$ = { type: 'string', value: $$[$0] } + this.$ = { type: 'string', value: $$[$0] } break; case 216: - this.$ = { type: 'string', template: true, value: $$[$0] } + this.$ = { type: 'string', template: true, value: $$[$0] } break; case 217: - this.$ = {type: 'sequence', values: $$[$0-1].values} + this.$ = {type: 'sequence', values: $$[$0-1].values} break; case 218: - this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } + this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } break; case 219: - this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} + this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} break; case 220: - this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} + this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} break; case 222: - this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) break; case 223: - this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; case 224: - this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; case 225: this.$ = $$[$0-8]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, - tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) + tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; case 226: this.$ = $$[$0-8]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, - tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) + tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; case 227: - this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) + this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; case 228: - this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) + this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; case 229: this.$ = $$[$0-5]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, - tn: false}) + tn: false}) break; case 230: this.$ = $$[$0-5]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, - tn: false}) + tn: false}) break; case 231: - this.$ = { type: 'seq_list', values: [$$[$0]] } + this.$ = { type: 'seq_list', values: [$$[$0]] } break; case 232: - this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } + this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } break; case 233: - this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} + this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} break; case 234: - this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} + this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} break; case 235: - this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} + this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} break; case 236: this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0], times: $$[$0-2]} @@ -595,307 +595,307 @@ case 237: this.$ = {type: 'range_seq', from: $$[$0-6], to: $$[$0-2], times: $$[$0-4], toTimes: $$[$0]} break; case 238: - this.$ = {type: 'padding_seq', value: $$[$0-1]} + this.$ = {type: 'padding_seq', value: $$[$0-1]} break; case 239: - this.$ = {type: 'seq_list', values: [$$[$0-1]]} + this.$ = {type: 'seq_list', values: [$$[$0-1]]} break; case 241: - this.$ = {values: []} + this.$ = {values: []} break; case 243: - this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) + this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) break; case 244: - this.$ = { type: 'expression_list', values: $$[$0-1].values } + this.$ = { type: 'expression_list', values: $$[$0-1].values } break; case 245: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = { type: 'expression_list', values: [$$[$0]] } break; case 246: - this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) + this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) break; case 248: - this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } + this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } break; case 249: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = { type: 'expression_list', values: [$$[$0]] } break; case 250: - this.$ = { dim: 1, lengths: [null] } + this.$ = { dim: 1, lengths: [null] } break; case 251: - this.$ = { dim: 1, lengths: [$$[$0-1]] } + this.$ = { dim: 1, lengths: [$$[$0-1]] } break; case 252: - this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } + this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } break; case 253: - this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } + this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } break; case 255: - this.$ = {...$$[$0-1], ...$$[$0]} + this.$ = {...$$[$0-1], ...$$[$0]} break; case 256: case 346: case 348: case 352: case 353: - this.$ = { name: $$[$0] } + this.$ = { name: $$[$0] } break; case 257: - this.$ = { name: $$[$0], reference: true } + this.$ = { name: $$[$0], reference: true } break; case 258: - this.$ = { name: $$[$0], template: true } + this.$ = { name: $$[$0], template: true } break; case 259: - this.$ = { name: 'air.'+$$[$0] } + this.$ = { name: 'air.'+$$[$0] } break; case 260: - this.$ = { name: 'air.'+$$[$0], template: true } + this.$ = { name: 'air.'+$$[$0], template: true } break; case 261: - this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } + this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } break; case 262: - this.$ = { items: [$$[$0]] } + this.$ = { items: [$$[$0]] } break; case 263: - this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; + this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; break; case 264: - this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } + this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; case 265: - this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 266: - this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 267: - this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } + this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; case 268: - this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } + this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } break; case 269: - this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 270: - this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } + this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } break; case 271: - this.$ = { type: 'public_declaration', items: $$[$0].items } + this.$ = { type: 'public_declaration', items: $$[$0].items } break; case 272: - this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} + this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} break; case 273: - this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} + this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} break; case 274: - this.$ = { type: 'proof_value_declaration', items: [$$[$0-2]], init: $$[$0] } + this.$ = { type: 'proof_value_declaration', items: [$$[$0-2]], init: $$[$0] } break; case 275: - this.$ = { type: 'proof_value_declaration', items: $$[$0].items } + this.$ = { type: 'proof_value_declaration', items: $$[$0].items } break; case 276: - this.$ = { type: 'subproof_value_declaration', items: [$$[$0-2]], init: $$[$0] } + this.$ = { type: 'subproof_value_declaration', items: [$$[$0-2]], init: $$[$0] } break; case 277: - this.$ = { type: 'subproof_value_declaration', items: $$[$0].items } + this.$ = { type: 'subproof_value_declaration', items: $$[$0].items } break; case 278: - this.$ = { type: 'subproof_definition', aggregable: false, props: $$[$0-7], name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_definition', aggregable: false, props: $$[$0-7], name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; case 279: - this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; case 280: - this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } break; case 281: - this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } break; case 282: - this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } + this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } break; case 283: - this.$ = insert_expr($$[$0-2], 'eq', $$[$0]) + this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) break; case 284: - this.$ = insert_expr($$[$0-2], 'ne', $$[$0]) + this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) break; case 285: - this.$ = insert_expr($$[$0-2], 'lt', $$[$0]) + this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) break; case 286: - this.$ = insert_expr($$[$0-2], 'gt', $$[$0]) + this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) break; case 287: - this.$ = insert_expr($$[$0-2], 'le', $$[$0]) + this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) break; case 288: - this.$ = insert_expr($$[$0-2], 'ge', $$[$0]) + this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) break; case 289: - this.$ = insert_expr($$[$0-2], 'in', $$[$0]) + this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) break; case 290: - this.$ = insert_expr($$[$0-2], 'is', runtime_expr({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})) + this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})); break; case 291: - this.$ = insert_expr($$[$0-2], 'and', $$[$0]) + this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; case 292: - this.$ = insert_expr($$[$0-4], 'if', $$[$0-2], $$[$0]) + this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) break; case 293: - this.$ = insert_expr($$[$0-2], 'band', $$[$0]) + this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) break; case 294: - this.$ = insert_expr($$[$0-2], 'bor', $$[$0]) + this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) break; case 295: - this.$ = insert_expr($$[$0-2], 'bxor', $$[$0]) + this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) break; case 296: - this.$ = insert_expr($$[$0-2], 'or', $$[$0]) + this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) break; case 297: - this.$ = insert_expr($$[$0-2], 'shl', $$[$0]) + this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) break; case 298: - this.$ = insert_expr($$[$0-2], 'shr', $$[$0]) + this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; case 299: - this.$ = insert_expr($$[$0], 'not') + this.$ = $$[$0-1].insert('not') break; case 300: - this.$ = insert_expr($$[$0-2], 'add', $$[$0]) + this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) break; case 301: - this.$ = insert_expr($$[$0-2], 'sub', $$[$0]) + this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) break; case 302: - this.$ = insert_expr($$[$0-2], 'mul', $$[$0]) + this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) break; case 303: - this.$ = insert_expr($$[$0-2], 'mod', $$[$0]) + this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) break; case 304: - this.$ = insert_expr($$[$0-2], 'div', $$[$0]) + this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) break; case 305: - this.$ = insert_expr($$[$0-2], 'intdiv', $$[$0]) + this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) break; case 306: - this.$ = insert_expr($$[$0-2], 'pow', $$[$0]) + this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) break; case 308: - this.$ = insert_expr($$[$0], 'neg') + this.$ = $$[$0].insert('neg') break; case 309: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) break; case 310: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) break; case 311: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) break; case 312: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) break; case 313: - this.$ = runtime_expr({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) break; case 314: - this.$ = new Expression(); this.$.setValue(BigInt($$[$0])) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($$[$0])}) break; case 315: - this.$ = runtime_expr({...$$[$0], op: 'string'}) + this.$ = ExpressionFactory.fromObject({...$$[$0], op: 'string'}) break; case 317: case 319: - this.$ = runtime_expr({...$$[$0]}) + this.$ = ExpressionFactory.fromObject({...$$[$0]}) break; case 318: - this.$ = runtime_expr({position: $$[$0], op: 'positional_param'}) + this.$ = ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) break; case 320: - this.$ = { op: 'cast', cast: 'int', value: $$[$0-1]} + this.$ = { op: 'cast', cast: 'int', value: $$[$0-1]} break; case 321: - this.$ = { op: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'fe', value: $$[$0-1] } break; case 322: - this.$ = { op: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'expr', value: $$[$0-1] } break; case 323: - this.$ = { op: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'col', value: $$[$0-1] } break; case 324: - this.$ = { op: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'string', value: $$[$0-1] } break; case 325: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'int', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'int', value: $$[$0-1] } break; case 326: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'fe', value: $$[$0-1] } break; case 327: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'expr', value: $$[$0-1] } break; case 328: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'col', value: $$[$0-1] } break; case 329: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'string', value: $$[$0-1] } break; case 330: - this.$ = { ...$$[$0-1], next:1 } + this.$ = { ...$$[$0-1], next:1 } break; case 331: - this.$ = { ...$$[$0-2], next:$$[$0] } + this.$ = { ...$$[$0-2], next:$$[$0] } break; case 332: - this.$ = { ...$$[$0-4], next:$$[$0-1] } + this.$ = { ...$$[$0-4], next:$$[$0-1] } break; case 333: - this.$ = { ...$$[$0-2], next: runtime_expr({position: $$[$0], op: 'positional_param'}) } + this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) } break; case 334: - this.$ = { ...$$[$0], prior:1 } + this.$ = { ...$$[$0], prior:1 } break; case 335: - this.$ = { ...$$[$0], prior:$$[$0-2] } + this.$ = { ...$$[$0], prior:$$[$0-2] } break; case 336: - this.$ = { ...$$[$0], prior:$$[$0-3] } + this.$ = { ...$$[$0], prior:$$[$0-3] } break; case 337: - this.$ = { ...$$[$0], prior:runtime_expr({position: $$[$0-2], op: 'positional_param'}) } + this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], op: 'positional_param'}) } break; case 339: - this.$ = { ...$$[$0], dim: 0 } + this.$ = { ...$$[$0], dim: 0 } break; case 341: - this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } + this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } break; case 342: - this.$ = { dim: 1, indexes: [$$[$0-1]]} + this.$ = { dim: 1, indexes: [$$[$0-1]]} break; case 343: - this.$ = { name: 'air.' + $$[$0].name } + this.$ = { name: 'air.' + $$[$0].name } break; case 344: - this.$ = { name: 'subproof.' + $$[$0].name } + this.$ = { name: 'subproof.' + $$[$0].name } break; case 345: - this.$ = { name: 'proof.' + $$[$0].name } + this.$ = { name: 'proof.' + $$[$0].name } break; case 347: case 349: - this.$ = { name: $$[$0-2] + '.' + $$[$0].name } + this.$ = { name: $$[$0-2] + '.' + $$[$0].name } break; case 350: case 351: - this.$ = { name: $$[$0-2].name + '.' + $$[$0] } + this.$ = { name: $$[$0-2].name + '.' + $$[$0] } break; } }, @@ -1404,211 +1404,211 @@ options: {}, performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { var YYSTATE=YY_START; switch($avoiding_name_collisions) { -case 0: /* skip whitespace */ +case 0: /* skip whitespace */ break; -case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ +case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ break; -case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ +case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ break; -case 3: return 73; +case 3: return 73; break; -case 4: return 74; +case 4: return 74; break; -case 5: return 75; +case 5: return 75; break; -case 6: return 24; +case 6: return 24; break; -case 7: return 'DECLARE'; +case 7: return 'DECLARE'; break; -case 8: return 21; +case 8: return 21; break; -case 9: return 25; +case 9: return 25; break; -case 10: return 137; +case 10: return 137; break; -case 11: return 107; +case 11: return 107; break; -case 12: return 161; +case 12: return 161; break; -case 13: return 82; +case 13: return 82; break; -case 14: return 81; +case 14: return 81; break; -case 15: return 154 +case 15: return 154 break; -case 16: return 72 +case 16: return 72 break; -case 17: return 78 +case 17: return 78 break; -case 18: return 79 +case 18: return 79 break; -case 19: return 61 +case 19: return 61 break; -case 20: return 95 +case 20: return 95 break; -case 21: return 31 +case 21: return 31 break; -case 22: return 69 +case 22: return 69 break; -case 23: return 70 +case 23: return 70 break; -case 24: return 71 +case 24: return 71 break; -case 25: return 77 +case 25: return 77 break; -case 26: return 76 +case 26: return 76 break; -case 27: return 104 +case 27: return 104 break; -case 28: return 108 +case 28: return 108 break; -case 29: return 109 +case 29: return 109 break; -case 30: return 101 +case 30: return 101 break; -case 31: return 100 +case 31: return 100 break; -case 32: return 113 +case 32: return 113 break; -case 33: return 'ELSEIF' +case 33: return 'ELSEIF' break; -case 34: return 114 +case 34: return 114 break; -case 35: return 111 +case 35: return 111 break; -case 36: return 119 +case 36: return 119 break; -case 37: return 116 +case 37: return 116 break; -case 38: return 45 +case 38: return 45 break; -case 39: return 153 +case 39: return 153 break; -case 40: return 140 +case 40: return 140 break; -case 41: return 110 +case 41: return 110 break; -case 42: return 96 +case 42: return 96 break; -case 43: return 53 +case 43: return 53 break; -case 44: return 60 +case 44: return 60 break; -case 45: return 52 +case 45: return 52 break; -case 46: return 129 +case 46: return 129 break; -case 47: return 41 +case 47: return 41 break; -case 48: return 42 +case 48: return 42 break; -case 49: return 43 +case 49: return 43 break; -case 50: return 146 +case 50: return 146 break; -case 51: return 147 +case 51: return 147 break; -case 52: return 64 +case 52: return 64 break; -case 53: return 118 +case 53: return 118 break; -case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; +case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; break; -case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; +case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; break; -case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; +case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; break; -case 57: return 26; +case 57: return 26; break; -case 58: yy_.yytext = yy_.yytext.slice(1); return 67; +case 58: yy_.yytext = yy_.yytext.slice(1); return 67; break; -case 59: yy_.yytext = yy_.yytext.slice(1); return 49; +case 59: yy_.yytext = yy_.yytext.slice(1); return 49; break; -case 60: yy_.yytext = yy_.yytext.slice(1); return 178; +case 60: yy_.yytext = yy_.yytext.slice(1); return 178; break; -case 61: return 177; +case 61: return 177; break; -case 62: return 121; +case 62: return 121; break; -case 63: return 123; +case 63: return 123; break; -case 64: return 131; +case 64: return 131; break; -case 65: return 132; +case 65: return 132; break; -case 66: return 133; +case 66: return 133; break; -case 67: return 171; +case 67: return 171; break; -case 68: return 172; +case 68: return 172; break; -case 69: return 173; +case 69: return 173; break; -case 70: return "'"; +case 70: return "'"; break; -case 71: return "?"; +case 71: return "?"; break; -case 72: return "%"; +case 72: return "%"; break; -case 73: return "\\\\"; +case 73: return "\\\\"; break; -case 74: return "/"; +case 74: return "/"; break; -case 75: return 8; +case 75: return 8; break; -case 76: return 63; +case 76: return 63; break; -case 77: return 151; +case 77: return 151; break; -case 78: return 162; +case 78: return 162; break; -case 79: return 167; +case 79: return 167; break; -case 80: return 164; +case 80: return 164; break; -case 81: return 165; +case 81: return 165; break; -case 82: return 166; +case 82: return 166; break; -case 83: return 168; +case 83: return 168; break; -case 84: return 169; +case 84: return 169; break; -case 85: return 159; +case 85: return 159; break; -case 86: return 160; +case 86: return 160; break; -case 87: return 157; +case 87: return 157; break; -case 88: return 158; +case 88: return 158; break; -case 89: return 86; +case 89: return 86; break; -case 90: return 156; +case 90: return 156; break; -case 91: return 155; +case 91: return 155; break; -case 92: return 127; +case 92: return 127; break; -case 93: return 46; +case 93: return 46; break; -case 94: return 48; +case 94: return 48; break; -case 95: return 56; +case 95: return 56; break; -case 96: return 58; +case 96: return 58; break; -case 97: return 28; +case 97: return 28; break; -case 98: return 30; +case 98: return 30; break; -case 99: return '::'; +case 99: return '::'; break; -case 100: return 55; +case 100: return 55; break; -case 101: return 170; +case 101: return 170; break; -case 102: return 6; +case 102: return 6; break; case 103: console.log("INVALID: " + yy_.yytext); return 'INVALID' break; diff --git a/src/expression.js b/src/expression.js index bcdf481..809b8ad 100644 --- a/src/expression.js +++ b/src/expression.js @@ -8,6 +8,7 @@ const StackItem = require("./expression_items/stack_item.js"); const ExpressionItem = require("./expression_items/expression_item.js"); const ValueItem = require("./expression_items/value_item.js"); const IntValue = require("./expression_items/int_value.js"); +const FeValue = require("./expression_items/fe_value.js"); const ProofItem = require("./expression_items/proof_item.js"); // const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); const OP_VALUE = 'value'; @@ -518,11 +519,11 @@ module.exports = class Expression extends ExpressionItem { evaluateValue(value, options) { console.log(value); if (typeof value === 'undefined') { - return 0; + return options ? options.default ?? 0n : 0n; } // stack references not replaced // expression references not extended (inserted) - console.log(value); + console.log([typeof value, value]); if (value instanceof Expression) { value.dump(); } @@ -560,6 +561,27 @@ module.exports = class Expression extends ExpressionItem { /* evalAsIntValue() { return IntValue.castTo(this.eval()); }*/ + evaluateValueAsNumber(value, options) { + let evaluated = false; + while (true) { + if (typeof value === 'number' || typeof value === 'bigint' || typeof value === 'boolean') { + return Number(value); + } + if (value instanceof ExpressionItem) { + return value.asNumber(); + } + if (evaluated) break; + value = this.evaluateValue(value, options); + evaluated = true; + } + throw new Error(`Value isn't a number`); + } + evaluateValuesAsNumbers(values, options) { + if (typeof values === 'undefined') { + return (options ? options.default ?? [] : []); + } + return values.map(value => this.evaluateValuesAsNumbers(value, options)); + } getArrayResult(results, indexes, options) { // this method take one of results using indexes } @@ -580,17 +602,17 @@ module.exports = class Expression extends ExpressionItem { for (let ope of this.stack[stpos].operands) { let next = 0; // if no prior defined priorValue was 0 - let priorValue = this.evaluateValue(ope.prior, options); + let priorValue = this.evaluateValueAsNumber(ope.prior, options); let result = this.evaluateValue(ope, stackResults, options); console.log(['RESULT', result]); - let indexes = this.evaluateValues(ope.indexes, options); + let indexes = this.evaluateValuesAsNumbers(ope.indexes, options); if (indexes.length) { // TODO: fixed access result = this.getArrayResult(result, indexes, options); } // if no prior defined nextValue was 0 - let nextValue = this.evaluateValue(ope.next, options); + let nextValue = this.evaluateValueAsNumber(ope.next, options); // prior and next are excl if (priorValue && nextValue) { diff --git a/src/expression_items.js b/src/expression_items.js index 3bd971e..5a02235 100644 --- a/src/expression_items.js +++ b/src/expression_items.js @@ -4,6 +4,7 @@ const FeValue = require("./expression_items/fe_value.js"); const IntValue = require("./expression_items/int_value.js"); const ProofItem = require("./expression_items/proof_item.js"); const Proofval = require("./expression_items/proofval.js"); +const Challenge = require("./expression_items/challenge.js"); const Public = require("./expression_items/public.js"); const Publictable = require("./expression_items/publictable.js"); const Reference = require("./expression_items/reference.js"); @@ -24,6 +25,7 @@ module.exports = { IntValue, ProofItem, Proofval, + Challenge, Public, Publictable, Reference, diff --git a/src/expression_items/challenge.js b/src/expression_items/challenge.js new file mode 100644 index 0000000..0ae43ac --- /dev/null +++ b/src/expression_items/challenge.js @@ -0,0 +1,9 @@ +const ProofStageItem = require("./proof_stage_item.js"); +module.exports = class Challenge extends ProofStageItem { + constructor (id, stage) { + super(id, stage); + } + clone() { + return new Challenge(this.id, this.stage); + } +} diff --git a/src/expression_items/fe_value.js b/src/expression_items/fe_value.js index d608876..1803dee 100644 --- a/src/expression_items/fe_value.js +++ b/src/expression_items/fe_value.js @@ -8,5 +8,10 @@ module.exports = class FeValue extends ValueItem { clone() { return new FeValue(this.value); } - + asInt(value) { + return this.value; + } + asNumber(value) { + return Number(this.value); + } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js new file mode 100644 index 0000000..705e91b --- /dev/null +++ b/src/expression_items/function_call.js @@ -0,0 +1,18 @@ +const RuntimeItem = require("./runtime_item.js"); +module.exports = class FunctionCall extends RuntimeItem { + constructor (name, args = [], indexes = []) { + super(); + this.name = name; + this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); + this.indexes = indexes.map(x => (typeof x.clone === 'function') ? x.clone() : x); + this.next = next; + } + dump(options) { + const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; + const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; + return `Reference(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + } + clone() { + return new FunctionCall(this.name, this.args, this.indexes); + } +} diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index 79957b7..e336922 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -27,4 +27,10 @@ module.exports = class IntValue extends ValueItem { return value.value; } } + asInt(value) { + return this.value; + } + asNumber(value) { + return Number(this.value); + } } diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 28b5c07..420d31c 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -4,5 +4,8 @@ module.exports = class ProofItem extends ExpressionItem { super(); this.id = id; } + getId() { + return this.id; + } } diff --git a/src/expression_items/proof_stage_item.js b/src/expression_items/proof_stage_item.js new file mode 100644 index 0000000..c259e9f --- /dev/null +++ b/src/expression_items/proof_stage_item.js @@ -0,0 +1,11 @@ +const ProofItem = require("./proof_item.js"); +module.exports = class ProofStageItem extends ProofItem { + constructor (id, stage) { + super(id); + this.stage = stage; + } + getStage() { + return this.stage; + } +} + diff --git a/src/expression_items/proofval.js b/src/expression_items/proofval.js index cb708d6..5f90c12 100644 --- a/src/expression_items/proofval.js +++ b/src/expression_items/proofval.js @@ -4,9 +4,6 @@ module.exports = class Proofval extends ProofItem { constructor (id) { super(id); } - getId() { - return this.id; - } clone() { return new Proofval(this.id); } diff --git a/src/expression_items/reference.js b/src/expression_items/reference.js index 2367b1f..fbdaae9 100644 --- a/src/expression_items/reference.js +++ b/src/expression_items/reference.js @@ -4,11 +4,11 @@ module.exports = class Reference extends RuntimeItem { super(); this.name = name; this.indexes = [...indexes]; - this.next = next; + this.next = Number(next ?? 0); } dump(options) { - const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; - const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; + const pre = this.next < 0 ? (this.next < -1 ? `${-this.next}'`:"'"):''; + const post = this.next > 0 ? (this.next > 1 ? `'${this.next}`:"'"):''; return `Reference(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; } clone() { diff --git a/src/expression_items/subproofval.js b/src/expression_items/subproofval.js index f77901b..913e28f 100644 --- a/src/expression_items/subproofval.js +++ b/src/expression_items/subproofval.js @@ -1,12 +1,9 @@ -const ProofItem = require("./proof_item.js"); -module.exports = class Subproofval extends ProofItem { - constructor (id) { - super(id); - } - getId() { - return this.id; +const ProofStageItem = require("./proof_stage_item.js"); +module.exports = class Subproofval extends ProofStageItem { + constructor (id, stage) { + super(id, stage); } clone() { - return new Subproofval(this.id); + return new Subproofval(this.id, this.stage); } } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index 020f028..4b57e6f 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,11 +1,7 @@ -const ProofItem = require("./proof_item.js"); -module.exports = class WitnessCol extends ProofItem { +const ProofStageItem = require("./proof_stage_item.js"); +module.exports = class WitnessCol extends ProofStageItem { constructor (id, stage = 1) { - super(id); - this.stage = stage; - } - getId() { - return this.id; + super(id, stage); } clone() { return new WitnessCol(this.id, this.stage); diff --git a/src/ids.js b/src/ids.js index 28c6593..482e408 100644 --- a/src/ids.js +++ b/src/ids.js @@ -1,9 +1,13 @@ -const LabelRanges = require("./label_ranges.js"); +const LabelRanges = require('./label_ranges.js'); +const ExpressionItem = require('./expression_items/expression_item.js'); +const {assert,assertLog} = require('./assert.js') module.exports = class Ids { - constructor (type) { + constructor (type, cls) { this.lastId = 0; this.type = type; + this.cls = cls; + assertLog(cls.prototype instanceof ExpressionItem, cls); this.labelRanges = new LabelRanges(); } diff --git a/src/indexable.js b/src/indexable.js index 97d0a46..9f3bf83 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -98,9 +98,7 @@ module.exports = class Indexable { } set(id, value) { - console.log(value); - if (this.cls) { -// if (typeof value !== 'object' || (value instanceof this.cls) === false) { + if (typeof this.cls === 'function') { if ((value instanceof this.cls) === false) { value = new this.cls(value); } diff --git a/src/processor.js b/src/processor.js index fe7edc7..c4ccc26 100644 --- a/src/processor.js +++ b/src/processor.js @@ -23,8 +23,9 @@ const WitnessCols = require("./witness_cols.js"); const Iterator = require("./iterator.js"); const Context = require("./context.js"); const Runtime = require("./runtime.js"); +// const FunctionCall = require("./function_call.js"); const {FlowAbortCmd, BreakCmd, ContinueCmd, ReturnCmd} = require("./flow_cmd.js") -const {Reference, ExpressionItem, FeValue, IntValue, ProofItem, +const {Reference, ExpressionItem, FeValue, IntValue, ProofItem, Proofval, Subproofval, Challenge, Public, ProofStageItem, ExpressionReference, StringValue, FixedCol, WitnessCol } = require("./expression_items.js"); const fs = require('fs'); const { log2, getKs, getRoots } = require("./utils.js"); @@ -72,16 +73,16 @@ module.exports = class Processor { this.constants = new Indexable('constant', IntValue); this.references.register('constant', this.constants); - this.publics = new Ids('public'); + this.publics = new Ids('public', Public); this.references.register('public', this.publics); - this.challenges = new Ids('challenge'); + this.challenges = new Ids('challenge', Challenge); this.references.register('challenge', this.challenges); - this.proofvalues = new Ids('proofvalue'); + this.proofvalues = new Ids('proofvalue', Proofval); this.references.register('proofvalue', this.proofvalues); - this.subproofvalues = new Ids('subproofvalue'); + this.subproofvalues = new Ids('subproofvalue', Subproofval); this.references.register('subproofvalue', this.subproofvalues); // this.imCols = new Indexable(Fr, 'im'); @@ -647,7 +648,7 @@ module.exports = class Processor { let init = s.sequence; let seq = null; if (init) { - seq = new Sequence(this, init, this.references.get('N')); + seq = new Sequence(this, init, IntValue.castTo(this.references.get('N'))); // console.log(`Extending fixed col ${colname} ...`); seq.extend(); // console.log('SEQ:'+seq.values.join(',')); diff --git a/src/sequence.js b/src/sequence.js index 0886b8a..4dea705 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -23,6 +23,7 @@ module.exports = class Sequence { this.padding = false; this.expression = expression; this.router = new Router(this, 'type', {pre: this.preRoute}); + this.maxSize = typeof maxSize === 'undefined' ? false : Number(maxSize); this.paddingCycleSize = false; this.paddingSize = 0; @@ -59,13 +60,16 @@ module.exports = class Sequence { this.paddingSize = 0; const size = this._sizeOf(e); assert(size >= this.paddingCycleSize, `size(${size}) < paddingCycleSize(${this.paddingCycleSize})`); + console.log(['SIZE(MAXSIZE)', this.maxSize]); + console.log(['SIZE(paddingCycleSize)', this.paddingCycleSize]); + console.log(['SIZE(paddingSize)', this.paddingSize]); if (this.paddingCycleSize) { this.paddingSize = this.maxSize - (size - this.paddingCycleSize); this.size = size - this.paddingCycleSize + this.paddingSize; } else { this.size = size; } - + console.log(['SIZE', this.size]); return this.size; } _sizeOf(e) { @@ -83,7 +87,8 @@ module.exports = class Sequence { return this._sizeOfSeqList(e); } _sizeOfRepeatSeq(e) { - const times = Number(this.parent.getExprNumber(e.times)); + const times = this.toNumber(this.parent.getExprNumber(e.times)); + console.log(['times', times]); return times * this._sizeOf(e.value); } setPaddingSize(size) { @@ -100,17 +105,19 @@ module.exports = class Sequence { return this.setPaddingSize(this._sizeOf(e.value)); } getRangeSeqInfo(e) { - const fromTimes = e.times ? Number(this.e2num(e.times)): 1; - const toTimes = e.toTimes ? Number(this.e2num(e.toTimes)): fromTimes; + const fromTimes = e.times ? this.toNumber(this.e2num(e.times)): 1; + const toTimes = e.toTimes ? this.toNumber(this.e2num(e.toTimes)): fromTimes; + console.log(['fromTimes', fromTimes, 'toTimes', toTimes]); if (fromTimes !== toTimes) { throw new Error(`In range sequence, from(${fromTimes}) and to(${toTimes}) must be same`); } return [this.e2num(e.from), this.e2num(e.to), fromTimes]; } getTermSeqInfo(e) { - const t1Times = e.t1.times ? Number(this.e2num(e.t1.times)): 1; - const t2Times = e.t2.times ? Number(this.e2num(e.t2.times)): 1; - const tnTimes = e.tn.times === false ? false : (e.tn.times ? Number(this.e2num(e.t2.times)): 1); + const t1Times = e.t1.times ? this.toNumber(this.e2num(e.t1.times)): 1; + const t2Times = e.t2.times ? this.toNumber(this.e2num(e.t2.times)): 1; + const tnTimes = e.tn.times === false ? false : (e.tn.times ? this.toNumber(this.e2num(e.t2.times)): 1); + console.log(['t1Times', t1Times, 't2Times', t2Times, 'tnTimes', tnTimes]); if (t1Times !== t2Times && (tnTimes === false || tnTimes === t2Times)) { throw new Error(`In term sequence, t1(${t1Times}), t2(${t2Times})`+ (tnTimes === false ? '':` and tn(${tbTimes}`)+'must be same'); @@ -128,7 +135,7 @@ module.exports = class Sequence { _sizeOfRangeSeq(e) { // TODO review if negative, fe? const [fromValue, toValue, times] = this.getRangeSeqInfo(e); - return Number(toValue > fromValue ? toValue - fromValue + 1n : toValue - fromValue + 1n) * times; + return this.toNumber(toValue > fromValue ? toValue - fromValue + 1n : toValue - fromValue + 1n) * times; } _sizeOfArithSeq(e) { const [t1, t2, tn, times] = this.getTermSeqInfo(e); @@ -138,7 +145,7 @@ module.exports = class Sequence { if ((delta > 0 && tn < t2) || (delta < 0 && tn > t2) || (distance % delta !== 0n)) { throw new Error(`Invalid terms of arithmetic sequence ${t1},${t2}...${tn} at ${this.debug}`); } - return Number(distance/delta + 2n) * times; + return this.toNumber(distance/delta + 2n) * times; } else { return this.setPaddingSize(2); @@ -152,7 +159,7 @@ module.exports = class Sequence { const tfinal = tn === false ? t1 + delta * BigInt(this.paddingSize): tn + delta; console.log({tag: 'XXXXX', tn, tfinal, paddingSize: this.paddingSize}); let value = t1;*/ - const count = tn === false ? this.paddingSize : times * (Number(((tn - t1) / delta)) + 1); + const count = tn === false ? this.paddingSize : times * (this.toNumber(((tn - t1) / delta)) + 1); const finalExtendPos = this.extendPos + count; // console.log({t1, t2, delta, tn, extendPos: this.extendPos, count, finalExtendPos, paddingSize: this.paddingSize}); let value = t1; @@ -165,11 +172,11 @@ module.exports = class Sequence { return count; } calculateGeomN(ratio, ti, tf) { - const ratioAsNum = Number(ratio); + const ratioAsNum = this.toNumber(ratio); const rn = tf/ti; if (rn <= Number.MAX_SAFE_INTEGER) { - return BigInt(Math.round(Math.log(Number(rn))/Math.log(ratioAsNum))); + return BigInt(Math.round(Math.log(this.toNumber(rn))/Math.log(ratioAsNum))); } const key = [ratio, rn].join('_'); @@ -197,7 +204,7 @@ module.exports = class Sequence { value = value / chunkValues[index]; n = n + chunks[index]; } - n = n + BigInt(Math.round(Math.log(Number(value))/Math.log(ratioAsNum))); + n = n + BigInt(Math.round(Math.log(this.toNumber(value))/Math.log(ratioAsNum))); Sequence.cacheGeomN[key] = n; return n; } @@ -244,7 +251,7 @@ module.exports = class Sequence { // console.log({padding, calculateSize, ti, tf, ratio, n, t1, t2, tn}); throw new Error(`ERROR geometric seq calculation ${tf} !== ${ti} * (${ratio} ** ${BigInt(n)})`); } - return [Number(n) + 1, reverse, ti, tf, ratio]; + return [this.toNumber(n) + 1, reverse, ti, tf, ratio]; } _sizeOfGeomSeq(e) { const [t1, t2, tn, times] = this.getTermSeqInfo(e); @@ -302,6 +309,7 @@ module.exports = class Sequence { return this.extendPos - initialExtendPos; } extend() { + console.log(this.size); this.values = new Array(this.size); this.extendPos = 0; this._extend(this.expression); @@ -310,6 +318,7 @@ module.exports = class Sequence { verify() { console.log(this.toString()); console.log([this.extendPos, this.size]); + console.log(['SIZE', this.size]); assert(this.valueCounter === this.size); for (let index = 0; index < size; ++index) { assert(this.values[index] === 'bigint', `type of index ${index} not bigint (${typeof this.values[index]}) ${value}`); @@ -390,4 +399,11 @@ module.exports = class Sequence { toString() { return this.values.join(','); } + toNumber(value) { + let nvalue = Number(value); + if (nvalue === NaN || !isNaN(value)) { + throw new Error(`Invalid number ${value}`); + } + return nvalue; + } } From b757b4b9b8367ab2ed2d7bc2ca796baef489f65a Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Mon, 7 Aug 2023 13:17:15 +0200 Subject: [PATCH 04/33] WIP - refactoring expressions --- src/constraints.js | 3 +- src/expression.js | 166 ++++++++++++++---------- src/expression_items/expression_item.js | 19 +++ src/expression_items/fixed_col.js | 9 +- src/expression_items/proof_item.js | 15 +++ src/expression_items/reference.js | 3 +- src/expression_items/stack_item.js | 3 + src/expression_items/subproofval.js | 4 +- src/expression_items/value_item.js | 1 + src/ids.js | 4 +- src/indexable.js | 17 ++- src/processor.js | 37 ++++-- src/proto_out.js | 1 + src/references.js | 7 +- src/runtime.js | 2 - src/sequence.js | 20 +-- src/values.js | 49 +++++++ 17 files changed, 252 insertions(+), 108 deletions(-) create mode 100644 src/values.js diff --git a/src/constraints.js b/src/constraints.js index 55b9ad0..4b86a27 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -33,6 +33,7 @@ module.exports = class Constraints { return this.expressions.getPackedExpressionId(id, container, options); } define(left, right, boundery, sourceRef) { + console.log(left, right); assertLog(left instanceof Expression, left); assertLog(right instanceof Expression, right); if (left.isRuntime()) { @@ -50,7 +51,7 @@ module.exports = class Constraints { if (right.eval() !== 0n) { left.insert('sub', right); } - left.simplify(); + // left.simplify(); const exprId = this.expressions.insert(left); return this.constraints.push({exprId, sourceRef, boundery}) - 1; } diff --git a/src/expression.js b/src/expression.js index 809b8ad..6333233 100644 --- a/src/expression.js +++ b/src/expression.js @@ -10,7 +10,13 @@ const ValueItem = require("./expression_items/value_item.js"); const IntValue = require("./expression_items/int_value.js"); const FeValue = require("./expression_items/fe_value.js"); const ProofItem = require("./expression_items/proof_item.js"); -// const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); +const Subproofval = require("./expression_items/subproofval.js"); +const Proofval = require("./expression_items/proofval.js"); +const WitnessCol = require("./expression_items/witness_col.js"); +const RuntimeItem = require("./expression_items/runtime_item.js"); +const FixedCol = require("./expression_items/fixed_col.js"); +const Public = require("./expression_items/public.js"); +const Challenge = require("./expression_items/challenge.js"); const OP_VALUE = 'value'; const OP_ID_REF = 'idref'; const OP_STACK = 'stack'; @@ -238,7 +244,7 @@ module.exports = class Expression extends ExpressionItem { // let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; // this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); let operandA = aIsEmpty ? [] : [new StackItem(1)]; - this.stack.push({op, operands: [operandA, b.cloneAlone()]}); + this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); return this; } @@ -424,12 +430,15 @@ module.exports = class Expression extends ExpressionItem { // in stackResults[pos][1] contains a results array of this stack position operands instance() { this.dump(); - let dup = this.clone(); + let cloned = this.clone(); const options = {instance: true} - let stackResults = dup.evaluateOperands(options); + let stackResults = cloned.evaluateOperands(options); // dup.extendExpressions(options); - dup.evaluateFullStack(stackResults, options); + cloned.evaluateFullStack(stackResults, options); + cloned.dump(); console.log(stackResults); + cloned.dumpStackResults(stackResults, ''); + return cloned; } eval() { if (this.stack.length === 0) { @@ -493,6 +502,8 @@ module.exports = class Expression extends ExpressionItem { value = null; } else if (st.op === false) { value = values[0]; + } else if (values.some(value => value instanceof ProofItem)) { + value = null; } else { value = this.applyOperation(st.op, values); } @@ -597,22 +608,25 @@ module.exports = class Expression extends ExpressionItem { let stackResults = []; for (let stpos = 0; stpos < this.stack.length; ++stpos) { let results = [null, []]; + const st = this.stack[stpos]; stackResults.push(results); let operandResults = results[1]; - for (let ope of this.stack[stpos].operands) { + console.log(st.operands); + for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { + const operand = st.operands[operandIndex]; let next = 0; // if no prior defined priorValue was 0 - let priorValue = this.evaluateValueAsNumber(ope.prior, options); + let priorValue = this.evaluateValueAsNumber(operand.prior, options); - let result = this.evaluateValue(ope, stackResults, options); + let result = this.evaluateValue(operand, options); console.log(['RESULT', result]); - let indexes = this.evaluateValuesAsNumbers(ope.indexes, options); + let indexes = this.evaluateValuesAsNumbers(operand.indexes, options); if (indexes.length) { // TODO: fixed access result = this.getArrayResult(result, indexes, options); } // if no prior defined nextValue was 0 - let nextValue = this.evaluateValueAsNumber(ope.next, options); + let nextValue = this.evaluateValueAsNumber(operand.next, options); // prior and next are excl if (priorValue && nextValue) { @@ -620,6 +634,9 @@ module.exports = class Expression extends ExpressionItem { } next = nextValue - priorValue; operandResults.push(result); + if (options.instance && result !== null) { + st.operands[operandIndex] = result; + } } } return stackResults; @@ -893,21 +910,32 @@ module.exports = class Expression extends ExpressionItem { // positional_param op:'positional_param' position: // casting op:'cast' cast: value: dim: ?? }*/ - dump(title) { - // console.trace(); + getCaller(stackLevels = 3) { let caller = ''; try { throw new Error(); } catch (e) { - caller = e.stack.split('\n')[2].trim().substring(3); - } - title = title ? `(${title}) `:''; - console.log(`\x1B[38;5;214m|==========> DUMP ${title}${caller} <==========|\x1B[0m`); - for (let index = this.stack.length-1; index >=0; --index) { - const st = this.stack[index]; - let info =`\x1B[38;5;214m#${index} ${st.op}`; - for (const operand of st.operands) { - info = info + ' [\x1B[38;5;76m' + this.dumpOperand(operand,index)+'\x1B[38;5;214m]'; + caller = e.stack.split('\n')[stackLevels].trim().substring(3); + } + return caller; + } + dump(title) { + return this.dumpStack(`DUMP (${title ?? ''})`, this.stack); + } + dumpStackResults(stackResults, title = '') { + return this.dumpStack(`STACK RESULTS (${title ?? ''})`, stackResults, 0, 1); + } + dumpStack(title, stack, stackProperty = 'op', operandsProperty = 'operands') { + title = title + ' ' + this.getCaller(); + console.log(`\x1B[38;5;214m|==========> ${title} <==========|\x1B[0m`); + for (let index = stack.length-1; index >=0; --index) { + const st = stack[index]; + const stackValue = st[stackProperty]; + const operationInfo = (stackValue && typeof stackValue.dump === 'function') ? stackValue.dump() : stackValue; + let info =`\x1B[38;5;214m#${index} ${stackValue}`; + for (const operand of st[operandsProperty]) { + const operandInfo = this.dumpOperand(operand, index); + info = info + ' [\x1B[38;5;76m' + operandInfo +'\x1B[38;5;214m]'; } console.log(info+'\x1B[0m'); } @@ -917,8 +945,10 @@ module.exports = class Expression extends ExpressionItem { const cProp = '\x1B[38;5;250m'; const cValue = '\x1B[38;5;40m'; if (op instanceof ExpressionItem) { - return op.dump({cType, cProp, cValue}); + return op.dump({cType, cProp, cValue, pos}); } + if (op === null) return 'null'; + switch (op.type) { case OP_VALUE: return `${cType}VALUE ${cValue}${op.value}`; @@ -954,7 +984,7 @@ module.exports = class Expression extends ExpressionItem { if (top < 0) { return '(empty expression)'; } - return this.stackPosToString(top ,0, options); + return this.stackPosToString(top ,0, {...options, dumpToString: true}); } stackPosToString(pos, pprec, options) { const st = this.stack[pos]; @@ -982,7 +1012,10 @@ module.exports = class Expression extends ExpressionItem { return res; } operandToString(ope, pos, pprec, options) { - return ope.dump(); + if (ope instanceof StackItem) { + return this.stackPosToString(pos-ope.offset, pprec, options); + } + return ope.dump(options); /* switch (ope.type) { @@ -1044,62 +1077,51 @@ module.exports = class Expression extends ExpressionItem { } operandPack(container, ope, pos, options) { - switch (ope.type) { - case OP_VALUE: - container.pushConstant(ope.value); - break; - - case OP_ID_REF: - this.referencePack(container, ope.refType, ope.id, ope.next, ope.stage, options); - break; - - case OP_STACK: - // TODO: expression == false; - const eid = this.stackPosPack(container, pos-ope.offset, options); - if (eid !== false) { // eid === false => alone operand - container.pushExpression(eid); - } - break; - - default: - console.log(ope); - throw new Error(`Invalid reference ${ope.type} on packed expression`); + if (ope instanceof ValueItem) { + container.pushConstant(ope.value); + } else if (ope instanceof ProofItem) { + this.referencePack(container, ope, options); + } else if (ope instanceof StackItem) { + const eid = this.stackPosPack(container, pos-ope.getOffset(), options); + if (eid !== false) { // eid === false => alone operand + container.pushExpression(eid); + } + } else { + const opeType = ope instanceof Object ? ope.constructor.name : typeof ope; + throw new Error(`Invalid reference ${opeType} on packed expression`); } } - referencePack(container, type, id, next, stage, options) { - // TODO stage - switch (type) { - case 'im': - container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); - break; - - case 'witness': - container.pushWitnessCol(id, next ?? 0, stage ?? 1); // TODO: stage - break; + referencePack(container, ope, options) { + // TODO stage expression + // container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); + // break; + const id = ope.getId(); + if (ope instanceof WitnessCol) { + // container.pushWitnessCol(id, next ?? 0, stage ?? 1) + container.pushWitnessCol(id, ope.getNext(), ope.getStage()); - case 'fixed': - container.pushFixedCol(id, next ?? 0); - break; + } else if (ope instanceof FixedCol) { + // container.pushFixedCol(id, next ?? 0); + container.pushFixedCol(id, ope.getNext()); - case 'public': - container.pushPublicValue(id); - break; + } else if (ope instanceof Public) { + // container.pushPublicValue(id) + container.pushPublicValue(id); - case 'challenge': - container.pushChallenge(id, stage ?? 1); - break; + } else if (ope instanceof Challenge) { + // container.pushChallenge(id, stage ?? 1); + container.pushChallenge(id, ope.getStage()); - case 'subproofvalue': - container.pushSubproofValue(id/*, subproofId*/); - break; + } else if (ope instanceof Proofval) { + // container.pushProofValue(id) + container.pushProofValue(id); - case 'proofvalue': - container.pushProofValue(id); - break; - - default: - throw new Error(`Invalid reference type ${type} to pack`); + } else if (ope instanceof Subproofval) { + // container.pushSubproofValue(id) + container.pushSubproofValue(id); + } else { + throw new Error(`Invalid reference class ${ope.constructor.name} to pack`); } } resolve() { diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 859457f..9e3549f 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -1,4 +1,6 @@ module.exports = class ExpressionItem { + static _classToManager = {}; + dump(options) { return `${this.constructor.name}()`; } @@ -6,4 +8,21 @@ module.exports = class ExpressionItem { console.log(this); throw new Error(`FATAL: use type obsolete-property`) } + getNext() { + return this.next ?? 0; + } + getNextStrings(options) { + const next = this.getNext(); + const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; + const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; + return [pre,post]; + } + static setManager(cls, manager) { + console.log(['SET_MANAGER', cls.name]); + ExpressionItem._classToManager[cls.name] = manager; + } + getManager() { + console.log(['GET_MANAGER', this.constructor.name]); + return ExpressionItem._classToManager[this.constructor.name]; + } } diff --git a/src/expression_items/fixed_col.js b/src/expression_items/fixed_col.js index 62db10e..669424f 100644 --- a/src/expression_items/fixed_col.js +++ b/src/expression_items/fixed_col.js @@ -1,5 +1,5 @@ const ProofItem = require("./proof_item.js"); -const Sequence = require("../sequence.js"); +// const Sequence = require("../sequence.js"); module.exports = class FixedCol extends ProofItem { constructor (id) { super(id); @@ -21,7 +21,8 @@ module.exports = class FixedCol extends ProofItem { return this.sequence.getValue(row); } set(value) { - /* if (value instanceof Sequence) { + // REVIEW: cyclic references + if (value instanceof Object) { if (this.sequence !== null) { EXIT_HERE; } @@ -29,12 +30,12 @@ module.exports = class FixedCol extends ProofItem { EXIT_HERE; } this.sequence = value; - this.rows = this.sequence.values.length; + this.rows = this.sequence.size; } else { console.log(value); EXIT_HERE; - }*/ + } } clone() { let cloned = new FixedCol(this.id); diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 420d31c..dd11aec 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -7,5 +7,20 @@ module.exports = class ProofItem extends ExpressionItem { getId() { return this.id; } + getLabel(options) { + const manager = this.getManager(); + if (!manager) return ''; + return manager.getLabel(this.id, options); + } + dump(options) { + const [pre,post] = this.getNextStrings(); + options = options ?? {}; + const defaultType = options.type ? options.type : this.constructor.name; + if (!options.label && !options.hideLabel && options.dumpToString) { + options = {...options, label: this.getLabel(options)}; + } + const label = options.label ? options.label : `${defaultType}@${this.id}`; + return `${pre}${label}${post}`; + } } diff --git a/src/expression_items/reference.js b/src/expression_items/reference.js index fbdaae9..f59de48 100644 --- a/src/expression_items/reference.js +++ b/src/expression_items/reference.js @@ -7,8 +7,7 @@ module.exports = class Reference extends RuntimeItem { this.next = Number(next ?? 0); } dump(options) { - const pre = this.next < 0 ? (this.next < -1 ? `${-this.next}'`:"'"):''; - const post = this.next > 0 ? (this.next > 1 ? `'${this.next}`:"'"):''; + const [pre,post] = this.getNextStrings(); return `Reference(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; } clone() { diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js index 908d85c..763676f 100644 --- a/src/expression_items/stack_item.js +++ b/src/expression_items/stack_item.js @@ -15,4 +15,7 @@ module.exports = class StackItem extends ExpressionItem { clone() { return new StackItem(this.offset); } + dump(options) { + return `StackItem(${this.offset})`; + } } diff --git a/src/expression_items/subproofval.js b/src/expression_items/subproofval.js index 913e28f..838decf 100644 --- a/src/expression_items/subproofval.js +++ b/src/expression_items/subproofval.js @@ -1,5 +1,5 @@ -const ProofStageItem = require("./proof_stage_item.js"); -module.exports = class Subproofval extends ProofStageItem { +const ProofItem = require("./proof_item.js"); +module.exports = class Subproofval extends ProofItem { constructor (id, stage) { super(id, stage); } diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index 589b783..50ffc0e 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -1,6 +1,7 @@ const ExpressionItem = require("./expression_item.js"); module.exports = class ValueItem extends ExpressionItem { + static directValue = true; constructor (value) { super(); this.value = value; diff --git a/src/ids.js b/src/ids.js index 482e408..62bee55 100644 --- a/src/ids.js +++ b/src/ids.js @@ -1,6 +1,6 @@ const LabelRanges = require('./label_ranges.js'); const ExpressionItem = require('./expression_items/expression_item.js'); -const {assert,assertLog} = require('./assert.js') +const {assert,assertLog} = require('./assert.js'); module.exports = class Ids { constructor (type, cls) { @@ -28,7 +28,7 @@ module.exports = class Ids { } getTypedValue(id, offset = 0) { - return { type: this.type, value: id + offset }; + return new this.cls(id + offset); } isDefined(id) { diff --git a/src/indexable.js b/src/indexable.js index 9f3bf83..297cfab 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -3,7 +3,7 @@ const {cloneDeep} = require('lodash'); const {assert, assertLog} = require('./assert.js'); module.exports = class Indexable { constructor (type, cls, rtype) { - this.cls = cls; + this.cls = cls ?? false; this.values = []; this.type = type; this.rtype = rtype ?? type; @@ -68,6 +68,7 @@ module.exports = class Indexable { if (typeof res === 'undefined') { res = this.undefined; } else { + console.log(this.cls); assertLog(!this.cls || res instanceof this.cls, [this.cls.constructor.name, res]); } if (this.debug) { @@ -82,7 +83,7 @@ module.exports = class Indexable { getTypedValue(id) { // const res = { type: this.rtype, value: this.get(id) }; - console.log(['getTypedValue', this.type, this.cls.constructor.name, id]); + console.log(['getTypedValue', this.type, this.cls ? this.cls.constructor.name : 'no-class', id]); return this.get(id); } @@ -98,9 +99,19 @@ module.exports = class Indexable { } set(id, value) { + if (this.type === 'fixed') { + console.log('FIXED_SET', value); + } if (typeof this.cls === 'function') { if ((value instanceof this.cls) === false) { - value = new this.cls(value); + if (this.cls.directValue) { + value = new this.cls(value); + } else { + let initValue = value; + value = new this.cls(id); + console.log(value); + value.set(initValue); + } } } this.values[id] = value; diff --git a/src/processor.js b/src/processor.js index c4ccc26..591ff7c 100644 --- a/src/processor.js +++ b/src/processor.js @@ -1,4 +1,4 @@ -const {assert} = require("chai"); +const {assert, assertLog} = require('./assert.js'); const Scope = require("./scope.js"); const Expressions = require("./expressions.js"); const Expression = require("./expression.js"); @@ -64,31 +64,37 @@ module.exports = class Processor { this.references.register('lexpr', this.lexprs); this.fixeds = new Indexable('fixed', FixedCol); + ExpressionItem.setManager(FixedCol, this.fixeds); this.fixeds.runtimeRows = true; this.references.register('fixed', this.fixeds); this.witness = new Indexable('witness', WitnessCol); + ExpressionItem.setManager(WitnessCol, this.witness); this.references.register('witness', this.witness); this.constants = new Indexable('constant', IntValue); this.references.register('constant', this.constants); this.publics = new Ids('public', Public); + ExpressionItem.setManager(Public, this.publics); this.references.register('public', this.publics); this.challenges = new Ids('challenge', Challenge); + ExpressionItem.setManager(Challenge, this.challenges); this.references.register('challenge', this.challenges); this.proofvalues = new Ids('proofvalue', Proofval); + ExpressionItem.setManager(Proofval, this.proofvalues); this.references.register('proofvalue', this.proofvalues); this.subproofvalues = new Ids('subproofvalue', Subproofval); + ExpressionItem.setManager(Subproofval, this.subproofvalues); this.references.register('subproofvalue', this.subproofvalues); // this.imCols = new Indexable(Fr, 'im'); // this.references.register('im', this.imCols); - this.functions = new Indexable(Fr, 'function'); + this.functions = new Indexable('function'); this.references.register('function', this.functions); this.subproofs = new Subproofs(Fr, this.context); @@ -169,9 +175,7 @@ module.exports = class Processor { for (const airName of subproof.airs) { const air = subproof.airs.get(airName); console.log(airName); - console.log(air); const bits = log2(Number(air.rows)); - console.log(airName); proto.setAir(airName, air.rows); proto.setFixedCols(air.fixeds); air.expressions.dump('EXPRESSION PILOUT '+subproofName); @@ -267,7 +271,7 @@ module.exports = class Processor { } execCall(st) { const name = st.function.name; - const func = this.builtIn[name] ?? (this.references.getTypedValue(name) || {}).value; + const func = this.builtIn[name] ?? this.references.getTypedValue(name); if (func) { this.callstack.push(st.debug); @@ -645,7 +649,7 @@ module.exports = class Processor { const colname = this.context.getFullName(col.name); // console.log(`COL_FIXED_DECLARATION(${colname})`); const lengths = this.decodeLengths(col); - let init = s.sequence; + let init = s.sequence ?? null; let seq = null; if (init) { seq = new Sequence(this, init, IntValue.castTo(this.references.get('N'))); @@ -760,7 +764,13 @@ module.exports = class Processor { } const res = this.references.declare(name, type, lengths, data); if (initValue !== null) { + if (type === 'fixed') { + console.log('FIXED-SET', initValue.getValue(0), initValue.getValue(1)); + } this.references.set(name, [], initValue); + if (type === 'fixed') { + console.log('FIXED-SET', this.fixeds.values[0]); + } } return res; } @@ -778,6 +788,14 @@ module.exports = class Processor { const scopeType = this.scope.getInstanceType(); let id, expr, prefix = ''; + assertLog(s.left instanceof Expression, s.left); + assertLog(s.right instanceof Expression, s.right); + console.log(s.left); + console.log(s.right); + const left = s.left.instance(); + console.log(left); + const right = s.right.instance(); + console.log(right); if (scopeType === 'air') { id = this.constraints.define(s.left.instance(true), s.right.instance(true),false,this.sourceRef); expr = this.constraints.getExpr(id); @@ -846,9 +864,10 @@ module.exports = class Processor { throw new Error(`Array size mismatch on initialization ${asize} vs ${ssize}`); } // TODO, check sizes before extends - const values = seq.extend(); - for (let index = 0; index < values.length; ++index) { - this.references.set(s.name, def.array.offsetToIndexes(index), values[index]); + seq.extend(); + const seqSize = seq.getSize(); + for (let index = 0; index < seqSize; ++index) { + this.references.set(s.name, def.array.offsetToIndexes(index), seq.getValue(index)); } } else { this.references.declare(s.name, 'constant', [], { sourceRef: this.sourceRef }); diff --git a/src/proto_out.js b/src/proto_out.js index 11a1dc7..83aa70a 100644 --- a/src/proto_out.js +++ b/src/proto_out.js @@ -398,6 +398,7 @@ module.exports = class ProtoOut { return Buffer.alloc(0); } + console.log(value); const buf = Buffer.alloc(32); buf.writeBigInt64BE(value >> 64n*3n, 0); buf.writeBigUInt64BE((value >> 64n*2n) & 0xFFFFFFFFFFFFFFFFn, 8); diff --git a/src/references.js b/src/references.js index 0689c24..372d47a 100644 --- a/src/references.js +++ b/src/references.js @@ -290,7 +290,6 @@ module.exports = class References { if (typeof indexes === 'undefined') indexes = []; const [instance, info, def] = this._getInstanceAndLocator(name, indexes); - console.log(info); let tvalue; if (info.array) { // array info, could not be resolved @@ -301,8 +300,10 @@ module.exports = class References { console.log([instance.constructor.name, info.type]); tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); } - assertLog(tvalue instanceof ExpressionItem, {name, tvalue}); - console.log(tvalue); + // TODO: review + if (info.type !== 'function') { + assertLog(tvalue instanceof ExpressionItem, {name, tvalue}); + } if (typeof info.row !== 'undefined') { tvalue.row = info.row; } diff --git a/src/runtime.js b/src/runtime.js index 7803935..a8fb38f 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -46,7 +46,6 @@ module.exports = class Runtime { if (operand.dec === 'post') { getTypeValueOptions.postDelta = -1n; } - console.log(names, operand.__indexes ?? [], options); let res = this.context.references.getTypedValue(names, operand.__indexes ?? [], options); if (typeof operand.__next !== 'undefined') { res.__next = res.next = operand.__next; @@ -56,7 +55,6 @@ module.exports = class Runtime { } else if (typeof operand.next === 'number' && operand.next) { res.next = operand.next; } - console.log(res); return res; } } diff --git a/src/sequence.js b/src/sequence.js index 4dea705..75e1aaa 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -1,6 +1,7 @@ const {assert, assertLog} = require("./assert.js"); const Router = require("./router.js"); const Expression = require("./expression.js"); +const Values = require('./values.js'); const MAX_ELEMS_GEOMETRIC_SEQUENCE = 300; class SequencePadding { @@ -9,8 +10,9 @@ class SequencePadding { this.size = size; } } -console.log("LOADING SEQUENCE"); module.exports = class Sequence { + #values; + static cacheGeomN = []; // TODO: Review compiler estructures // TODO: iterator of values without "extend" @@ -19,7 +21,7 @@ module.exports = class Sequence { constructor (parent, expression, maxSize) { this.parent = parent; - this.values = []; + this.#values = new Values(); this.padding = false; this.expression = expression; this.router = new Router(this, 'type', {pre: this.preRoute}); @@ -34,13 +36,15 @@ module.exports = class Sequence { } clone() { let cloned = new Sequence(this.parent, this.expression, this.maxSize); + this.#values.mutable = false; + cloned.#values = this.#values.clone(); return cloned; } preRoute(method, e) { if (e.debug) this.debug = e.debug; } getValue(index) { - return this.values[index]; + return this.#values.getValue(index); } setValue(index, value) { /* assert(this.extendPos >= 0 && (this.maxSize === false || this.extendPos < this.maxSize), @@ -49,11 +53,11 @@ module.exports = class Sequence { if ((index >= 0 && (this.maxSize === false || index < this.maxSize) === false)) { console.log(`\x1B[33mERROR Invalid value of extendPos:${index} maxSize:${this.maxSize} ${this.debug}\x1B[0m`); } - if (typeof this.values[index] !== 'undefined') { + if (typeof this.#values.getValue(index) !== 'undefined') { console.log(`\x1B[33mERROR Rewrite index position:${index} ${this.debug}\x1B[0m`); } ++this.valueCounter; - return this.values[index] = value; + return this.#values.setValue(index, value); } sizeOf(e) { this.paddingCycleSize = false; @@ -310,10 +314,10 @@ module.exports = class Sequence { } extend() { console.log(this.size); - this.values = new Array(this.size); + // this.values = new Array(this.size); this.extendPos = 0; this._extend(this.expression); - return this.values; + this.#values.mutable = false; } verify() { console.log(this.toString()); @@ -357,7 +361,7 @@ module.exports = class Sequence { let upto = remaingValues >= seqSize ? seqSize : remaingValues; // console.log(`SETTING UPTO ${upto} ${remaingValues} ${seqSize}`); for (let index = 0; index < upto; ++index) { - this.setValue(this.extendPos++, this.values[from + index]); + this.setValue(this.extendPos++, this.#values.getValue(from + index)); } remaingValues = remaingValues - upto; } diff --git a/src/values.js b/src/values.js new file mode 100644 index 0000000..3bf5323 --- /dev/null +++ b/src/values.js @@ -0,0 +1,49 @@ +const {assert, assertLog} = require("./assert.js"); + +module.exports = class Values { + #values; + #mutable; + constructor () { + this.#values = []; + this.#mutable = true; + } + get mutable() { + return this.#mutable; + } + set mutable(value) { + let _value = Boolean(value); + if (_value === this.#mutable) { + return; + } + if (value) { + this.cloneValues(); + } + this.#mutable = value; + } + clone(cloneValues = false, cloneEachValue = true) { + let cloned = new Values(); + cloned.#values = this.#values; + if (this.#mutable || cloneValues) { + cloned.cloneValues(cloneEachValue); + } else { + cloned.#mutable = false; + } + return cloned; + } + cloneValues(cloneEachValue = true) { + let _values = this.#values; + this.#values = []; + for(const _value of _values) { + this.#values.push((cloneEachValue && _value && typeof _value.clone === 'function') ?_value.clone() : _value); + } + } + setValue(irow, value) { + if (!this.#mutable) { + throw new Error(`modifying an inmutable values irow = ${row} and value = ${value}`); + } + this.#values[irow] = value; + } + getValue(irow) { + return this.#values[irow]; + } +} From ed20bc5d93c4cc5bcbf3c868667eebda98f19710 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 8 Aug 2023 09:06:31 +0200 Subject: [PATCH 05/33] WIP - refactoring expressions --- src/expression.js | 38 +++++++++++++------------ src/expression_items/expression_item.js | 24 +++++++++++++++- src/expression_items/int_value.js | 2 +- src/expression_items/stack_item.js | 3 ++ src/expression_items/witness_col.js | 7 ++++- src/fixed_cols.js | 3 ++ src/indexable.js | 27 +++++++++++------- src/processor.js | 4 +-- src/references.js | 2 +- src/variables.js | 4 +-- src/witness_cols.js | 7 ++++- 11 files changed, 84 insertions(+), 37 deletions(-) diff --git a/src/expression.js b/src/expression.js index 6333233..b3731f9 100644 --- a/src/expression.js +++ b/src/expression.js @@ -436,8 +436,11 @@ module.exports = class Expression extends ExpressionItem { // dup.extendExpressions(options); cloned.evaluateFullStack(stackResults, options); cloned.dump(); - console.log(stackResults); - cloned.dumpStackResults(stackResults, ''); + console.log('SIMPLIFY'); + cloned.simplify(); + cloned.dump(); + // console.log(stackResults); + // cloned.dumpStackResults(stackResults, ''); return cloned; } eval() { @@ -714,14 +717,14 @@ module.exports = class Expression extends ExpressionItem { if (!updated) break; } } - simplifyRuntimeToValue(st) { + /* simplifyRuntimeToValue(st) { for (let index = 0; index < st.operands.length; ++index) { const value = st.operands[index].__value; if (['string', 'number', 'bigint'].includes(value)) { st.operands[index] = {type: OP_VALUE, value}; } } - } + }*/ // this method simplify trivial operations as 0 + x or 1 * x, also // simplify operations between values, not only direct values also @@ -732,9 +735,9 @@ module.exports = class Expression extends ExpressionItem { return false; } - this.simplifyRuntimeToValue(st); - const firstValue = st.operands[0].type === OP_VALUE ? st.operands[0].value : false; - const secondValue = (st.operands.length > 1 && st.operands[1].type === OP_VALUE) ? st.operands[1].value : false; + // this.simplifyRuntimeToValue(st); + const firstValue = st.operands[0] instanceof ValueItem ? st.operands[0].getValue() : false; + const secondValue = (st.operands.length > 1 && st.operands[1] instanceof ValueItem) ? st.operands[1].getValue() : false; // [op,v1,v2] ==> [v1 op v2] if (firstValue !== false && secondValue !== false) { @@ -742,11 +745,10 @@ module.exports = class Expression extends ExpressionItem { assert(!secondValue || (!secondValue.next && !secondValue.__next)); const res = this.calculate(st); if (res === null) return false; - st.operands = [{type: OP_VALUE, value: res}]; + // TODO: operations with FE ? + console.log(res); + st.operands = new IntValue(res); st.op = false; - delete st.__value; - delete st.__indexes; - delete st.__next; return true; } @@ -754,7 +756,7 @@ module.exports = class Expression extends ExpressionItem { if (st.op === 'neg' && firstValue !== false) { assert(!firstValue.next && !firstValue.__next); st.op = false; - st.operands[0].value = -st.operands[0].value; + st.operands[0].setValue(-st.operands[0].getValue()); return true; } @@ -824,7 +826,7 @@ module.exports = class Expression extends ExpressionItem { const ope = st.operands[0]; // two situations, for alone stack reference, use its reference and it must // be purged - translate[istack] = ope.type === OP_STACK ? [true, translate[istack - ope.offset][1]] : [true, istack]; + translate[istack] = ope instanceof StackItem ? [true, translate[ope.getAbsolutePos(istack)][1]] : [true, istack]; continue; } @@ -833,19 +835,19 @@ module.exports = class Expression extends ExpressionItem { // foreach operand if it's a stack reference, must be replaced by // new reference or by copy of reference if it was alone (no operation) for (let iope = 0; iope < st.operands.length; ++iope) { - if (st.operands[iope].type !== OP_STACK) continue; - const absolutePos = istack - st.operands[iope].offset; + if ((st.operands[iope] instanceof StackItem) === false) continue; + const absolutePos = st.operands[iope].getAbsolutePos(istack); const [purge, newAbsolutePos] = translate[absolutePos]; assert(absolutePos < istack); if (purge && this.stack[newAbsolutePos].op === false) { // if purge and referenced position was alone, it is copied (duplicated) - this.stack[istack].operands[iope] = cloneDeep(this.stack[newAbsolutePos].operands[0]); + this.stack[istack].operands[iope] = this.stack[newAbsolutePos].operands[0].clone(); } else { // stackPos - 1 is new really istack after clear simplified stack positions // calculate relative position (offset) const newOffset = (stackPos - 1) - newAbsolutePos; assert(newOffset > 0); - this.stack[istack].operands[iope].offset = newOffset; + this.stack[istack].operands[iope].setOffset(newOffset); } } @@ -910,7 +912,7 @@ module.exports = class Expression extends ExpressionItem { // positional_param op:'positional_param' position: // casting op:'cast' cast: value: dim: ?? }*/ - getCaller(stackLevels = 3) { + getCaller(stackLevels = 4) { let caller = ''; try { throw new Error(); diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 9e3549f..126b40a 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -1,3 +1,25 @@ +/* next indexes Parent Item Definition + ---- ------- -------------- -------------- --------------------------------------------- + Challenge - * ProofStageItem id id + stage [used] + ExpressionReference * * RuntimeItem id id [const,use] + FeValue - - ValueItem value value (fe) [const] + IntValue - - ValueItem value value (bigint) [const] + FixedCol - * ProofItem id id [used] + FunctionCall * ? RuntimeItem "id",argValues FunctionDefinition: name,args,return,statements + Proofval - * ProofItem id id [used] + Public - * ProofItem id id [used] + Publictable - * ProofItem id id + numCols,maxRows,aggType,rowExpressionId [used] + *PublictableCol - * ProofItem id,colId [const, used] + Reference * * RuntimeItem name name + type, instance, etc. + StackItem - - ExpressionItem offset - + StringValue - - RuntimeItem value value (string) [const, used] + Subproofval - * ProofItem id id + subproofId [used] + WitnessCol * * ProofStageItem id id + stage [used] + + ExpressionItem > ProofItem > ProofStageItem + > RuntimeItem + > ValueItem +*/ module.exports = class ExpressionItem { static _classToManager = {}; @@ -12,7 +34,7 @@ module.exports = class ExpressionItem { return this.next ?? 0; } getNextStrings(options) { - const next = this.getNext(); + const next = this.getNext(options); const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; return [pre,post]; diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index e336922..682635f 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -20,7 +20,7 @@ module.exports = class IntValue extends ValueItem { this.value = value; } clone() { - return new IntValue(value); + return new IntValue(this.value); } static castTo(value) { if (value instanceof IntValue) { diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js index 763676f..fa600e4 100644 --- a/src/expression_items/stack_item.js +++ b/src/expression_items/stack_item.js @@ -12,6 +12,9 @@ module.exports = class StackItem extends ExpressionItem { this.offset = value; return value; } + getAbsolutePos(currentPos) { + return currentPos - this.offset; + } clone() { return new StackItem(this.offset); } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index 4b57e6f..9abc538 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,9 +1,14 @@ const ProofStageItem = require("./proof_stage_item.js"); +const {assert, assertLog} = require('../assert.js'); module.exports = class WitnessCol extends ProofStageItem { constructor (id, stage = 1) { + assert(typeof id !== 'undefined'); super(id, stage); + console.log('CONSTRUCTOR_WITNESS', id, this.id); } clone() { - return new WitnessCol(this.id, this.stage); + let cloned = new WitnessCol(this.id, this.stage); + console.log('CLONE_WITNESS:', this, cloned); + return cloned; } } diff --git a/src/fixed_cols.js b/src/fixed_cols.js index 8e8331c..4c02698 100644 --- a/src/fixed_cols.js +++ b/src/fixed_cols.js @@ -5,4 +5,7 @@ module.exports = class FixedCols extends Indexable { constructor () { super('fixed', FixedCol); } + getEmptyValue(id) { + return new FixedCol(id); + } } diff --git a/src/indexable.js b/src/indexable.js index 297cfab..e726608 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -2,11 +2,12 @@ const LabelRanges = require("./label_ranges.js"); const {cloneDeep} = require('lodash'); const {assert, assertLog} = require('./assert.js'); module.exports = class Indexable { - constructor (type, cls, rtype) { + constructor (type, cls, options) { this.cls = cls ?? false; this.values = []; this.type = type; - this.rtype = rtype ?? type; + this.options = options ?? {} + this.rtype = this.options.rtype ?? type; this.labelRanges = new LabelRanges(); this.debug = false; this._undefined = null; @@ -23,6 +24,9 @@ module.exports = class Indexable { return this._undefined; } getEmptyValue(id) { + if (this.options.idAsValue) { + return id; + } return this.undefined; } @@ -49,14 +53,14 @@ module.exports = class Indexable { getType(id) { return this.rtype; } - reserve(count, label, multiarray) { + reserve(count, label, multiarray, options) { const id = this.values.length; for (let index = 0; index < count; ++index) { const absoluteIndex = index + id; - this.values[absoluteIndex] = this.getEmptyValue(absoluteIndex); - if (this.debug) { + this.values[absoluteIndex] = this.getEmptyValue(absoluteIndex, options); + // if (this.debug) { console.log(`INIT ${this.constructor.name}.${this.type} @${absoluteIndex} (${id}+${index}) ${this.values[absoluteIndex]} LABEL:${label}`); - } + // } } if (label) { this.labelRanges.define(label, id, multiarray); @@ -65,15 +69,18 @@ module.exports = class Indexable { } get(id) { let res = this.values[id]; - if (typeof res === 'undefined') { + console.log(res); + if (typeof res === 'undefined' || res === null) { res = this.undefined; } else { - console.log(this.cls); - assertLog(!this.cls || res instanceof this.cls, [this.cls.constructor.name, res]); + assertLog(!this.cls || res instanceof this.cls, [this.cls.name, res]); } if (this.debug) { console.log(`GET ${this.constructor.name}.${this.type} @${id} ${res}`); } + if (res && typeof res.clone === 'function') { + return res.clone(); + } return res; } @@ -83,7 +90,7 @@ module.exports = class Indexable { getTypedValue(id) { // const res = { type: this.rtype, value: this.get(id) }; - console.log(['getTypedValue', this.type, this.cls ? this.cls.constructor.name : 'no-class', id]); + console.log(['getTypedValue', this.type, this.cls ? this.cls.name : 'no-class', id, this.values.length]); return this.get(id); } diff --git a/src/processor.js b/src/processor.js index 591ff7c..7d81d11 100644 --- a/src/processor.js +++ b/src/processor.js @@ -63,12 +63,12 @@ module.exports = class Processor { this.lexprs = new Variables('lexpr', Expression); this.references.register('lexpr', this.lexprs); - this.fixeds = new Indexable('fixed', FixedCol); + this.fixeds = new FixedCols(); ExpressionItem.setManager(FixedCol, this.fixeds); this.fixeds.runtimeRows = true; this.references.register('fixed', this.fixeds); - this.witness = new Indexable('witness', WitnessCol); + this.witness = new WitnessCols(); ExpressionItem.setManager(WitnessCol, this.witness); this.references.register('witness', this.witness); diff --git a/src/references.js b/src/references.js index 372d47a..ad6caa9 100644 --- a/src/references.js +++ b/src/references.js @@ -302,7 +302,7 @@ module.exports = class References { } // TODO: review if (info.type !== 'function') { - assertLog(tvalue instanceof ExpressionItem, {name, tvalue}); + assertLog(tvalue instanceof ExpressionItem, {name, infotype: info.type, tvalue}); } if (typeof info.row !== 'undefined') { tvalue.row = info.row; diff --git a/src/variables.js b/src/variables.js index 2b8a158..78c9eb8 100644 --- a/src/variables.js +++ b/src/variables.js @@ -3,7 +3,7 @@ const Indexable = require("./indexable.js"); module.exports = class Variables extends Indexable { - constructor (type, cls) { - super(type, cls); + constructor (type, cls, options) { + super(type, cls, options); } } diff --git a/src/witness_cols.js b/src/witness_cols.js index 7ca9f2b..bf41c45 100644 --- a/src/witness_cols.js +++ b/src/witness_cols.js @@ -4,6 +4,11 @@ const WitnessCol = require("./expression_items/witness_col.js"); module.exports = class WitnessCols extends Indexable { constructor () { - super('witness'); + super('witness', WitnessCol); } + getEmptyValue(id, options) { + let _options = options ?? {}; + return new WitnessCol(id, _options.stage ?? 1); + } + } From 4e0ae6bcc760f1d01b20dbe1cc194374189481bd Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 10 Aug 2023 01:46:56 +0200 Subject: [PATCH 06/33] WIP --- src/containers.js | 163 ++++++ src/dynamic_multi_array.js | 105 ++++ src/expression.js | 6 +- src/expression_factory.js | 13 +- src/expression_items.js | 12 +- src/expression_items/expression_item.js | 67 ++- src/expression_items/function_call.js | 2 +- src/expression_items/param_item.js | 22 + .../{reference.js => reference_item.js} | 6 +- src/indexable.js | 56 +- src/multi_array.js | 1 - src/pil_parser.jison | 4 +- src/processor.js | 16 +- src/reference.js | 310 +++++++++++ src/references.js | 509 +++++++++--------- src/runtime.js | 4 +- 16 files changed, 947 insertions(+), 349 deletions(-) create mode 100644 src/containers.js create mode 100644 src/dynamic_multi_array.js create mode 100644 src/expression_items/param_item.js rename src/expression_items/{reference.js => reference_item.js} (56%) create mode 100644 src/reference.js diff --git a/src/containers.js b/src/containers.js new file mode 100644 index 0000000..7064fc9 --- /dev/null +++ b/src/containers.js @@ -0,0 +1,163 @@ +const {assert, assertLog} = require('./assert.js'); +module.exports = class Containers { + + constructor (parent,context, scope) { + this.parent = parent; + this.context = context; + this.scope = scope; + this.containers = {}; + this.current = false; + this.uses = []; + this.aliases = []; + } + addScopeAlias(alias, value) { + // NOTE: there is no need to check for aliases because by grammatical definition, + // aliases must be an identifier + + if (this.aliases[alias]) { + throw new Error(`Alias ${alias} already defined on ${this.aliases[alias].sourceRef}`); + } + + this.scope.addToScopeProperty('aliases', alias); + this.aliases[alias] = {container: value, sourceRef: this.context.sourceRef}; + } + getAlias(alias, defaultValue) { + return this.aliases[alias] ?? defaultValue; + } + getFromAlias(alias, defaultValue) { + return this.getAlias(alias, {container: defaultValue}).container; + } + unsetAlias(aliases) { + for (const alias of aliases) { + assert(this.aliases[alias]); + delete this.aliases[alias]; + } + } + unsetUses(uses) { + let count = uses.length; + while (count > 0) { + const use1 = this.uses.pop(); + const use2 = uses.pop(); + assert(use1 === use2); + --count; + } + } + unsetProperty(property, values) { + switch (property) { + case 'aliases': return this.unsetAlias(values); + case 'uses': return this.unsetUses(values); + } + throw new Error(`unsetProperty was called with invalid property ${property}`); + } + create(name, alias = false) + { + if (this.current !== false) { + throw new Error(`Container ${this.current} is open, must be closed before start new container`); + } + + // console.log(`createContainer(${name},${alias}) at ${this.context.sourceRef}`); + // if container is defined, contents is ignored but alias must be defined + if (alias) { + this.addScopeAlias(alias, name); + } + + console.log(`CREATE CONTAINER ${name}`); + // if container is defined, contents is ignored + if (this.containers[name]) { + return false; + } + + // const nameInfo = this.decodeName(name).scope; + ; + this.containers[name] = {scope: this.parent.getNameScope(name), alias, definitions: {}}; + this.current = name; + return true; + } + inside() { + return this.current; + } + getCurrent() { + return this.current; + } + close(){ + this.current = false; + } + isDefined(name) { + return (this.containers[name] ?? false) !== false; + } + get (name) { + return this.containers[name] ?? false; + } + addReference(name, reference) { + if (this.current === false) { + throw new Error(`Could add reference ${name} to closed container`); + } + const container = this.containers[this.current]; + if (container.references[name]) { + throw new Error(`Reference ${name} was declared previously on scope ${this.current}`); + } + container.references[name] = reference; + } + addUse(name) { + if (!this.containers[name]) { + // TODO: defined must be check containers + throw new Exception(`Use not created container ${name}`); + } + this.scope.addToScopeProperty('uses', name); + this.uses.push(name); + } + getReferenceInside(container, name, defaultValue) { + return this.#getReference(name, defaultValue, container, false); + } + getReferenceInsideCurrent(name, defaultValue) { + return this.#getReference(name, defaultValue, this.current, false); + + } + getReference(name, defaultValue) { + return this.#getReference(name, defaultValue, this.current, true); + } + #getReference(name, defaultValue, container, useAlias) { + const nameInfo = this.decodeName(Array.isArray(name) ? name[0]:name); + let names; + if (nameInfo.scope !== false) { + names = [Array.isArray(name) ? name[0]:name]; + } else if (!nameInfo.absoluteScope && nameInfo.parts.length == 2) { + // console.log(['getScopeAlias',nameInfo.parts[0]]); + const container = this.getAlias(nameInfo.parts[0], {container: false}).container; + if (container) { + names = [container + '.' + nameInfo.parts.slice(1).join('.')]; + } + } + if (!names) { + names = this.context.getNames(name); + } + // console.log(`getReference(${name}) on ${this.context.sourceRef} = [${names.join(', ')}]`); + let reference; + + for (const name of names) { + reference = this.searchDefinition(name); + if (reference) break; + } + if (reference) { + if (typeof defaultValue !== 'undefined') return defaultValue; + throw new Error(`Reference ${names.join(',')} not found`); + } + + // constants are visible inside functions + if (this.isVisible(reference) === false) { + if (typeof defaultValue !== 'undefined') return defaultValue; + throw new Error(`Reference ${names.join(',')} not visible from current scope`); + } + let iuse = this.uses.length; + while (!def && iuse > 0) { + --iuse; + def = this.containers[this.uses[iuse]].definitions[name]; + } + return reference; + } + *[Symbol.iterator]() { + for (let name in this.containers) { + yield name; + } + } +} diff --git a/src/dynamic_multi_array.js b/src/dynamic_multi_array.js new file mode 100644 index 0000000..e2e9aaf --- /dev/null +++ b/src/dynamic_multi_array.js @@ -0,0 +1,105 @@ + +const {cloneDeep} = require('lodash'); +module.exports = class DynamicMultiArray extends MultiArray { + constructor (lengths, debug) { + // length[0] means dynamic index + this.dynamics = lengths.map(x => x == 0); + super(lengths, debug); + } + clone() { + let cloned = new DynamicMultiArray(this.lengths, this.debug); + cloned.dynamics = [...this.dynamics]; + return cloned; + } + /* + // assignation to indicate if allowed to increase one element + checkIndexes(indexes, assignation = false) { + if (indexes === null || typeof indexes === 'undefined') { + if (this.dim === 0) return true; + throw Error('Invalid index access'); // TODO: extra debug info + } else if (indexes.length !== this.dim) { + throw Error('Mismatch index valid access'); // TODO: extra debug info + } + for (let i = 0; i < indexes.length; ++i) { + if (indexes[i] < 0 || indexes[i] >= this.lengths[i]) { + throw Error(`Invalid index ${indexes[i]} on index ${i}`); // TODO: extra debug info + } + } + } + getIndexesOffset(indexes) { + return this.getIndexesTypedOffset(indexes).offset; + } + offsetToIndexes(offset) { + let level = 0; + let indexes = []; + while (level < this.dim) { + const size = this.offsets[level]; + indexes.push(Math.floor(offset/size)); + offset = offset % size; + ++level; + } + return indexes; + } + createSubArray(dim) { + return new MultiArray(this.lengths.slice(-dim)); + } + applyIndex(obj, indexes) { + const res = this.getIndexesTypedOffset(indexes); + let dup = obj.clone() + if (dup.id) { + dup.id = dup.id + res.offset; + } + if (dup.array) { + dup.array = res.array; + } + return dup; + } + getIndexesOffset(indexes) { + if (indexes === null || typeof indexes === 'undefined') { + // TODO: review + return {offset: 0, array: this.createSubArray(this.offsets.length)}; + } + let offset = 0; + const dims = Math.min(this.offsets.length, indexes.length); + for (let idim = 0; idim < dims; ++idim) { + if (Number(indexes[idim]) >= this.lengths[idim]) return [false, idim]; + offset += this.offsets[idim] * Number(indexes[idim]); + } + return [offset, dims]; + } + isValidIndexes(indexes) { + const [offset, dims] = this.getIndexesOffset(indexes); + return (offset !== false && offset < this.size && dims === indexes.length) ? 1n : 0n; + } + getIndexesTypedOffset(indexes) { + const [offset,dims] = this.getIndexesOffset(indexes); + if (offset === false) { + throw new ErrorIndexOutOfRange(`Internal error on variable index access index:${indexes[dims]} valid range:[0-${this.lengths[dims]-1}]`); + } + if (offset >= this.size) { + throw new ErrorIndexOutOfRange(`Internal error on variable index access index:${offset} valid range:[0-${this.size-1}]`); + } + const dim = this.offsets.length - dims; + if (dim === 0) { + return {offset, array: false}; + } + // return {offset, dim, lengths: dim ? this.lengths.slice(-dim):[], array: this.createSubArray(dim)}; + return {offset, array: this.createSubArray(dim)}; + } + initOffsets(lengths) { + this.lengths = lengths; + this.dim = Array.isArray(lengths) ? lengths.length: 0 + let offsets = [1]; + let size = 1; + for (let idim = this.dim - 1; idim > 0; --idim) { + size = size * lengths[idim]; + offsets.push(size); + } + // for size multiplies first offset by length of first dimension + this.size = size * lengths[0]; + + // for offsets first index length isn't rellevant + this.offsets = offsets.reverse(); + }*/ +} + diff --git a/src/expression.js b/src/expression.js index b3731f9..2df4267 100644 --- a/src/expression.js +++ b/src/expression.js @@ -3,7 +3,7 @@ const {cloneDeep} = require('lodash'); const {assert} = require("chai"); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const PilItem = require('./pil_item.js'); -const Reference = require("./expression_items/reference.js"); +const ReferenceItem = require("./expression_items/reference_item.js"); const StackItem = require("./expression_items/stack_item.js"); const ExpressionItem = require("./expression_items/expression_item.js"); const ValueItem = require("./expression_items/value_item.js"); @@ -182,7 +182,7 @@ module.exports = class Expression extends ExpressionItem { // TODO: review if best place? // TODO: review if next/prior // return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference' ); - return (this.isAlone() && this.stack[0].operands[0] instanceof Reference); + return (this.isAlone() && this.stack[0].operands[0] instanceof ReferenceItem); } // OP_VALUE (value) @@ -548,7 +548,7 @@ module.exports = class Expression extends ExpressionItem { return value; } else if (value instanceof ProofItem) { return null; - } else if (value instanceof Reference) { + } else if (value instanceof ReferenceItem) { let res = Expression.context.runtime.eval(value, {}); return res; } else { diff --git a/src/expression_factory.js b/src/expression_factory.js index 8506085..4b1d5c7 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -1,7 +1,7 @@ const util = require('util'); const {cloneDeep} = require('lodash'); const Expression = require("./expression.js"); -const {Reference, IntValue} = require("./expression_items.js"); +const {ReferenceItem, IntValue} = require("./expression_items.js"); const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); module.exports = class ExpressionFactory { @@ -48,7 +48,7 @@ module.exports = class ExpressionFactory { return expressions; } static fromReference(obj) { - let res = new Reference(obj.name, obj.indexes ?? [], (obj.next ?? 0) - (obj.prior ?? 0)); + let res = new ReferenceItem(obj.name, obj.indexes ?? [], (obj.next ?? 0) - (obj.prior ?? 0)); delete obj.name; delete obj.indexes; delete obj.dim; @@ -61,4 +61,13 @@ module.exports = class ExpressionFactory { delete obj.value; return res; } + static fromCall(obj) { + let res = new FunctionCall(obj.name, obj.arguments ?? [], obj.indexes ?? []); + delete obj.name; + delete obj.indexes; + delete obj.dim; + delete obj.arguments; + return res; + } + // TODO: positionalParams } diff --git a/src/expression_items.js b/src/expression_items.js index 5a02235..f9ee15b 100644 --- a/src/expression_items.js +++ b/src/expression_items.js @@ -1,4 +1,4 @@ -const ExpressionItem = require("./expression_items/expression_item.js") +const ExpressionItem = require("./expression_items/expression_item.js"); const ExpressionReference = require("./expression_items/expression_reference.js"); const FeValue = require("./expression_items/fe_value.js"); const IntValue = require("./expression_items/int_value.js"); @@ -7,7 +7,7 @@ const Proofval = require("./expression_items/proofval.js"); const Challenge = require("./expression_items/challenge.js"); const Public = require("./expression_items/public.js"); const Publictable = require("./expression_items/publictable.js"); -const Reference = require("./expression_items/reference.js"); +const ReferenceItem = require("./expression_items/reference_item.js"); const RuntimeItem = require("./expression_items/runtime_item.js"); const StackItem = require("./expression_items/stack_item.js"); const StringValue = require("./expression_items/string_value.js"); @@ -16,6 +16,8 @@ const ValueItem = require("./expression_items/value_item.js"); const WitnessCol = require("./expression_items/witness_col.js"); const ArrayOf = require("./expression_items/array_of.js"); const FixedCol = require("./expression_items/fixed_col.js"); +const FunctionCall = require("./expression_items/function_call.js"); +const ParamItem = require("./expression_items/param_item.js"); module.exports = { ExpressionItem, @@ -28,12 +30,14 @@ module.exports = { Challenge, Public, Publictable, - Reference, + ReferenceItem, RuntimeItem, StackItem, StringValue, Subproofval, ValueItem, WitnessCol, - ArrayOf + ArrayOf, + FunctionCall, + ParamItem } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 126b40a..6594395 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -1,24 +1,57 @@ -/* next indexes Parent Item Definition - ---- ------- -------------- -------------- --------------------------------------------- - Challenge - * ProofStageItem id id + stage [used] - ExpressionReference * * RuntimeItem id id [const,use] - FeValue - - ValueItem value value (fe) [const] - IntValue - - ValueItem value value (bigint) [const] - FixedCol - * ProofItem id id [used] - FunctionCall * ? RuntimeItem "id",argValues FunctionDefinition: name,args,return,statements - Proofval - * ProofItem id id [used] - Public - * ProofItem id id [used] - Publictable - * ProofItem id id + numCols,maxRows,aggType,rowExpressionId [used] - *PublictableCol - * ProofItem id,colId [const, used] - Reference * * RuntimeItem name name + type, instance, etc. - StackItem - - ExpressionItem offset - - StringValue - - RuntimeItem value value (string) [const, used] - Subproofval - * ProofItem id id + subproofId [used] - WitnessCol * * ProofStageItem id id + stage [used] +/* cexp next ind Parent Item DefClas Definition + ---- ---- --- -------------- -------------- -------------- --------------------------------------------- + Challenge - - * ProofStageItem id ProofStageDef id + stage [used] + SubExpression - * * ProofItem id - id [const,use] + FeValue - - - ValueItem value - value (fe) [const] + IntValue * - - ValueItem value - value (bigint) [const] + FixedCol - - * ProofItem id - id [used] + FunctionCall * * ? RuntimeItem "id",argValues Function name,args,return,statements + Proofval - - * ProofItem id - id [used] + Public - - * ProofItem id - id [used] + Publictable - - * ProofItem id PublictableDef id + numCols,maxRows,aggType,rowExpressionId [used] + *PublictableCol - - * ProofItem id,colId - [const, used] + ReferenceItem * * * RuntimeItem name ? name + type, instance, etc. + StackItem - - - ExpressionItem offset - - + StringValue * - - RuntimeItem value - value (string) [const, used] + Subproofval - - * ProofItem id SubproofvalDef id + subproofId [used] + WitnessCol - * * ProofStageItem id ProofStageDef id + stage [used] + + + Type List Item + ---------- -------------- -------------- + Challenge challenge challenges (Ids) id Ids: new cls(id) + Expression expr exprs (Variables) value Variables: new cls(value) + SubExpression subexpr subexprs (Ids) id Ids: new cls(id) + FeValue fe fes (Variables) value Variables: new cls(value) + IntValue int ints (Variables) value Variables: new cls(value) + *IntValue constant constants (Indexable) value Variables: new cls(value) + FixedCol fixed fixeds (FixedCols) id Ids: new cls(id) + FunctionCall function functions (Indexable) "id",argValues + Proofval proofvalue proofvalues (Ids) id Ids: new cls(id) + Public public publics (Ids) id Ids: new cls(id) + Publictable publictable id + *PublictableCol id,colId + ReferenceItem - references (References) name + StackItem - offset + StringValue string strings (Variables) value Variables: new cls(value) + Subproofval subproofval subproofvalues (Ids) id Ids: new cls(id) + WitnessCol witness witness (WitnessCols) id WitnessCols: new WitnessCol(id, stage) + + + + cexp: compiler expression (build) + next: allowed next + ind: allowed indexes ExpressionItem > ProofItem > ProofStageItem > RuntimeItem > ValueItem + + Array information on reference + + ArrayOf (multiarray, from: ExpressionItem) + ArrayOf (multiarray, [ExpressionItem]) = List + */ module.exports = class ExpressionItem { static _classToManager = {}; diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 705e91b..d7cd580 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -10,7 +10,7 @@ module.exports = class FunctionCall extends RuntimeItem { dump(options) { const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; - return `Reference(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + return `Function(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; } clone() { return new FunctionCall(this.name, this.args, this.indexes); diff --git a/src/expression_items/param_item.js b/src/expression_items/param_item.js new file mode 100644 index 0000000..cbf112a --- /dev/null +++ b/src/expression_items/param_item.js @@ -0,0 +1,22 @@ +const RuntimeItem = require("./runtime_item.js"); + +// NEXT FEATURE +// ParamItem is as a macro or expression template. by $, allows to define expression, +// instance it without replacing this parameter. To expand param in an expression +// expr example = (10 + $1 + 2 * $2) * $1 +// expr replaced = example(13, x + 2); +// replaced was (10 + 13 + 2 * (x + 2)) * 13 + +module.exports = class ParamItem extends RuntimeItem { + // TODO: next + constructor (id) { + super(); + this.id; + } + dump(options) { + return '$'+this.id; + } + clone() { + return new ParamItem(this.id); + } +} diff --git a/src/expression_items/reference.js b/src/expression_items/reference_item.js similarity index 56% rename from src/expression_items/reference.js rename to src/expression_items/reference_item.js index f59de48..1b1a97f 100644 --- a/src/expression_items/reference.js +++ b/src/expression_items/reference_item.js @@ -1,5 +1,5 @@ const RuntimeItem = require("./runtime_item.js"); -module.exports = class Reference extends RuntimeItem { +module.exports = class ReferenceItem extends RuntimeItem { constructor (name, indexes = [], next = 0) { super(); this.name = name; @@ -8,9 +8,9 @@ module.exports = class Reference extends RuntimeItem { } dump(options) { const [pre,post] = this.getNextStrings(); - return `Reference(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + return `ReferenceItem(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; } clone() { - return new Reference(this.name, this.indexes, this.next); + return new ReferenceItem(this.name, this.indexes, this.next); } } diff --git a/src/indexable.js b/src/indexable.js index e726608..7aa56e3 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -10,24 +10,9 @@ module.exports = class Indexable { this.rtype = this.options.rtype ?? type; this.labelRanges = new LabelRanges(); this.debug = false; - this._undefined = null; - if (this.cls) { - try { - this._undefined = new this.cls(); - } catch (e) { } - } - } - get undefined() { - if (this._undefined instanceof Object) { - return cloneDeep(this._undefined); - } - return this._undefined; } getEmptyValue(id) { - if (this.options.idAsValue) { - return id; - } - return this.undefined; + return id; } clone() { @@ -57,10 +42,10 @@ module.exports = class Indexable { const id = this.values.length; for (let index = 0; index < count; ++index) { const absoluteIndex = index + id; - this.values[absoluteIndex] = this.getEmptyValue(absoluteIndex, options); - // if (this.debug) { + this.values[absoluteIndex] = this.getEmptyValue(absoluteIndex); + if (this.debug) { console.log(`INIT ${this.constructor.name}.${this.type} @${absoluteIndex} (${id}+${index}) ${this.values[absoluteIndex]} LABEL:${label}`); - // } + } } if (label) { this.labelRanges.define(label, id, multiarray); @@ -69,17 +54,19 @@ module.exports = class Indexable { } get(id) { let res = this.values[id]; - console.log(res); if (typeof res === 'undefined' || res === null) { - res = this.undefined; - } else { - assertLog(!this.cls || res instanceof this.cls, [this.cls.name, res]); - } - if (this.debug) { - console.log(`GET ${this.constructor.name}.${this.type} @${id} ${res}`); + return this.getEmptyValue(id); } - if (res && typeof res.clone === 'function') { - return res.clone(); + return res; + } + getItem(id, properties) { + let res = this.get(id); + if (this.cls && (res instanceof this.cls) === false) { + properties = properties ?? {}; + res = new this.cls(this.id); + for (const property in properties) { + res[property] = properties[property]; + } } return res; } @@ -88,12 +75,6 @@ module.exports = class Indexable { return this.labelRanges.getLabel(id, options); } - getTypedValue(id) { - // const res = { type: this.rtype, value: this.get(id) }; - console.log(['getTypedValue', this.type, this.cls ? this.cls.name : 'no-class', id, this.values.length]); - return this.get(id); - } - isDefined(id) { return (typeof this.values[id] != 'undefined') } @@ -106,9 +87,8 @@ module.exports = class Indexable { } set(id, value) { - if (this.type === 'fixed') { - console.log('FIXED_SET', value); - } + this.values[id] = value; +/* if (typeof this.cls === 'function') { if ((value instanceof this.cls) === false) { if (this.cls.directValue) { @@ -121,7 +101,7 @@ module.exports = class Indexable { } } } - this.values[id] = value; + this.values[id] = value;*/ if (this.debug) { console.log(`SET ${this.constructor.name}.${this.type} @${id} ${value}`); } diff --git a/src/multi_array.js b/src/multi_array.js index ead76e0..bbcfd82 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -1,5 +1,4 @@ -const {cloneDeep} = require('lodash'); class MultiArray { constructor (lengths, debug) { this.debug = debug || ''; diff --git a/src/pil_parser.jison b/src/pil_parser.jison index de29703..f0e97c3 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -576,7 +576,7 @@ statement_no_closed { $$ = { type: 'constraint', left: $1, right: $3 } } | delayed_function_call - { $$ = {...$1, type: 'delayed_function_call'} } + { $$ = $1 } | include_directive { $$ = $1 } @@ -662,7 +662,7 @@ defined_scopes delayed_function_call : ON delayed_function_event defined_scopes name_optional_index '(' multiple_expression_list ')' - { $$ = { op: 'delayed_call', event: $2, scope: $3, function: $4, arguments: $6.values } } + { $$ = { type: 'delayed_function_call', event: $2, scope: $3, function: $4, arguments: $6.values } } ; diff --git a/src/processor.js b/src/processor.js index 7d81d11..89b083d 100644 --- a/src/processor.js +++ b/src/processor.js @@ -25,7 +25,7 @@ const Context = require("./context.js"); const Runtime = require("./runtime.js"); // const FunctionCall = require("./function_call.js"); const {FlowAbortCmd, BreakCmd, ContinueCmd, ReturnCmd} = require("./flow_cmd.js") -const {Reference, ExpressionItem, FeValue, IntValue, ProofItem, Proofval, Subproofval, Challenge, Public, ProofStageItem, +const {ReferenceItem, ExpressionItem, FeValue, IntValue, ProofItem, Proofval, Subproofval, Challenge, Public, ProofStageItem, ExpressionReference, StringValue, FixedCol, WitnessCol } = require("./expression_items.js"); const fs = require('fs'); const { log2, getKs, getRoots } = require("./utils.js"); @@ -57,11 +57,14 @@ module.exports = class Processor { this.strings = new Variables('string', StringValue); this.references.register('string', this.strings); - this.vexprs = new Variables('expr', Expression); - this.references.register('expr', this.vexprs); + this.exprs = new Variables('expr', Expression); + this.references.register('expr', this.exprs); - this.lexprs = new Variables('lexpr', Expression); - this.references.register('lexpr', this.lexprs); + this.subexprs = new Variables('subexpr', Expression); + this.references.register('subexpr', this.subexprs); + + // this.lexprs = new Variables('lexpr', Expression); + // this.references.register('lexpr', this.lexprs); this.fixeds = new FixedCols(); ExpressionItem.setManager(FixedCol, this.fixeds); @@ -91,9 +94,6 @@ module.exports = class Processor { ExpressionItem.setManager(Subproofval, this.subproofvalues); this.references.register('subproofvalue', this.subproofvalues); -// this.imCols = new Indexable(Fr, 'im'); -// this.references.register('im', this.imCols); - this.functions = new Indexable('function'); this.references.register('function', this.functions); diff --git a/src/reference.js b/src/reference.js new file mode 100644 index 0000000..a07bf38 --- /dev/null +++ b/src/reference.js @@ -0,0 +1,310 @@ +const {assert, assertLog} = require('./assert.js'); +const {MultiArray} = require("./multi_array.js"); +module.exports = class Reference { + + constructor (name, type, isReference, array, id, instance, scopeId, properties) { + this.name = name; + this.type = type; + assert(typeof isReference === 'boolean'); + this.isReference = isReference; + this.array = array; + this.locator = id; + this.scopeId = scopeId; + this.instance = instance; + for (const property in properties) { + assert(typeof this[property] === 'undefined'); + this[property] = properties[property]; + } + } + isValidIndexes(indexes = []) { + // if (!Array.isArray(indexes) || indexes.length == 0) return true; + if (!Array.isArray(indexes)) return false; + if (indexes.length == 0) return true; + if (!this.array) return false; + return this.array.isValidIndexes(indexes); + } + + getId(indexes = []) { + if (!this.array) return id; + + // TODO: + + + + const typedOffset = def.array.getIndexesTypedOffset(indexes); + let res = {locator: def.locator, ...typedOffset}; + + // if instance doesn't support offset, add offset inside locator + // and set offset = false + if (res.offset) { + res.locator += res.offset; + } + res.offset = 0; + // return [tdata.instance, res, def]; + const indexLengthLimit = tdata.instance.rows ? 1 : 0; + if (indexes.length > indexLengthLimit) { + throw new Error(`Invalid array or row access, too many array levels`); + } + let extraInfo = {type: def.type, offset: 0, reference: def.reference, referencedType: def.referencedType}; + if (indexes.length > 0) { + extraInfo.row = indexes[0]; + } + return [tdata.instance, {locator: def.locator, ...extraInfo}, def]; + } + init (value, indexes = []) { + return this.set(value, indexes); + } + set (value, indexes = []) { + assert(value !== null); // to detect obsolete legacy uses + const id = this.getId(indexes); + this.instance.set(id, value); + } + static getArrayAndSize(lengths) { + // TODO: dynamic arrays, call to factory, who decides? + if (lengths && lengths.length) { + let array = new MultiArray(lengths); + return [array, array.size]; + } + return [false, 1]; + } + get (indexes = []) { + this.instance.get(this.getId(indexes)); + const [instance, info] = this._getInstanceAndLocator(name, indexes); + return instance.get(info.locator + info.offset); + } + getIdRefValue(type, id) { + return this.getRegisteredType(type).instance.getItem(id); + } + getLabel(type, id, options) { + return this.getRegisteredType(type).instance.getLabel(id, {type, ...options}); + } + getTypeR(name, indexes, options) { + const [instance, info] = this._getInstanceAndLocator(name, indexes); + return [instance.getType(info.locator + info.offset), info.reference, info.array ?? false]; + } + getItem(name, indexes, options) { + indexes = indexes ?? []; + options = options ?? {}; + + const [instance, info, def] = this._getInstanceAndLocator(name, indexes); + let tvalue; + if (info.array) { + // array info, could not be resolved + console.log('***** ARRAY ******'); + tvalue = new ArrayOf(instance.cls, info.locator + info.offset, info.type ?? def.type, instance); + } else { + // no array could be resolved + console.log([instance.constructor.name, info.type]); + tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); + } + // TODO: review + if (info.type !== 'function') { + assertLog(tvalue instanceof ExpressionItem, {name, infotype: info.type, tvalue}); + } + if (typeof info.row !== 'undefined') { + tvalue.row = info.row; + } + if (!info.array) { + tvalue.id = info.locator; + } + if (options.full) { + tvalue.locator = info.locator; + tvalue.instance = instance; + tvalue.offset = info.offset; + } + if (info.dim) { + tvalue.dim = info.dim; +// tvalue.arrayType = info.arrayType; + tvalue.lengths = info.lengths; + } + if (info.array) { + tvalue.dim = 'DEPRECATED'; + tvalue.lengths = 'DEPRECATED'; + tvalue.array = info.array; + } + if (options.preDelta) { + console.log(typeof tvalue.value); + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + tvalue.value += options.preDelta; + instance.set(info.locator + info.offset, tvalue.value); + } + if (options.postDelta) { + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + instance.set(info.locator + info.offset, tvalue.value + options.postDelta); + } + return tvalue; + } + _getTypedValue (name, indexes, options) { + indexes = indexes ?? []; + options = options ?? {}; + + if (typeof indexes === 'undefined') indexes = []; + + const [instance, info, def] = this._getInstanceAndLocator(name, indexes); + let tvalue; + if (info.array) { + // array info, could not be resolved + console.log('***** ARRAY ******'); + tvalue = new ArrayOf(instance.cls, info.locator + info.offset, info.type ?? def.type, instance); + } else { + // no array could be resolved + console.log([instance.constructor.name, info.type]); + tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); + } + // TODO: review + if (info.type !== 'function') { + assertLog(tvalue instanceof ExpressionItem, {name, infotype: info.type, tvalue}); + } + if (typeof info.row !== 'undefined') { + tvalue.row = info.row; + } + if (!info.array) { + tvalue.id = info.locator; + } + if (options.full) { + tvalue.locator = info.locator; + tvalue.instance = instance; + tvalue.offset = info.offset; + } + if (info.dim) { + tvalue.dim = info.dim; +// tvalue.arrayType = info.arrayType; + tvalue.lengths = info.lengths; + } + if (info.array) { + tvalue.dim = 'DEPRECATED'; + tvalue.lengths = 'DEPRECATED'; + tvalue.array = info.array; + } + if (options.preDelta) { + console.log(typeof tvalue.value); + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + tvalue.value += options.preDelta; + instance.set(info.locator + info.offset, tvalue.value); + } + if (options.postDelta) { + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + instance.set(info.locator + info.offset, tvalue.value + options.postDelta); + } + return tvalue; + } + getTypeInfo (name, indexes = []) { + return this._getInstanceAndLocator(name, indexes); + } + addUse(name) { + if (!this.containers[name]) { + // TODO: defined must be check containers + throw new Exception(`Use not created container ${name}`); + } + this.scope.addToScopeProperty('uses', name); + this.uses.push(name); + } + searchDefinition(name) { + const subnames = name.split('.'); + const container = subnames.length > 1 ? subnames.slice(0, -1).join('.') : false; + const lname = subnames[subnames.length - 1]; + + if (name === 'air.gw1') { + console.log({subnames, container, lname}); + } + let def = false; + + if (this.currentContainer !== false && !container) { + def = this.containers[this.currentContainer].definitions[lname]; + } + if (!def && container) { + if (['proof', 'subproof', 'air'].includes(container)) { + const scopeId = this.scope.getScopeId(container); + if (name === 'air.gw1') { + console.log(scopeId); + } + if (scopeId === false) { + throw new Error(`not found scope ${container}`); + } + def = this.definitions[lname]; + if (name === 'air.gw1') { + console.log(def); + } + if (def && def.scopeId !== scopeId) { + throw new Error(`Not match declaration scope and accessing scope (${container}) of ${name}`); + } + } + if (!def && this.containers[container]) { + def = this.containers[container].definitions[lname]; + } + } + if (!def) { + def = this.definitions[name]; + } + let iuse = this.uses.length; + while (!def && iuse > 0) { + --iuse; + def = this.containers[this.uses[iuse]].definitions[name]; + } + return def; + } + setReference (name, value) { + let dest = this.getReference(name); + // TODO: reference not knows operand types + if (value instanceof Expression) { + value = value.getAloneOperand(); + if (value instanceof ReferenceItem) { + assert(!value.next); + assert(!value.array); + const src = this.getReference(value.name); + if (src.array) { + const __array = src.array.getIndexesTypedOffset(value.__indexes); + dest.array = __array.array; + dest.locator = src.locator + __array.offset; + + } else { + dest.array = false; + dest.locator = src.locator; + } + dest.type = src.type; + dest.scope = src.scope; + dest.scopeId = src.scopeId; + } else if (value instanceof ProofItem) { + dest.locator = value.id; + dest.type = value.refType; + dest.scope = false; + dest.scopeId = false; + dest.array = value.array; + } + } else if (value instanceof ProofItem) { + assert(!value.__next); + dest.locator = value.id; + dest.type = value.refType; + } else { + throw new Error(`Invalid reference`); + } + } + _getInstanceAndLocator (name, indexes) { + const def = this.getDefinition(name); + // TODO: partial access !!! + // TODO: control array vs indexes + const tdata = this._getRegisteredType(def.type); + if (def.array !== false) { + // TODO ROW ACCESS + const typedOffset = def.array.getIndexesTypedOffset(indexes); + let res = {locator: def.locator, ...typedOffset}; + + // if instance doesn't support offset, add offset inside locator + // and set offset = false + if (res.offset) { + res.locator += res.offset; + } + res.offset = 0; + return [tdata.instance, res, def]; + } + const indexLengthLimit = tdata.instance.rows ? 1 : 0; + if (indexes.length > indexLengthLimit) { + throw new Error(`Invalid array or row access, too many array levels`); + } + let extraInfo = {type: def.type, offset: 0, reference: def.reference, referencedType: def.referencedType}; + if (indexes.length > 0) { + extraInfo.row = indexes[0]; + } + return [tdata.instance, {locator: def.locator, ...extraInfo}, def]; + } +} diff --git a/src/references.js b/src/references.js index ad6caa9..795feda 100644 --- a/src/references.js +++ b/src/references.js @@ -2,93 +2,37 @@ const {assert, assertLog} = require('./assert.js'); const {MultiArray} = require("./multi_array.js"); const Expression = require("./expression.js"); const {ExpressionItem, ArrayOf} = require("./expression_items.js"); +const {Reference} = require('./reference.js'); +const {Containers} = require('./containers.js'); module.exports = class References { constructor (Fr, context, scope) { this.Fr = Fr; - this.definitions = {}; + this.references = {}; this.types = {}; this.context = context; this.scope = scope; this.visibilityScope = 0; this.visibilityStack = []; - this.containers = {}; - this.currentContainer = false; + this.containers = new Containers(this, context, scope); this.scope.setReferences(this); this.context.references = this; - this.aliases = {}; - this.uses = []; } - addScopeAlias(alias, value) { - // NOTE: there is no need to check for aliases because by grammatical definition, - // aliases must be an identifier - - if (this.aliases[alias]) { - throw new Error(`Alias ${alias} already defined on ${this.aliases[alias].sourceRef}`); - } - - this.scope.addToScopeProperty('aliases', alias); - this.aliases[alias] = {container: value, sourceRef: this.context.sourceRef}; - } - getAlias(alias, defaultValue) { - return this.aliases[alias] ?? defaultValue; - } - unsetAlias(aliases) { - for (const alias of aliases) { - assert(this.aliases[alias]); - delete this.aliases[alias]; - } - } - unsetUses(uses) { - let count = uses.length; - while (count > 0) { - const use1 = this.uses.pop(); - const use2 = uses.pop(); - assert(use1 === use2); - --count; - } - } - unsetProperty(property, values) { - switch (property) { - case 'aliases': return this.unsetAlias(values); - case 'uses': return this.unsetUses(values); - } - throw new Error(`unsetProperty was called with invalid property ${property}`); - } - createContainer(name, alias = false) - { - if (this.currentContainer !== false) { - throw new Error(`Container ${this.currentContainer} is open, must be closed before start new container`); - } - - // console.log(`createContainer(${name},${alias}) at ${this.context.sourceRef}`); - // if container is defined, contents is ignored but alias must be defined - if (alias) { - this.addScopeAlias(alias, name); - } - - console.log(`CREATE CONTAINER ${name}`); - // if container is defined, contents is ignored - if (this.containers[name]) { - return false; - } - + getNameScope(name) { const nameInfo = this.decodeName(name); - this.containers[name] = {scope: nameInfo.scope, alias, definitions: {}}; - this.currentContainer = name; - return true; + return nameInfo.scope; } - closeContainer() - { - this.currentContainer = false; + createContainer(name, alias = false) { + return this.containers.create(name, alias); } - pushVisibilityScope() - { + closeContainer() { + this.containers.close(); + } + pushVisibilityScope() { this.visibilityStack.push(this.visibilityScope); this.visibilityScope = this.scope.deep; } - popVisibilityScope() - { + popVisibilityScope() { if (this.visibilityStack.length < 1) { throw new Error(`invalid popVisibilitScope`); } @@ -110,9 +54,9 @@ module.exports = class References { } typeInfo.instance.clear(); // TODO: remove references - for (const name in this.definitions) { - if (this.definitions[name].type !== type) continue; - delete this.definitions[name]; + for (const name in this.references) { + if (this.references[name].type !== type) continue; + delete this.references[name]; } } isReferencedType(type) { @@ -121,19 +65,19 @@ module.exports = class References { getReferencedType(type) { return this.isReferencedType(type) ? type.substring(1):type; } - - _getRegisteredType (type) { - const reference = this.isReferencedType(type); - const finalType = this.getReferencedType(type); - const tdata = this.types[finalType]; - if (typeof tdata === 'undefined') { - throw new Error(`unknown type ${type} [${finalType}]`); + getTypeDefinition(type) { + const typedef = this.types[type] ?? null; + if (typedef === null) { + throw new Error(`Invalid or unregistered type ${type}`); } - if (reference) { - tdata.reference = true; - tdata.referencedType = finalType; + return typedef; + } + getTypeInstance(type) { + const typedef = this.types[type] ?? null; + if (typedef === null) { + throw new Error(`Invalid or unregistered type ${type}`); } - return tdata; + return typedef.instance; } decodeName (name) { const parts = name.split('.'); @@ -147,21 +91,58 @@ module.exports = class References { const absoluteScope = isProofScope || isSubproofScope || isAirScope; let res = {isProofScope, isSubproofScope, isAirScope, absoluteScope, parts}; if (absoluteScope) { + // if absolute scope (proof, subproof or air) and has more than 2 parts, means at least 3 parts, + // the middle part was container. if (parts.length > 2) { return {...res, scope: parts[0], name: parts.slice(-1), container: parts.slice(0, -1).join('.')}; } + // if absolute, but only 2 or less parts, no container specified. return {...res, scope: parts[0], static: true, name: parts.slice(1).join('.')}; } + // if no absolute scope, could be an alias if it has 2 parts. return {...res, scope, name}; } - getArrayAndSize(lengths) { - if (lengths && lengths.length) { - let array = new MultiArray(lengths); - return [array, array.size]; + normalizeType(type) { + if (this.isReferencedType(type)) { + return [true, this.getReferencedType(type)]; + } + return [false, type]; + } + checkAndGetContainer(nameInfo) { + const container = this.containers.getCurrent(); + if (container && nameInfo.scope !== false) { + throw new Error(`Static reference ${nameInfo.name} inside container not allowed`); + } + // containers are scope-free. + return container; + } + isStaticDeclaredPreviously(nameInfo, existingReference) { + if (!nameInfo.static) return false; + // only created and init once + if (existingReference) { + if (existingReference.static) { + return true; + } + throw new Error(`Static reference ${nameInfo.name} has been defined on non-static scope`); + } + return false; + } + prepareScope(nameInfo, type, existingReference) { + + if (nameInfo.static) { + return [this.scope.declare(nameInfo.name, finalType, false, nameInfo.scope), nameInfo.scope]; + } + + const scopeId = this.hasScope(finalType) ? this.scope.declare(nameInfo.name, finalType, existingReference, false) : 0; + // scope(name, def) => exception !!! + // => scopeId; + if (existingReference !== false && existingReference.scopeId === scopeId) { + throw new Error(`${nameInfo.name} was defined previously on ${existingReference.data.sourceRef}`) } - return [false, 1]; + return [scopeId, false]; } declare (name, type, lengths = [], data = null, initValue = null) { + assert(typeof name === 'string'); assert(!name.includes('::object')); assert(!name.includes('.object')); @@ -169,102 +150,52 @@ module.exports = class References { const nameInfo = this.decodeName(name); console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${this.scope.deep} ${initValue}`, data); - let [array, size] = this.getArrayAndSize(lengths); + let [array, size] = Reference.getArrayAndSize(lengths); - const def = this.definitions[nameInfo.name]; - let scopeId; - let scope = false; + const existingReference = this.references[nameInfo.name] ?? false; - if (this.currentContainer !== false) { - if (nameInfo.scope !== false) { - throw new Error(`Static reference ${name} inside container not allowed`); - } - } else if (nameInfo.static) { - // only created and init once - if (def) { - if (!def.static) { - throw new Error(`Static reference ${name} has been defined on non-static scope`); - } - // nothing to do (important: static scope) - return def.locator; - } - scope = nameInfo.scope; - scopeId = this.scope.declare(nameInfo.name, type, false, scope); - } else { - scopeId = this.hasScope(type) ? this.scope.declare(nameInfo.name, type, def ?? false, scope) : 0; + // When reference is reference to other reference, caller put & before type name (ex: &int) + + const [isReference, finalType] = this.normalizeType(type); - // scope(name, def) => exception !!! - // => scopeId; - if (typeof def !== 'undefined' && def.scopeId === scopeId) { - throw new Error(`${name} was defined previously on ${def.data.sourceRef}`) + let scopeId = 0; + let scope = false; + + const container = this.checkAndGetContainer(nameInfo); + if (!container) { + if (this.isStaticDeclaredPreviously(nameInfo, existingReference)) { + return existingReference.getId(); } + [scopeId, scope] = this.prepareScope(nameInfo, finalType, existingReference); } - // When reference is reference to other reference, caller put & before type name (ex: &int) - const reference = this.isReferencedType(type); - - const tdata = reference ? {} : this._getRegisteredType(type); - const id = reference ? null : tdata.instance.reserve(size, nameInfo.name, array, data); - const cdef = { - type, - array, - reference, - referencedType: reference ? type.substring(1) : false, // to define valid referenced type - locator: id, - scopeId, - scope, - container: this.currentContainer, - static: nameInfo.static ?? false, - data - } - if (this.currentContainer === false) { - this.definitions[nameInfo.name] = cdef; + + const instance = this.getTypeInstance(finalType); + + // TODO: reserve need array for labels? + const id = isReference ? null : instance.reserve(size, nameInfo.name, array, data); + + const reference = new Reference(nameInfo.name, type, isReference, array, id, instance, scopeId, + {container, scope, static, data}); + + if (container) { + this.containers.addReference(nameInfo.name, reference); } else { - console.log(name); - console.log(`ADD TO CONTAINER ${this.currentContainer} ${nameInfo.name}`); - if (name === 'Byte4.gsum_result') EXIT_HERE; - this.containers[this.currentContainer].definitions[nameInfo.name] = cdef; + this.references[nameInfo.name] = reference; } if (initValue !== null) { - this.set(nameInfo.name, [], initValue); + reference.init(reference, initValue); } return id; } isDefined(name, indexes = []) { - let def = this.getDefinition(name, false); - let found = Boolean(def); - /* - const names = this.context.getNames(name); - let found = false; - let def; - for (const _name of names) { - def = this.definitions[_name] ?? false; - if (def) { - found = _name; - break; - } - } - - console.log(def); - console.log(this.visibilityScope); - if (def.scopeId && def.type !== 'constant' && def.scopeId < this.visibilityScope) { - return false; - } -*/ - if (found !== false) { - if (Array.isArray(indexes) && indexes.length > 0) { - return def.array ? def.array.isValidIndexes(indexes) : false; - } - return true; - } - - return false; + const reference = this.getReference(name, false); + if (!reference) return false; + return reference.isValidIndexes(indexes); } hasScope(type) { // TODO: inside function ?? - // TODO: col reference - // return ['im', 'witness', 'fixed', 'public', 'prover', 'challenge'].includes(type) === false; - return ['public', 'proofvalue', 'challenge', 'subproofvalue'].includes(type) === false; + return ['public', 'proofvalue', 'challenge', 'subproofvalue', 'publictable'].includes(type) === false; } get (name, indexes = []) { @@ -272,18 +203,68 @@ module.exports = class References { return instance.get(info.locator + info.offset); } getIdRefValue(type, id) { - const tdata = this._getRegisteredType(type); - return tdata.instance.getTypedValue(id); + return this.getTypeDefinition(type).instance.getItem(id); } getLabel(type, id, options) { - const instance = this.types[type].instance; - return instance.getLabel(id, {type, ...options}); + return this.getTypeDefinition(type).instance.getLabel(id, {type, ...options}); } getTypeR(name, indexes, options) { const [instance, info] = this._getInstanceAndLocator(name, indexes); return [instance.getType(info.locator + info.offset), info.reference, info.array ?? false]; } - getTypedValue (name, indexes, options) { + getItem(name, indexes, options) { + indexes = indexes ?? []; + options = options ?? {}; + + const [instance, info, def] = this._getInstanceAndLocator(name, indexes); + let tvalue; + if (info.array) { + // array info, could not be resolved + console.log('***** ARRAY ******'); + tvalue = new ArrayOf(instance.cls, info.locator + info.offset, info.type ?? def.type, instance); + } else { + // no array could be resolved + console.log([instance.constructor.name, info.type]); + tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); + } + // TODO: review + if (info.type !== 'function') { + assertLog(tvalue instanceof ExpressionItem, {name, infotype: info.type, tvalue}); + } + if (typeof info.row !== 'undefined') { + tvalue.row = info.row; + } + if (!info.array) { + tvalue.id = info.locator; + } + if (options.full) { + tvalue.locator = info.locator; + tvalue.instance = instance; + tvalue.offset = info.offset; + } + if (info.dim) { + tvalue.dim = info.dim; +// tvalue.arrayType = info.arrayType; + tvalue.lengths = info.lengths; + } + if (info.array) { + tvalue.dim = 'DEPRECATED'; + tvalue.lengths = 'DEPRECATED'; + tvalue.array = info.array; + } + if (options.preDelta) { + console.log(typeof tvalue.value); + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + tvalue.value += options.preDelta; + instance.set(info.locator + info.offset, tvalue.value); + } + if (options.postDelta) { + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + instance.set(info.locator + info.offset, tvalue.value + options.postDelta); + } + return tvalue; + } + _getTypedValue (name, indexes, options) { indexes = indexes ?? []; options = options ?? {}; @@ -350,88 +331,85 @@ module.exports = class References { } searchDefinition(name) { const subnames = name.split('.'); - const container = subnames.length > 1 ? subnames.slice(0, -1).join('.') : false; + const explicitContainer = subnames.length > 1 ? subnames.slice(0, -1).join('.') : false; const lname = subnames[subnames.length - 1]; - if (name === 'air.gw1') { - console.log({subnames, container, lname}); - } - let def = false; + let reference = false; - if (this.currentContainer !== false && !container) { - def = this.containers[this.currentContainer].definitions[lname]; - } - if (!def && container) { - if (['proof', 'subproof', 'air'].includes(container)) { - const scopeId = this.scope.getScopeId(container); - if (name === 'air.gw1') { - console.log(scopeId); - } + if (!explicitContainer) { + reference = this.containers.getReferenceInsideCurrent(lname, false); + } else { + if (['proof', 'subproof', 'air'].includes(explicitContainer)) { + const scopeId = this.scope.getScopeId(explicitContainer); if (scopeId === false) { - throw new Error(`not found scope ${container}`); - } - def = this.definitions[lname]; - if (name === 'air.gw1') { - console.log(def); + throw new Error(`not found scope ${explicitContainer}`); } - if (def && def.scopeId !== scopeId) { - throw new Error(`Not match declaration scope and accessing scope (${container}) of ${name}`); + reference = this.references[lname]; + if (reference && reference.scopeId !== scopeId) { + throw new Error(`Not match declaration scope and accessing scope (${containerName}) of ${name}`); } } - if (!def && this.containers[container]) { - def = this.containers[container].definitions[lname]; + if (reference && this.containers.isDefined(explicitContainer)) { + reference = this.containers.getReferenceInside(explicitContainer, lname, false); } } - if (!def) { - def = this.definitions[name]; + if (!reference) { + reference = this.references[name] ?? false; } - let iuse = this.uses.length; - while (!def && iuse > 0) { - --iuse; - def = this.containers[this.uses[iuse]].definitions[name]; + if (!reference) { + this.containers.getReference(name, false); } - return def; + return reference; } isVisible(def) { return !def.scopeId || def.type === 'constant' || def.scopeId >= this.visibilityScope; // || def.scopeId <= this.scope.getScopeId('air'); } - getDefinition(name, defaultValue) { - // debugger; - const nameInfo = this.decodeName(Array.isArray(name) ? name[0]:name); - let names; + getReference(name, defaultValue) { + // if more than one name is sent, use the first one (mainName). Always first name it's directly + // name defined on source code, second optionally could be name with subproof, because as symbol is + // stored with full name. + const mainName = Array.isArray(name) ? name[0]:name; + const nameInfo = this.decodeName(mainName); + let names =false; + if (nameInfo.scope !== false) { - names = [Array.isArray(name) ? name[0]:name]; + // if scope is specified on mainName, the other names don't make sense + names = [mainName]; } else if (!nameInfo.absoluteScope && nameInfo.parts.length == 2) { - // console.log(['getScopeAlias',nameInfo.parts[0]]); - const container = this.getAlias(nameInfo.parts[0], {container: false}).container; + // absoluteScope means that first scope was proof, subproof or air. If a non absolute + // scope is defined perhaps was an alias. + const container = this.container.getFromAlias(nameInfo.parts[0], false); if (container) { + // if it's an alias associated with container, replace alias with + // container associated. names = [container + '.' + nameInfo.parts.slice(1).join('.')]; } } + if (!names) { names = this.context.getNames(name); } - // console.log(`getDefinition(${name}) on ${this.context.sourceRef} = [${names.join(', ')}]`); - let def; + // console.log(`getReference(${name}) on ${this.context.sourceRef} = [${names.join(', ')}]`); + let reference; for (const name of names) { - def = this.searchDefinition(name); - if (typeof def !== 'undefined') break; + reference = this.searchDefinition(name); + if (reference) break; } - if (typeof def === 'undefined') { + if (reference) { if (typeof defaultValue !== 'undefined') return defaultValue; throw new Error(`Reference ${names.join(',')} not found`); } // constants are visible inside functions - if (this.isVisible(def) === false) { + if (this.isVisible(reference) === false) { if (typeof defaultValue !== 'undefined') return defaultValue; throw new Error(`Reference ${names.join(',')} not visible from current scope`); } - return def; + return reference; } _getInstanceAndLocator (name, indexes) { - const def = this.getDefinition(name); + const def = this.getReference(name); // TODO: partial access !!! // TODO: control array vs indexes const tdata = this._getRegisteredType(def.type); @@ -459,79 +437,74 @@ module.exports = class References { return [tdata.instance, {locator: def.locator, ...extraInfo}, def]; } getReferenceType (name) { - let dest = this.getDefinition(name); - return dest.type ?? false; + return this.getReference(name, {type: false}).type; } setReference (name, value) { - let dest = this.getDefinition(name); - const _value = value instanceof Expression ? value.getAloneOperand() : value; + let reference = this.getReference(name); // TODO: reference not knows operand types - if (_value.type === 3) { - assert(!_value.next); - if (_value.op === 'reference') { - assert(!_value.array); - const src = this.getDefinition(_value.name); + if (value instanceof Expression) { + value = value.getAloneOperand(); + if (value instanceof ReferenceItem) { + assert(!value.next); + assert(!value.array); + const src = this.getReference(value.name); if (src.array) { - const __array = src.array.getIndexesTypedOffset(_value.__indexes); - dest.array = __array.array; - dest.locator = src.locator + __array.offset; + const __array = src.array.getIndexesTypedOffset(value.__indexes); + reference.array = __array.array; + reference.locator = src.locator + __array.offset; } else { - dest.array = false; - dest.locator = src.locator; + reference.array = false; + reference.locator = src.locator; } - dest.type = src.type; - dest.scope = src.scope; - dest.scopeId = src.scopeId; - } else if (_value.op === 'idref') { - dest.locator = _value.id; - dest.type = _value.refType; - dest.scope = false; - dest.scopeId = false; - dest.array = _value.array; + reference.type = src.type; + reference.scope = src.scope; + reference.scopeId = src.scopeId; + } else if (value instanceof ProofItem) { + reference.locator = value.id; + reference.type = value.refType; + reference.scope = false; + reference.scopeId = false; + reference.array = value.array; } + } else if (value instanceof ProofItem) { + assert(!value.__next); + reference.locator = value.id; + reference.type = value.refType; } else { - assert(_value.type == 1); - assert(!_value.__next); - dest.locator = _value.id; - dest.type = _value.refType; + throw new Error(`Invalid reference`); } } - restore (name, cdef) { - this.definitions[name] = cdef; + restore (name, reference) { + this.references[name] = reference; } set (name, indexes, value) { console.log('SET', name, indexes, value); - assert(value !== null); - if (value === null) { - return; - } + assert(value !== null); // to detect obsolete legacy uses - // console.log({name, indexes, value}); - // if (name === 'N_MAX') debugger; + const reference = this.getReference(name); + if (reference) { + reference.set(value, indexes); + } const [instance, info] = this._getInstanceAndLocator(name, indexes); return instance.set(info.locator + info.offset, value); } unset(name) { - console.log(`UNSET ${name}`); - if (name === 'BYTE4_ID') { - EXIT_HERE; - } - let def = this.definitions[name]; + let def = this.references[name]; if (def.array) delete def.array; - delete this.definitions[name]; + delete this.references[name]; } *[Symbol.iterator]() { - for (let index in this.definitions) { + for (let index in this.references) { yield index; } } *keyValuesOfTypes(types) { - for (let index in this.definitions) { - const def = this.definitions[index]; + for (let index in this.references) { + const def = this.references[index]; // console.log({index, ...def}); if (!types.includes(def.type)) continue; yield [index, def]; @@ -539,19 +512,19 @@ module.exports = class References { } *values() { - for (let index in this.definitions) { - yield this.definitions[index]; + for (let index in this.references) { + yield this.references[index]; } } *keyValues() { - for (let index in this.definitions) { - yield [index, this.definitions[index]]; + for (let index in this.references) { + yield [index, this.references[index]]; } } dump () { - for (let name in this.definitions) { - const def = this.definitions[index]; + for (let name in this.references) { + const def = this.references[index]; const indexes = def.array === false ? '': def.multiarray.getLengths().join(','); // console.log(`${name.padEnd(30)}|${def.type.padEnd(10)}|${indexes}`); } diff --git a/src/runtime.js b/src/runtime.js index a8fb38f..7c6c394 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -2,7 +2,7 @@ const util = require('util'); const Expression = require('./expression.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const {assert, assertLog} = require('./assert.js'); -const {Reference, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); +const {ReferenceItem, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); module.exports = class Runtime { @@ -13,7 +13,7 @@ module.exports = class Runtime { eval(operand, options) { - if (operand instanceof Reference) { + if (operand instanceof ReferenceItem) { return this.resolveReference(operand, options); } EXIT_HERE; From 997949b4812274d95361024f5aa0151ba533c660 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 10 Aug 2023 17:50:18 +0200 Subject: [PATCH 07/33] WIP - removing invalid code --- src/TODO.md | 5 + src/containers.js | 48 ++------- src/reference.js | 266 +--------------------------------------------- src/references.js | 69 ++++++++---- src/runtime.js | 2 +- 5 files changed, 69 insertions(+), 321 deletions(-) create mode 100644 src/TODO.md diff --git a/src/TODO.md b/src/TODO.md new file mode 100644 index 0000000..7806607 --- /dev/null +++ b/src/TODO.md @@ -0,0 +1,5 @@ +# TODO +- specifics Exception Class to manage compiler (user) errors and internal errors. +- static context value, to avoid pass on all constructors. Add Fr manager inside context, same for scope and references. +- typecast and type verification. +- second level of optimizations, for example: v1 + (v2 + col) => (v1+v2) + col, similar for prod, sub, etc.. diff --git a/src/containers.js b/src/containers.js index 7064fc9..e162419 100644 --- a/src/containers.js +++ b/src/containers.js @@ -1,6 +1,5 @@ const {assert, assertLog} = require('./assert.js'); module.exports = class Containers { - constructor (parent,context, scope) { this.parent = parent; this.context = context; @@ -116,44 +115,19 @@ module.exports = class Containers { getReference(name, defaultValue) { return this.#getReference(name, defaultValue, this.current, true); } - #getReference(name, defaultValue, container, useAlias) { - const nameInfo = this.decodeName(Array.isArray(name) ? name[0]:name); - let names; - if (nameInfo.scope !== false) { - names = [Array.isArray(name) ? name[0]:name]; - } else if (!nameInfo.absoluteScope && nameInfo.parts.length == 2) { - // console.log(['getScopeAlias',nameInfo.parts[0]]); - const container = this.getAlias(nameInfo.parts[0], {container: false}).container; - if (container) { - names = [container + '.' + nameInfo.parts.slice(1).join('.')]; - } - } - if (!names) { - names = this.context.getNames(name); - } - // console.log(`getReference(${name}) on ${this.context.sourceRef} = [${names.join(', ')}]`); - let reference; - - for (const name of names) { - reference = this.searchDefinition(name); - if (reference) break; - } - if (reference) { - if (typeof defaultValue !== 'undefined') return defaultValue; - throw new Error(`Reference ${names.join(',')} not found`); - } - - // constants are visible inside functions - if (this.isVisible(reference) === false) { - if (typeof defaultValue !== 'undefined') return defaultValue; - throw new Error(`Reference ${names.join(',')} not visible from current scope`); + #getReference(name, defaultValue, container, uses) { + // first search on specific container + let reference = false; + if (container) { + reference = this.containers[container].references[name] ?? false; } - let iuse = this.uses.length; - while (!def && iuse > 0) { - --iuse; - def = this.containers[this.uses[iuse]].definitions[name]; + // if not found check other counters indicate with use + let usesIndex = this.uses.length; + while (!reference && usesIndex > 0) { + --usesIndex; + reference = this.containers[this.uses[usesIndex]].references[name] ?? false; } - return reference; + return reference ? reference : defaultValue; } *[Symbol.iterator]() { for (let name in this.containers) { diff --git a/src/reference.js b/src/reference.js index a07bf38..5c3670f 100644 --- a/src/reference.js +++ b/src/reference.js @@ -25,31 +25,7 @@ module.exports = class Reference { } getId(indexes = []) { - if (!this.array) return id; - - // TODO: - - - - const typedOffset = def.array.getIndexesTypedOffset(indexes); - let res = {locator: def.locator, ...typedOffset}; - - // if instance doesn't support offset, add offset inside locator - // and set offset = false - if (res.offset) { - res.locator += res.offset; - } - res.offset = 0; - // return [tdata.instance, res, def]; - const indexLengthLimit = tdata.instance.rows ? 1 : 0; - if (indexes.length > indexLengthLimit) { - throw new Error(`Invalid array or row access, too many array levels`); - } - let extraInfo = {type: def.type, offset: 0, reference: def.reference, referencedType: def.referencedType}; - if (indexes.length > 0) { - extraInfo.row = indexes[0]; - } - return [tdata.instance, {locator: def.locator, ...extraInfo}, def]; + return (indexes.length === 0 || !this.array) ? this.id : this.array.getIndexesOffset(indexes); } init (value, indexes = []) { return this.set(value, indexes); @@ -68,243 +44,9 @@ module.exports = class Reference { return [false, 1]; } get (indexes = []) { - this.instance.get(this.getId(indexes)); - const [instance, info] = this._getInstanceAndLocator(name, indexes); - return instance.get(info.locator + info.offset); - } - getIdRefValue(type, id) { - return this.getRegisteredType(type).instance.getItem(id); - } - getLabel(type, id, options) { - return this.getRegisteredType(type).instance.getLabel(id, {type, ...options}); - } - getTypeR(name, indexes, options) { - const [instance, info] = this._getInstanceAndLocator(name, indexes); - return [instance.getType(info.locator + info.offset), info.reference, info.array ?? false]; - } - getItem(name, indexes, options) { - indexes = indexes ?? []; - options = options ?? {}; - - const [instance, info, def] = this._getInstanceAndLocator(name, indexes); - let tvalue; - if (info.array) { - // array info, could not be resolved - console.log('***** ARRAY ******'); - tvalue = new ArrayOf(instance.cls, info.locator + info.offset, info.type ?? def.type, instance); - } else { - // no array could be resolved - console.log([instance.constructor.name, info.type]); - tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); - } - // TODO: review - if (info.type !== 'function') { - assertLog(tvalue instanceof ExpressionItem, {name, infotype: info.type, tvalue}); - } - if (typeof info.row !== 'undefined') { - tvalue.row = info.row; - } - if (!info.array) { - tvalue.id = info.locator; - } - if (options.full) { - tvalue.locator = info.locator; - tvalue.instance = instance; - tvalue.offset = info.offset; - } - if (info.dim) { - tvalue.dim = info.dim; -// tvalue.arrayType = info.arrayType; - tvalue.lengths = info.lengths; - } - if (info.array) { - tvalue.dim = 'DEPRECATED'; - tvalue.lengths = 'DEPRECATED'; - tvalue.array = info.array; - } - if (options.preDelta) { - console.log(typeof tvalue.value); - assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); - tvalue.value += options.preDelta; - instance.set(info.locator + info.offset, tvalue.value); - } - if (options.postDelta) { - assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); - instance.set(info.locator + info.offset, tvalue.value + options.postDelta); - } - return tvalue; - } - _getTypedValue (name, indexes, options) { - indexes = indexes ?? []; - options = options ?? {}; - - if (typeof indexes === 'undefined') indexes = []; - - const [instance, info, def] = this._getInstanceAndLocator(name, indexes); - let tvalue; - if (info.array) { - // array info, could not be resolved - console.log('***** ARRAY ******'); - tvalue = new ArrayOf(instance.cls, info.locator + info.offset, info.type ?? def.type, instance); - } else { - // no array could be resolved - console.log([instance.constructor.name, info.type]); - tvalue = instance.getTypedValue(info.locator + info.offset, 0, info.type); - } - // TODO: review - if (info.type !== 'function') { - assertLog(tvalue instanceof ExpressionItem, {name, infotype: info.type, tvalue}); - } - if (typeof info.row !== 'undefined') { - tvalue.row = info.row; - } - if (!info.array) { - tvalue.id = info.locator; - } - if (options.full) { - tvalue.locator = info.locator; - tvalue.instance = instance; - tvalue.offset = info.offset; - } - if (info.dim) { - tvalue.dim = info.dim; -// tvalue.arrayType = info.arrayType; - tvalue.lengths = info.lengths; - } - if (info.array) { - tvalue.dim = 'DEPRECATED'; - tvalue.lengths = 'DEPRECATED'; - tvalue.array = info.array; - } - if (options.preDelta) { - console.log(typeof tvalue.value); - assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); - tvalue.value += options.preDelta; - instance.set(info.locator + info.offset, tvalue.value); - } - if (options.postDelta) { - assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); - instance.set(info.locator + info.offset, tvalue.value + options.postDelta); - } - return tvalue; - } - getTypeInfo (name, indexes = []) { - return this._getInstanceAndLocator(name, indexes); - } - addUse(name) { - if (!this.containers[name]) { - // TODO: defined must be check containers - throw new Exception(`Use not created container ${name}`); - } - this.scope.addToScopeProperty('uses', name); - this.uses.push(name); - } - searchDefinition(name) { - const subnames = name.split('.'); - const container = subnames.length > 1 ? subnames.slice(0, -1).join('.') : false; - const lname = subnames[subnames.length - 1]; - - if (name === 'air.gw1') { - console.log({subnames, container, lname}); - } - let def = false; - - if (this.currentContainer !== false && !container) { - def = this.containers[this.currentContainer].definitions[lname]; - } - if (!def && container) { - if (['proof', 'subproof', 'air'].includes(container)) { - const scopeId = this.scope.getScopeId(container); - if (name === 'air.gw1') { - console.log(scopeId); - } - if (scopeId === false) { - throw new Error(`not found scope ${container}`); - } - def = this.definitions[lname]; - if (name === 'air.gw1') { - console.log(def); - } - if (def && def.scopeId !== scopeId) { - throw new Error(`Not match declaration scope and accessing scope (${container}) of ${name}`); - } - } - if (!def && this.containers[container]) { - def = this.containers[container].definitions[lname]; - } - } - if (!def) { - def = this.definitions[name]; - } - let iuse = this.uses.length; - while (!def && iuse > 0) { - --iuse; - def = this.containers[this.uses[iuse]].definitions[name]; - } - return def; + return this.instance.get(this.getId(indexes)); } - setReference (name, value) { - let dest = this.getReference(name); - // TODO: reference not knows operand types - if (value instanceof Expression) { - value = value.getAloneOperand(); - if (value instanceof ReferenceItem) { - assert(!value.next); - assert(!value.array); - const src = this.getReference(value.name); - if (src.array) { - const __array = src.array.getIndexesTypedOffset(value.__indexes); - dest.array = __array.array; - dest.locator = src.locator + __array.offset; - - } else { - dest.array = false; - dest.locator = src.locator; - } - dest.type = src.type; - dest.scope = src.scope; - dest.scopeId = src.scopeId; - } else if (value instanceof ProofItem) { - dest.locator = value.id; - dest.type = value.refType; - dest.scope = false; - dest.scopeId = false; - dest.array = value.array; - } - } else if (value instanceof ProofItem) { - assert(!value.__next); - dest.locator = value.id; - dest.type = value.refType; - } else { - throw new Error(`Invalid reference`); - } - } - _getInstanceAndLocator (name, indexes) { - const def = this.getDefinition(name); - // TODO: partial access !!! - // TODO: control array vs indexes - const tdata = this._getRegisteredType(def.type); - if (def.array !== false) { - // TODO ROW ACCESS - const typedOffset = def.array.getIndexesTypedOffset(indexes); - let res = {locator: def.locator, ...typedOffset}; - - // if instance doesn't support offset, add offset inside locator - // and set offset = false - if (res.offset) { - res.locator += res.offset; - } - res.offset = 0; - return [tdata.instance, res, def]; - } - const indexLengthLimit = tdata.instance.rows ? 1 : 0; - if (indexes.length > indexLengthLimit) { - throw new Error(`Invalid array or row access, too many array levels`); - } - let extraInfo = {type: def.type, offset: 0, reference: def.reference, referencedType: def.referencedType}; - if (indexes.length > 0) { - extraInfo.row = indexes[0]; - } - return [tdata.instance, {locator: def.locator, ...extraInfo}, def]; + getItem(indexes, options) { + EXIT_HERE_TODO; } } diff --git a/src/references.js b/src/references.js index 795feda..e29f3e2 100644 --- a/src/references.js +++ b/src/references.js @@ -2,8 +2,8 @@ const {assert, assertLog} = require('./assert.js'); const {MultiArray} = require("./multi_array.js"); const Expression = require("./expression.js"); const {ExpressionItem, ArrayOf} = require("./expression_items.js"); -const {Reference} = require('./reference.js'); -const {Containers} = require('./containers.js'); +const Reference = require('./reference.js'); +const Containers = require('./containers.js'); module.exports = class References { constructor (Fr, context, scope) { @@ -97,7 +97,7 @@ module.exports = class References { return {...res, scope: parts[0], name: parts.slice(-1), container: parts.slice(0, -1).join('.')}; } // if absolute, but only 2 or less parts, no container specified. - return {...res, scope: parts[0], static: true, name: parts.slice(1).join('.')}; + return {...res, scope: parts[0], isStatic: true, name: parts.slice(1).join('.')}; } // if no absolute scope, could be an alias if it has 2 parts. return {...res, scope, name}; @@ -117,10 +117,10 @@ module.exports = class References { return container; } isStaticDeclaredPreviously(nameInfo, existingReference) { - if (!nameInfo.static) return false; + if (!nameInfo.isStatic) return false; // only created and init once if (existingReference) { - if (existingReference.static) { + if (existingReference.isStatic) { return true; } throw new Error(`Static reference ${nameInfo.name} has been defined on non-static scope`); @@ -129,11 +129,11 @@ module.exports = class References { } prepareScope(nameInfo, type, existingReference) { - if (nameInfo.static) { - return [this.scope.declare(nameInfo.name, finalType, false, nameInfo.scope), nameInfo.scope]; + if (nameInfo.isStatic) { + return [this.scope.declare(nameInfo.name, type, false, nameInfo.scope), nameInfo.scope]; } - const scopeId = this.hasScope(finalType) ? this.scope.declare(nameInfo.name, finalType, existingReference, false) : 0; + const scopeId = this.hasScope(type) ? this.scope.declare(nameInfo.name, type, existingReference, false) : 0; // scope(name, def) => exception !!! // => scopeId; if (existingReference !== false && existingReference.scopeId === scopeId) { @@ -175,7 +175,8 @@ module.exports = class References { const id = isReference ? null : instance.reserve(size, nameInfo.name, array, data); const reference = new Reference(nameInfo.name, type, isReference, array, id, instance, scopeId, - {container, scope, static, data}); + {container, scope, isStatic: nameInfo.isStatic, data}); + console.log(container, reference); if (container) { this.containers.addReference(nameInfo.name, reference); @@ -199,8 +200,10 @@ module.exports = class References { } get (name, indexes = []) { - const [instance, info] = this._getInstanceAndLocator(name, indexes); - return instance.get(info.locator + info.offset); + console.log('GET', name, indexes); + + // getReference produce an exception if name not found + return this.getReference(name).get(indexes); } getIdRefValue(type, id) { return this.getTypeDefinition(type).instance.getItem(id); @@ -213,9 +216,31 @@ module.exports = class References { return [instance.getType(info.locator + info.offset), info.reference, info.array ?? false]; } getItem(name, indexes, options) { + + assert(typeof name === 'string' || (Array.isArray(name) && name.length > 0)); + indexes = indexes ?? []; options = options ?? {}; + console.log(name); + const reference = this.getReference(name); + const item = reference.getItem(indexes); + console.log(item); + + EXIT_HERE; + + if (options.preDelta) { + console.log(typeof tvalue.value); + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + tvalue.value += options.preDelta; + instance.set(info.locator + info.offset, tvalue.value); + } + if (options.postDelta) { + assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); + instance.set(info.locator + info.offset, tvalue.value + options.postDelta); + } + return item; + const [instance, info, def] = this._getInstanceAndLocator(name, indexes); let tvalue; if (info.array) { @@ -336,6 +361,9 @@ module.exports = class References { let reference = false; + if (name === 'MODULE_ID') { + debugger; + } if (!explicitContainer) { reference = this.containers.getReferenceInsideCurrent(lname, false); } else { @@ -370,7 +398,7 @@ module.exports = class References { // stored with full name. const mainName = Array.isArray(name) ? name[0]:name; const nameInfo = this.decodeName(mainName); - let names =false; + let names = false; if (nameInfo.scope !== false) { // if scope is specified on mainName, the other names don't make sense @@ -378,7 +406,7 @@ module.exports = class References { } else if (!nameInfo.absoluteScope && nameInfo.parts.length == 2) { // absoluteScope means that first scope was proof, subproof or air. If a non absolute // scope is defined perhaps was an alias. - const container = this.container.getFromAlias(nameInfo.parts[0], false); + const container = this.containers.getFromAlias(nameInfo.parts[0], false); if (container) { // if it's an alias associated with container, replace alias with // container associated. @@ -386,17 +414,20 @@ module.exports = class References { } } + console.log(names); if (!names) { names = this.context.getNames(name); } + + console.log(names); // console.log(`getReference(${name}) on ${this.context.sourceRef} = [${names.join(', ')}]`); - let reference; + let reference = false; for (const name of names) { reference = this.searchDefinition(name); if (reference) break; } - if (reference) { + if (!reference) { if (typeof defaultValue !== 'undefined') return defaultValue; throw new Error(`Reference ${names.join(',')} not found`); } @@ -482,12 +513,8 @@ module.exports = class References { console.log('SET', name, indexes, value); assert(value !== null); // to detect obsolete legacy uses - const reference = this.getReference(name); - if (reference) { - reference.set(value, indexes); - } - const [instance, info] = this._getInstanceAndLocator(name, indexes); - return instance.set(info.locator + info.offset, value); + // getReference produce an exception if name not found + this.getReference(name).set(value, indexes); } unset(name) { diff --git a/src/runtime.js b/src/runtime.js index 7c6c394..08109a0 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -46,7 +46,7 @@ module.exports = class Runtime { if (operand.dec === 'post') { getTypeValueOptions.postDelta = -1n; } - let res = this.context.references.getTypedValue(names, operand.__indexes ?? [], options); + let res = this.context.references.getItem(names, operand.__indexes ?? [], options); if (typeof operand.__next !== 'undefined') { res.__next = res.next = operand.__next; } else if (typeof operand.next !== 'number' && (operand.next || operand.prior)) { From 018da3e9b37cc5d3a87736569d35f9233ee81110 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Sat, 2 Sep 2023 09:11:40 +0200 Subject: [PATCH 08/33] WIP - refactoring expression items and definitions --- build/pil_parser.js | 865 +++++++++--------- src/assign.js | 29 +- src/builtin/assert_eq.js | 13 +- src/constraints.js | 16 +- src/containers.js | 11 +- src/context.js | 32 +- src/definition_items.js | 33 + src/definition_items/challenge.js | 12 + src/definition_items/definition_item.js | 68 ++ src/definition_items/expression_reference.js | 3 + src/definition_items/fe_value.js | 17 + src/definition_items/fixed_col.js | 54 ++ src/definition_items/int_value.js | 40 + src/definition_items/proof_item.js | 26 + .../proof_stage_item.js | 0 src/definition_items/proofval.js | 10 + src/definition_items/public.js | 12 + src/definition_items/publictable.js | 12 + src/definition_items/reference_item.js | 20 + src/definition_items/runtime_item.js | 20 + src/definition_items/string_value.js | 27 + src/definition_items/subproofval.js | 16 + src/definition_items/value_item.js | 21 + src/definition_items/witness_col.js | 14 + src/definitions.js | 3 +- src/expression.js | 14 +- src/expression_items/challenge.js | 10 +- src/expression_items/expression_item.js | 6 +- src/expression_items/fe_value.js | 4 +- src/expression_items/function_call.js | 7 +- src/expression_items/int_value.js | 9 +- src/expression_items/witness_col.js | 6 +- src/expressions.js | 20 +- src/fixed_cols.js | 5 +- src/function.js | 70 +- src/ids.js | 15 +- src/indexable.js | 85 +- src/multi_array.js | 3 + src/pil_parser.jison | 10 +- src/processor.js | 92 +- src/proto_out.js | 3 + src/reference.js | 10 +- src/references.js | 46 +- src/runtime.js | 10 +- src/scope.js | 30 +- src/sequence.js | 1 + src/subproof.js | 8 +- src/subproofs.js | 6 +- src/variables.js | 4 +- src/witness_cols.js | 6 +- test/pil2/vadcop-fibonacci/module.pil | 2 +- 51 files changed, 1179 insertions(+), 677 deletions(-) create mode 100644 src/definition_items.js create mode 100644 src/definition_items/challenge.js create mode 100644 src/definition_items/definition_item.js create mode 100644 src/definition_items/expression_reference.js create mode 100644 src/definition_items/fe_value.js create mode 100644 src/definition_items/fixed_col.js create mode 100644 src/definition_items/int_value.js create mode 100644 src/definition_items/proof_item.js rename src/{expression_items => definition_items}/proof_stage_item.js (100%) create mode 100644 src/definition_items/proofval.js create mode 100644 src/definition_items/public.js create mode 100644 src/definition_items/publictable.js create mode 100644 src/definition_items/reference_item.js create mode 100644 src/definition_items/runtime_item.js create mode 100644 src/definition_items/string_value.js create mode 100644 src/definition_items/subproofval.js create mode 100644 src/definition_items/value_item.js create mode 100644 src/definition_items/witness_col.js diff --git a/build/pil_parser.js b/build/pil_parser.js index ac31294..58c0d5a 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -72,829 +72,826 @@ } */ var pil_parser = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,31,52,53,60,61,73,76,78,79,81,82,137,154],$V1=[1,30],$V2=[1,31],$V3=[1,21],$V4=[1,23],$V5=[1,24],$V6=[1,27],$V7=[1,28],$V8=[1,25],$V9=[1,26],$Va=[1,22],$Vb=[1,29],$Vc=[1,40],$Vd=[1,41],$Ve=[26,67,95,143],$Vf=[2,214],$Vg=[1,43],$Vh=[1,44],$Vi=[1,45],$Vj=[1,49],$Vk=[1,50],$Vl=[1,52],$Vm=[1,51],$Vn=[1,89],$Vo=[1,111],$Vp=[1,110],$Vq=[1,134],$Vr=[1,88],$Vs=[2,38],$Vt=[1,133],$Vu=[1,84],$Vv=[1,105],$Vw=[1,85],$Vx=[1,128],$Vy=[1,129],$Vz=[1,132],$VA=[1,135],$VB=[1,124],$VC=[1,125],$VD=[1,126],$VE=[1,119],$VF=[1,96],$VG=[1,127],$VH=[1,131],$VI=[1,109],$VJ=[1,94],$VK=[1,95],$VL=[1,112],$VM=[1,113],$VN=[1,114],$VO=[1,115],$VP=[1,116],$VQ=[1,117],$VR=[1,101],$VS=[1,102],$VT=[1,121],$VU=[1,103],$VV=[1,97],$VW=[1,98],$VX=[1,99],$VY=[1,107],$VZ=[1,123],$V_=[2,65],$V$=[1,153],$V01=[1,138],$V11=[1,141],$V21=[1,142],$V31=[1,143],$V41=[1,144],$V51=[1,145],$V61=[1,146],$V71=[1,147],$V81=[1,148],$V91=[1,149],$Va1=[1,150],$Vb1=[1,151],$Vc1=[1,152],$Vd1=[6,8,30,31,52,53,60,61,73,76,78,79,81,82,108,137,154],$Ve1=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vf1=[2,254],$Vg1=[1,165],$Vh1=[1,166],$Vi1=[6,8,30,31,52,53,56,60,61,63,73,76,78,79,81,82,107,108,127,137,154],$Vj1=[6,8,30,31,52,53,60,61,63,73,76,78,79,81,82,107,108,137,154],$Vk1=[2,54],$Vl1=[1,175],$Vm1=[1,178],$Vn1=[1,179],$Vo1=[1,180],$Vp1=[1,181],$Vq1=[1,182],$Vr1=[21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vs1=[1,189],$Vt1=[8,30,108],$Vu1=[1,197],$Vv1=[1,191],$Vw1=[1,192],$Vx1=[1,193],$Vy1=[1,194],$Vz1=[1,195],$VA1=[1,196],$VB1=[1,198],$VC1=[1,199],$VD1=[1,200],$VE1=[1,201],$VF1=[1,202],$VG1=[1,203],$VH1=[1,204],$VI1=[1,205],$VJ1=[1,206],$VK1=[1,207],$VL1=[1,208],$VM1=[1,209],$VN1=[1,210],$VO1=[1,211],$VP1=[1,212],$VQ1=[1,213],$VR1=[8,21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$VS1=[1,221],$VT1=[1,223],$VU1=[2,307],$VV1=[1,227],$VW1=[1,228],$VX1=[1,230],$VY1=[1,231],$VZ1=[1,232],$V_1=[1,233],$V$1=[1,237],$V02=[1,236],$V12=[1,238],$V22=[1,240],$V32=[1,242],$V42=[1,247],$V52=[1,257],$V62=[1,258],$V72=[1,256],$V82=[8,30,107,108],$V92=[1,267],$Va2=[1,266],$Vb2=[1,262],$Vc2=[1,263],$Vd2=[1,264],$Ve2=[1,265],$Vf2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vg2=[2,336],$Vh2=[1,272],$Vi2=[1,271],$Vj2=[1,274],$Vk2=[1,280],$Vl2=[1,285],$Vm2=[1,290],$Vn2=[6,8,30,31,46,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vo2=[6,8,25,28,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vp2=[2,344],$Vq2=[1,305],$Vr2=[48,63],$Vs2=[6,8,26,28,30,31,48,52,53,55,56,58,60,61,63,64,67,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vt2=[6,8,30,31,52,53,60,61,73,76,78,79,81,82,107,108,137,154],$Vu2=[1,326],$Vv2=[1,338],$Vw2=[48,58,63],$Vx2=[8,21,24,26,28,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vy2=[1,372],$Vz2=[1,376],$VA2=[1,377],$VB2=[26,31,46,61,67,69,70,71,73,77,95,121,123,141,142,143,170,171,172,178,180],$VC2=[1,380],$VD2=[1,389],$VE2=[2,190],$VF2=[2,241],$VG2=[1,418],$VH2=[1,422],$VI2=[8,30,63,107,108],$VJ2=[2,193],$VK2=[8,30,58,63,107,108,127],$VL2=[58,63],$VM2=[1,443],$VN2=[1,444],$VO2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167],$VP2=[6,8,28,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VQ2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,108,118,137,146,147,154,162,163,167],$VR2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,108,118,137,146,147,154,163,167],$VS2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172],$VT2=[6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176],$VU2=[1,475],$VV2=[30,63],$VW2=[6,8,28,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VX2=[1,483],$VY2=[1,485],$VZ2=[2,41],$V_2=[8,107],$V$2=[1,515],$V03=[1,539],$V13=[6,8,25,28,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,151,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$V23=[1,559],$V33=[1,560],$V43=[1,563],$V53=[1,564],$V63=[1,565],$V73=[58,63,64],$V83=[2,240],$V93=[1,567],$Va3=[8,30],$Vb3=[8,30,56,58,63,107,108,127],$Vc3=[6,8,30,31,46,48,52,53,55,56,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vd3=[30,58,63],$Ve3=[6,8,30,31,48,52,53,60,61,63,73,76,78,79,81,82,107,108,137,154],$Vf3=[55,58,63,64],$Vg3=[6,8,21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vh3=[1,663],$Vi3=[1,671],$Vj3=[1,672],$Vk3=[1,711],$Vl3=[55,63],$Vm3=[30,116,119]; +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,25,32,53,54,61,62,70,71,72,73,74,77,78,79,80,82,83,137,154],$V1=[1,39],$V2=[1,33],$V3=[1,34],$V4=[1,22],$V5=[1,35],$V6=[1,36],$V7=[1,37],$V8=[1,32],$V9=[1,24],$Va=[1,25],$Vb=[1,38],$Vc=[1,28],$Vd=[1,29],$Ve=[1,26],$Vf=[1,27],$Vg=[1,23],$Vh=[1,30],$Vi=[1,47],$Vj=[1,49],$Vk=[1,50],$Vl=[27,68,95,143],$Vm=[2,215],$Vn=[1,52],$Vo=[1,53],$Vp=[1,54],$Vq=[1,58],$Vr=[1,59],$Vs=[1,61],$Vt=[1,60],$Vu=[6,8,25,31,32,53,54,61,62,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],$Vv=[1,69],$Vw=[1,76],$Vx=[1,75],$Vy=[1,77],$Vz=[1,74],$VA=[1,82],$VB=[1,93],$VC=[1,122],$VD=[1,144],$VE=[1,143],$VF=[1,121],$VG=[2,39],$VH=[1,117],$VI=[1,138],$VJ=[1,118],$VK=[1,159],$VL=[1,155],$VM=[1,156],$VN=[1,157],$VO=[1,129],$VP=[1,158],$VQ=[1,142],$VR=[1,127],$VS=[1,128],$VT=[1,145],$VU=[1,146],$VV=[1,147],$VW=[1,148],$VX=[1,149],$VY=[1,150],$VZ=[1,134],$V_=[1,135],$V$=[1,152],$V01=[1,136],$V11=[1,130],$V21=[1,131],$V31=[1,132],$V41=[1,140],$V51=[1,154],$V61=[2,66],$V71=[1,178],$V81=[1,163],$V91=[1,166],$Va1=[1,167],$Vb1=[1,168],$Vc1=[1,169],$Vd1=[1,170],$Ve1=[1,171],$Vf1=[1,172],$Vg1=[1,173],$Vh1=[1,174],$Vi1=[1,175],$Vj1=[1,176],$Vk1=[1,177],$Vl1=[6,8,25,31,32,53,54,61,62,70,71,72,73,74,77,78,79,80,82,83,108,137,154],$Vm1=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vn1=[2,255],$Vo1=[1,191],$Vp1=[1,192],$Vq1=[6,8,25,31,32,53,54,57,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137,154],$Vr1=[6,8,25,31,32,53,54,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],$Vs1=[2,345],$Vt1=[2,55],$Vu1=[1,198],$Vv1=[1,199],$Vw1=[2,194],$Vx1=[6,8,25,31,32,53,54,59,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137,154],$Vy1=[2,191],$Vz1=[1,202],$VA1=[6,8,25,26,29,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VB1=[1,221],$VC1=[1,224],$VD1=[1,225],$VE1=[1,226],$VF1=[1,227],$VG1=[1,228],$VH1=[22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$VI1=[1,235],$VJ1=[8,31,108],$VK1=[1,243],$VL1=[1,237],$VM1=[1,238],$VN1=[1,239],$VO1=[1,240],$VP1=[1,241],$VQ1=[1,242],$VR1=[1,244],$VS1=[1,245],$VT1=[1,246],$VU1=[1,247],$VV1=[1,248],$VW1=[1,249],$VX1=[1,250],$VY1=[1,251],$VZ1=[1,252],$V_1=[1,253],$V$1=[1,254],$V02=[1,255],$V12=[1,256],$V22=[1,257],$V32=[1,258],$V42=[1,259],$V52=[8,22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$V62=[1,267],$V72=[1,269],$V82=[2,308],$V92=[1,273],$Va2=[1,274],$Vb2=[1,276],$Vc2=[1,277],$Vd2=[1,278],$Ve2=[1,279],$Vf2=[1,283],$Vg2=[1,282],$Vh2=[1,284],$Vi2=[1,286],$Vj2=[1,288],$Vk2=[1,301],$Vl2=[1,302],$Vm2=[1,300],$Vn2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vo2=[2,337],$Vp2=[1,309],$Vq2=[1,308],$Vr2=[1,311],$Vs2=[1,314],$Vt2=[1,317],$Vu2=[1,320],$Vv2=[6,8,25,31,32,47,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vw2=[49,64],$Vx2=[6,8,25,27,29,31,32,49,53,54,56,57,59,61,62,64,65,68,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vy2=[1,346],$Vz2=[1,357],$VA2=[1,358],$VB2=[59,64],$VC2=[1,380],$VD2=[49,59,64],$VE2=[8,22,25,27,29,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,121,123,129,137,141,142,143,154,170,171,172,178,180],$VF2=[1,414],$VG2=[1,418],$VH2=[1,419],$VI2=[27,32,47,62,68,70,71,72,74,78,95,121,123,141,142,143,170,171,172,178,180],$VJ2=[1,422],$VK2=[2,242],$VL2=[1,451],$VM2=[1,483],$VN2=[6,8,25,26,29,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,151,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VO2=[6,8,25,31,32,53,54,57,59,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137,154],$VP2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167],$VQ2=[6,8,25,29,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VR2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,154,162,163,167],$VS2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,154,163,167],$VT2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172],$VU2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176],$VV2=[1,500],$VW2=[31,64],$VX2=[6,8,25,29,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VY2=[1,508],$VZ2=[1,510],$V_2=[2,42],$V$2=[8,107],$V03=[1,535],$V13=[1,576],$V23=[1,577],$V33=[1,580],$V43=[1,581],$V53=[1,582],$V63=[59,64,65],$V73=[2,241],$V83=[1,584],$V93=[8,31],$Va3=[6,8,25,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vb3=[31,59,64],$Vc3=[6,8,25,31,32,49,53,54,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],$Vd3=[56,59,64,65],$Ve3=[6,8,22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vf3=[1,674],$Vg3=[1,681],$Vh3=[1,682],$Vi3=[1,716],$Vj3=[56,64],$Vk3=[31,116,119]; var parser = {trace: function trace () { Jison.print.apply(null, arguments); }, yy: {}, -symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"constant_definition":19,"use_directive":20,"USE":21,"name_reference":22,"no_closed_container_definition":23,"CONTAINER":24,"ALIAS":25,"IDENTIFIER":26,"closed_container_definition":27,"{":28,"declare_block":29,"}":30,"PROOF":31,"statement_block":32,"non_delimited_statement":33,"statement_closed":34,"lcs":35,"statement_no_closed":36,"statement_list":37,"statement_list_closed":38,"declare_list":39,"when_boundary":40,"FIRST":41,"LAST":42,"FRAME":43,"codeblock_closed":44,"WHEN":45,"(":46,"expression":47,")":48,"METADATA":49,"data_object":50,"function":51,"FUNCTION":52,"PRIVATE":53,"arguments":54,":":55,"[":56,"return_type_list":57,"]":58,"return_type":59,"FINAL":60,"SUBPROOF":61,"arguments_list":62,",":63,"DOTS_FILL":64,"argument":65,"basic_type":66,"REFERENCE":67,"type_array":68,"INT":69,"FE":70,"EXPR":71,"CONST":72,"COL":73,"WITNESS":74,"FIXED":75,"CHALLENGE":76,"T_STRING":77,"PROOF_VALUE":78,"SUBPROOF_VALUE":79,"AIR_VALUE":80,"PUBLIC":81,"PUBLIC_TABLE":82,"declare_item":83,"variable_declaration":84,"codeblock_no_closed":85,"===":86,"delayed_function_call":87,"data_value":88,"data_array":89,"function_call":90,"name_optional_index":91,"multiple_expression_list":92,"delayed_function_event":93,"defined_scopes":94,"AIR":95,"ON":96,"variable_assignment":97,"variable_multiple_assignment":98,"return_statement":99,"CONTINUE":100,"BREAK":101,"in_expression":102,"expression_list":103,"FOR":104,"for_init":105,"variable_assignment_list":106,"IN":107,"WHILE":108,"DO":109,"ONCE":110,"SWITCH":111,"case_body":112,"IF":113,"ELSE":114,"case_list":115,"DEFAULT":116,"case_value":117,"DOTS_RANGE":118,"CASE":119,"for_assignation":120,"INC":121,"name_id":122,"DEC":123,"variable_type_declaration":124,"variable_declaration_list":125,"variable_declaration_item":126,"=":127,"variable_declaration_array":128,"RETURN":129,"assign_operation":130,"+=":131,"-=":132,"*=":133,"left_variable_multiple_assignment_list":134,"left_variable_multiple_assignment":135,"sequence_definition":136,"INCLUDE":137,"flexible_string":138,"stage_definition":139,"STAGE":140,"NUMBER":141,"STRING":142,"TEMPLATE_STRING":143,"sequence_list":144,"sequence":145,"DOTS_ARITH_SEQ":146,"DOTS_GEOM_SEQ":147,"declaration_array":148,"col_declaration_item":149,"col_declaration_ident":150,".":151,"col_declaration_list":152,"AGGREGATE":153,"CONSTANT":154,"EQ":155,"NE":156,"LT":157,"GT":158,"LE":159,"GE":160,"IS":161,"AND":162,"?":163,"B_AND":164,"B_OR":165,"B_XOR":166,"OR":167,"SHL":168,"SHR":169,"!":170,"+":171,"-":172,"*":173,"%":174,"/":175,"\\\\":176,"POW":177,"POSITIONAL_PARAM":178,"casting":179,"'":180,"array_index":181,"name_reference_right":182,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"EOF",8:"CS",21:"USE",24:"CONTAINER",25:"ALIAS",26:"IDENTIFIER",28:"{",30:"}",31:"PROOF",41:"FIRST",42:"LAST",43:"FRAME",45:"WHEN",46:"(",48:")",49:"METADATA",52:"FUNCTION",53:"PRIVATE",55:":",56:"[",58:"]",60:"FINAL",61:"SUBPROOF",63:",",64:"DOTS_FILL",67:"REFERENCE",69:"INT",70:"FE",71:"EXPR",72:"CONST",73:"COL",74:"WITNESS",75:"FIXED",76:"CHALLENGE",77:"T_STRING",78:"PROOF_VALUE",79:"SUBPROOF_VALUE",80:"AIR_VALUE",81:"PUBLIC",82:"PUBLIC_TABLE",86:"===",95:"AIR",96:"ON",100:"CONTINUE",101:"BREAK",104:"FOR",107:"IN",108:"WHILE",109:"DO",110:"ONCE",111:"SWITCH",113:"IF",114:"ELSE",116:"DEFAULT",118:"DOTS_RANGE",119:"CASE",121:"INC",123:"DEC",127:"=",129:"RETURN",131:"+=",132:"-=",133:"*=",137:"INCLUDE",140:"STAGE",141:"NUMBER",142:"STRING",143:"TEMPLATE_STRING",146:"DOTS_ARITH_SEQ",147:"DOTS_GEOM_SEQ",151:".",153:"AGGREGATE",154:"CONSTANT",155:"EQ",156:"NE",157:"LT",158:"GT",159:"LE",160:"GE",161:"IS",162:"AND",163:"?",164:"B_AND",165:"B_OR",166:"B_XOR",167:"OR",168:"SHL",169:"SHR",170:"!",171:"+",172:"-",173:"*",174:"%",175:"/",176:"\\\\",177:"POW",178:"POSITIONAL_PARAM",180:"'"}, -productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[20,2],[23,2],[23,4],[27,5],[27,7],[10,4],[33,1],[33,2],[33,1],[33,2],[37,1],[37,2],[37,1],[38,2],[38,3],[38,3],[38,1],[38,2],[38,2],[38,1],[32,1],[32,0],[29,1],[29,2],[29,0],[35,2],[35,1],[40,1],[40,1],[40,1],[34,1],[34,5],[34,3],[34,4],[34,1],[34,1],[34,3],[51,2],[51,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[54,1],[54,3],[54,1],[54,0],[62,3],[62,1],[65,2],[65,2],[65,3],[65,3],[66,1],[66,1],[66,1],[66,2],[66,2],[66,2],[66,2],[66,2],[66,1],[66,1],[66,2],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[57,3],[57,1],[68,3],[68,2],[59,1],[59,2],[39,3],[39,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[36,1],[36,1],[36,1],[36,1],[36,3],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[88,1],[88,3],[88,3],[50,5],[50,3],[50,3],[50,1],[89,3],[89,1],[90,4],[93,1],[94,1],[94,1],[94,1],[87,7],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[102,1],[102,3],[44,9],[44,7],[44,5],[44,6],[44,6],[44,3],[44,5],[44,5],[44,7],[112,3],[112,5],[117,3],[117,5],[117,1],[117,3],[115,5],[115,4],[120,1],[120,2],[120,2],[120,2],[120,2],[105,1],[105,1],[105,1],[105,1],[84,1],[84,2],[124,2],[124,2],[124,2],[124,2],[124,2],[124,4],[124,4],[124,4],[124,4],[124,4],[124,4],[124,8],[124,8],[124,8],[124,8],[124,8],[128,2],[128,3],[128,3],[128,4],[126,1],[126,2],[125,3],[125,1],[99,1],[99,2],[99,4],[130,1],[130,1],[130,1],[130,1],[134,3],[134,2],[134,1],[135,3],[135,5],[98,3],[98,5],[97,3],[97,3],[106,3],[106,1],[12,2],[139,4],[139,0],[138,1],[138,1],[136,3],[136,4],[136,5],[136,6],[144,3],[144,5],[144,5],[144,5],[144,9],[144,9],[144,4],[144,4],[144,6],[144,6],[144,1],[144,3],[145,3],[145,3],[145,5],[145,5],[145,7],[145,2],[145,3],[145,1],[92,0],[92,3],[92,5],[92,3],[92,1],[103,4],[103,3],[103,2],[103,1],[148,2],[148,3],[148,3],[148,4],[149,1],[149,2],[150,1],[150,1],[150,1],[150,3],[150,3],[152,3],[152,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[19,4],[19,5],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,5],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,2],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,2],[47,2],[47,1],[47,2],[47,2],[47,2],[47,2],[47,1],[47,1],[47,3],[47,1],[47,1],[47,1],[179,4],[179,4],[179,4],[179,4],[179,4],[179,5],[179,5],[179,5],[179,5],[179,5],[122,2],[122,3],[122,5],[122,3],[122,2],[122,3],[122,5],[122,3],[122,1],[91,1],[91,2],[181,4],[181,3],[22,3],[22,3],[22,3],[22,1],[22,3],[22,1],[22,3],[182,3],[182,3],[182,1],[182,1]], +symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"constant_definition":19,"variable_declaration":20,"use_directive":21,"USE":22,"name_reference":23,"no_closed_container_definition":24,"CONTAINER":25,"ALIAS":26,"IDENTIFIER":27,"closed_container_definition":28,"{":29,"declare_block":30,"}":31,"PROOF":32,"statement_block":33,"non_delimited_statement":34,"statement_closed":35,"lcs":36,"statement_no_closed":37,"statement_list":38,"statement_list_closed":39,"declare_list":40,"when_boundary":41,"FIRST":42,"LAST":43,"FRAME":44,"codeblock_closed":45,"WHEN":46,"(":47,"expression":48,")":49,"METADATA":50,"data_object":51,"function":52,"FUNCTION":53,"PRIVATE":54,"arguments":55,":":56,"[":57,"return_type_list":58,"]":59,"return_type":60,"FINAL":61,"SUBPROOF":62,"arguments_list":63,",":64,"DOTS_FILL":65,"argument":66,"basic_type":67,"REFERENCE":68,"type_array":69,"INT":70,"FE":71,"EXPR":72,"CONST":73,"COL":74,"WITNESS":75,"FIXED":76,"CHALLENGE":77,"T_STRING":78,"PROOF_VALUE":79,"SUBPROOF_VALUE":80,"AIR_VALUE":81,"PUBLIC":82,"PUBLIC_TABLE":83,"declare_item":84,"codeblock_no_closed":85,"===":86,"delayed_function_call":87,"data_value":88,"data_array":89,"function_call":90,"name_optional_index":91,"multiple_expression_list":92,"delayed_function_event":93,"defined_scopes":94,"AIR":95,"ON":96,"variable_assignment":97,"variable_multiple_assignment":98,"return_statement":99,"CONTINUE":100,"BREAK":101,"in_expression":102,"expression_list":103,"FOR":104,"for_init":105,"variable_assignment_list":106,"IN":107,"WHILE":108,"DO":109,"ONCE":110,"SWITCH":111,"case_body":112,"IF":113,"ELSE":114,"case_list":115,"DEFAULT":116,"case_value":117,"DOTS_RANGE":118,"CASE":119,"for_assignation":120,"INC":121,"name_id":122,"DEC":123,"variable_type_declaration":124,"variable_declaration_list":125,"variable_declaration_item":126,"=":127,"variable_declaration_array":128,"RETURN":129,"assign_operation":130,"+=":131,"-=":132,"*=":133,"left_variable_multiple_assignment_list":134,"left_variable_multiple_assignment":135,"sequence_definition":136,"INCLUDE":137,"flexible_string":138,"stage_definition":139,"STAGE":140,"NUMBER":141,"STRING":142,"TEMPLATE_STRING":143,"sequence_list":144,"sequence":145,"DOTS_ARITH_SEQ":146,"DOTS_GEOM_SEQ":147,"declaration_array":148,"col_declaration_item":149,"col_declaration_ident":150,".":151,"col_declaration_list":152,"AGGREGATE":153,"CONSTANT":154,"EQ":155,"NE":156,"LT":157,"GT":158,"LE":159,"GE":160,"IS":161,"AND":162,"?":163,"B_AND":164,"B_OR":165,"B_XOR":166,"OR":167,"SHL":168,"SHR":169,"!":170,"+":171,"-":172,"*":173,"%":174,"/":175,"\\\\":176,"POW":177,"POSITIONAL_PARAM":178,"casting":179,"'":180,"array_index":181,"name_reference_right":182,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"EOF",8:"CS",22:"USE",25:"CONTAINER",26:"ALIAS",27:"IDENTIFIER",29:"{",31:"}",32:"PROOF",42:"FIRST",43:"LAST",44:"FRAME",46:"WHEN",47:"(",49:")",50:"METADATA",53:"FUNCTION",54:"PRIVATE",56:":",57:"[",59:"]",61:"FINAL",62:"SUBPROOF",64:",",65:"DOTS_FILL",68:"REFERENCE",70:"INT",71:"FE",72:"EXPR",73:"CONST",74:"COL",75:"WITNESS",76:"FIXED",77:"CHALLENGE",78:"T_STRING",79:"PROOF_VALUE",80:"SUBPROOF_VALUE",81:"AIR_VALUE",82:"PUBLIC",83:"PUBLIC_TABLE",86:"===",95:"AIR",96:"ON",100:"CONTINUE",101:"BREAK",104:"FOR",107:"IN",108:"WHILE",109:"DO",110:"ONCE",111:"SWITCH",113:"IF",114:"ELSE",116:"DEFAULT",118:"DOTS_RANGE",119:"CASE",121:"INC",123:"DEC",127:"=",129:"RETURN",131:"+=",132:"-=",133:"*=",137:"INCLUDE",140:"STAGE",141:"NUMBER",142:"STRING",143:"TEMPLATE_STRING",146:"DOTS_ARITH_SEQ",147:"DOTS_GEOM_SEQ",151:".",153:"AGGREGATE",154:"CONSTANT",155:"EQ",156:"NE",157:"LT",158:"GT",159:"LE",160:"GE",161:"IS",162:"AND",163:"?",164:"B_AND",165:"B_OR",166:"B_XOR",167:"OR",168:"SHL",169:"SHR",170:"!",171:"+",172:"-",173:"*",174:"%",175:"/",176:"\\\\",177:"POW",178:"POSITIONAL_PARAM",180:"'"}, +productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[21,2],[24,2],[24,4],[28,5],[28,7],[10,4],[34,1],[34,2],[34,1],[34,2],[38,1],[38,2],[38,1],[39,2],[39,3],[39,3],[39,1],[39,2],[39,2],[39,1],[33,1],[33,0],[30,1],[30,2],[30,0],[36,2],[36,1],[41,1],[41,1],[41,1],[35,1],[35,5],[35,3],[35,4],[35,1],[35,1],[35,3],[52,2],[52,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[55,1],[55,3],[55,1],[55,0],[63,3],[63,1],[66,2],[66,2],[66,3],[66,3],[67,1],[67,1],[67,1],[67,2],[67,2],[67,2],[67,2],[67,2],[67,1],[67,1],[67,2],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[58,3],[58,1],[69,3],[69,2],[60,1],[60,2],[40,3],[40,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[37,1],[37,1],[37,1],[37,1],[37,3],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[88,1],[88,3],[88,3],[51,5],[51,3],[51,3],[51,1],[89,3],[89,1],[90,4],[93,1],[94,1],[94,1],[94,1],[87,7],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[102,1],[102,3],[45,9],[45,7],[45,5],[45,6],[45,6],[45,3],[45,5],[45,5],[45,7],[112,3],[112,5],[117,3],[117,5],[117,1],[117,3],[115,5],[115,4],[120,1],[120,2],[120,2],[120,2],[120,2],[105,1],[105,1],[105,1],[105,1],[20,1],[20,2],[124,2],[124,2],[124,2],[124,2],[124,2],[124,4],[124,4],[124,4],[124,4],[124,4],[124,4],[124,8],[124,8],[124,8],[124,8],[124,8],[128,2],[128,3],[128,3],[128,4],[126,1],[126,2],[125,3],[125,1],[99,1],[99,2],[99,4],[130,1],[130,1],[130,1],[130,1],[134,3],[134,2],[134,1],[135,3],[135,5],[98,3],[98,5],[97,3],[97,3],[106,3],[106,1],[12,2],[139,4],[139,0],[138,1],[138,1],[136,3],[136,4],[136,5],[136,6],[144,3],[144,5],[144,5],[144,5],[144,9],[144,9],[144,4],[144,4],[144,6],[144,6],[144,1],[144,3],[145,3],[145,3],[145,5],[145,5],[145,7],[145,2],[145,3],[145,1],[92,0],[92,3],[92,5],[92,3],[92,1],[103,4],[103,3],[103,2],[103,1],[148,2],[148,3],[148,3],[148,4],[149,1],[149,2],[150,1],[150,1],[150,1],[150,3],[150,3],[152,3],[152,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[19,4],[19,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,2],[48,1],[48,2],[48,2],[48,2],[48,2],[48,1],[48,1],[48,3],[48,1],[48,1],[48,1],[179,4],[179,4],[179,4],[179,4],[179,4],[179,5],[179,5],[179,5],[179,5],[179,5],[122,2],[122,3],[122,5],[122,3],[122,2],[122,3],[122,5],[122,3],[122,1],[91,1],[91,2],[181,4],[181,3],[23,3],[23,3],[23,3],[23,1],[23,3],[23,1],[23,3],[182,3],[182,3],[182,1],[182,1]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { /* this == yyval */ var $0 = $$.length - 1; switch (yystate) { case 1: - this.$ = $$[$0-2]; return this.$; + this.$ = $$[$0-2]; return this.$; break; case 2: - this.$ = [...$$[$0-2], $$[$0]] + this.$ = [...$$[$0-2], $$[$0]] break; case 3: - this.$ = [] + this.$ = [] break; -case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 27: case 29: case 51: case 52: case 62: case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 106: case 107: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 129: case 130: case 131: case 132: case 134: case 135: case 137: case 140: case 159: case 165: case 166: case 167: case 190: case 240: case 254: case 305: case 336: - this.$ = $$[$0] -break; -case 17: - this.$ = { type: 'use', name: $$[$0].name } +case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 28: case 30: case 52: case 53: case 63: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 107: case 108: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 130: case 131: case 132: case 133: case 135: case 136: case 138: case 141: case 160: case 166: case 167: case 168: case 191: case 241: case 255: case 306: case 337: + this.$ = $$[$0] break; case 18: - this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } + this.$ = { type: 'use', name: $$[$0].name } break; case 19: - this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } + this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } break; case 20: - this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } break; case 21: - this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } break; case 22: - this.$ = { type: 'proof', statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } break; -case 23: case 37: case 39: case 164: - this.$ = $$[$0]; +case 23: + this.$ = { type: 'proof', statements: $$[$0-1].statements } break; -case 24: case 40: - this.$ = $$[$0-1]; +case 24: case 38: case 40: case 165: + this.$ = $$[$0]; break; -case 26: case 120: case 141: case 151: case 314: - this.$ = $$[$0-1] +case 25: case 41: + this.$ = $$[$0-1]; break; -case 28: - this.$ = $$[$0-1]; this.$.statements.push($$[$0]); +case 27: case 121: case 142: case 152: case 315: + this.$ = $$[$0-1] break; -case 30: - this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } +case 29: + this.$ = $$[$0-1]; this.$.statements.push($$[$0]); break; -case 31: case 32: - this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } +case 31: + this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } break; -case 33: case 96: case 211: - this.$ = { statements: [$$[$0]] } +case 32: case 33: + this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } break; -case 34: case 35: - this.$ = { statements: [$$[$0-1]] } +case 34: case 97: case 212: + this.$ = { statements: [$$[$0]] } break; -case 44: - this.$ = { boundary: 'first' } +case 35: case 36: + this.$ = { statements: [$$[$0-1]] } break; case 45: - this.$ = { boundary: 'last' } + this.$ = { boundary: 'first' } break; case 46: - this.$ = { boundary: 'frame' } + this.$ = { boundary: 'last' } break; case 47: - this.$ = { type: 'code', statements: $$[$0] }; + this.$ = { boundary: 'frame' } break; case 48: - this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } + this.$ = { type: 'code', statements: $$[$0] }; break; case 49: - this.$ = { ...$$[$0-1], type: "when", statements: $$[$0] } + this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } break; case 50: - this.$ = { type: 'metadata', data: $$[$0-1] } + this.$ = { ...$$[$0-1], type: "when", statements: $$[$0] } break; -case 53: - this.$ = { type: 'scope_definition', ...$$[$0-1] }; +case 51: + this.$ = { type: 'metadata', data: $$[$0-1] } break; case 54: - this.$ = {private: false, funcname: $$[$0]} + this.$ = { type: 'scope_definition', ...$$[$0-1] }; break; case 55: - this.$ = {private: true, funcname: $$[$0]} + this.$ = {private: false, funcname: $$[$0]} break; case 56: - this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } + this.$ = {private: true, funcname: $$[$0]} break; case 57: - this.$ = { ...$$[$0-8], type: 'function_definition', final: false, ...$$[$0-6], returns: $$[$0-3], ...$$[$0-1] } + this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } break; case 58: - this.$ = { ...$$[$0-6], type: 'function_definition', final: false, ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-8], type: 'function_definition', final: false, ...$$[$0-6], returns: $$[$0-3], ...$$[$0-1] } break; case 59: - this.$ = { ...$$[$0-6], type: 'function_definition', final: 'air', ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-6], type: 'function_definition', final: false, ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 60: - this.$ = { ...$$[$0-6], type: 'function_definition', final: 'proof', ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-6], type: 'function_definition', final: 'air', ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 61: - this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-6], type: 'function_definition', final: 'proof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 63: - this.$ = $$[$0-2]; this.$.vargs = true +case 62: + this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 64: - this.$ = { args: [], varargs: false } + this.$ = $$[$0-2]; this.$.vargs = true break; case 65: this.$ = { args: [], varargs: false } break; case 66: - this.$ = $$[$0-2]; this.$.args.push($$[$0]) + this.$ = { args: [], varargs: false } break; case 67: - this.$ = { args: [ $$[$0] ] } + this.$ = $$[$0-2]; this.$.args.push($$[$0]) break; case 68: - this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } + this.$ = { args: [ $$[$0] ] } break; case 69: - this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } + this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } break; case 70: - this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } + this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } break; case 71: - this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } + this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } break; case 72: - this.$ = { type: 'int' } + this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } break; case 73: - this.$ = { type: 'fe' } + this.$ = { type: 'int' } break; case 74: - this.$ = { type: 'expr' } + this.$ = { type: 'fe' } break; case 75: - this.$ = { type: 'int', const: true } + this.$ = { type: 'expr' } break; case 76: - this.$ = { type: 'fe', const: true } + this.$ = { type: 'int', const: true } break; case 77: - this.$ = { type: 'expr', const: true } + this.$ = { type: 'fe', const: true } break; case 78: - this.$ = { type: 'witness' } + this.$ = { type: 'expr', const: true } break; case 79: - this.$ = { type: 'fixed' } + this.$ = { type: 'witness' } break; case 80: - this.$ = { type: 'challenge' } + this.$ = { type: 'fixed' } break; case 81: - this.$ = { type: 'string' } + this.$ = { type: 'challenge' } break; case 82: - this.$ = { type: 'string', const: true } + this.$ = { type: 'string' } break; case 83: - this.$ = { type: 'proof' } + this.$ = { type: 'string', const: true } break; case 84: - this.$ = { type: 'subproof' } + this.$ = { type: 'proof' } break; case 85: - this.$ = { type: 'air' } + this.$ = { type: 'subproof' } break; case 86: - this.$ = { type: 'public' } + this.$ = { type: 'air' } break; case 87: - this.$ = { type: 'publicTable' } + this.$ = { type: 'public' } break; case 88: - this.$ = { type: 'function' } + this.$ = { type: 'publicTable' } break; case 89: - this.$ = {returns: [...$$[$0-2], $$[$0]]} + this.$ = { type: 'function' } break; case 90: - this.$.returns = [$$[$0]] + this.$ = {returns: [...$$[$0-2], $$[$0]]} break; case 91: - this.$ = {dim: $$[$0-2].dim + 1} + this.$.returns = [$$[$0]] break; case 92: - this.$ = {dim: 1} + this.$ = {dim: $$[$0-2].dim + 1} break; case 93: - this.$ = { type: $$[$0].type, dim: 0 } + this.$ = {dim: 1} break; case 94: - this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } + this.$ = { type: $$[$0].type, dim: 0 } break; -case 95: case 210: - this.$ = $$[$0-2]; this.$.statements.push($$[$0]); +case 95: + this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } break; -case 105: - this.$ = { type: 'code', statements: $$[$0] } +case 96: case 211: + this.$ = $$[$0-2]; this.$.statements.push($$[$0]); break; -case 108: - this.$ = { type: 'expr', expr: $$[$0] } +case 106: + this.$ = { type: 'code', statements: $$[$0] } break; case 109: - this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } + this.$ = { type: 'expr', expr: $$[$0] } break; case 110: - this.$ = {...$$[$0], type: 'delayed_function_call'} -break; -case 121: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = $$[$02] + this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } break; case 122: - this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] + this.$ = $$[$0-2]; this.$.data[$$[$0]] = $$[$02] break; case 123: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] break; case 124: - this.$ = {data: {}}; this.$.data[$$[$0-2]] = $$[$0] + this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) break; case 125: - this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = {data: {}}; this.$.data[$$[$0-2]] = $$[$0] break; -case 126: case 153: case 221: case 242: case 247: - this.$ = $$[$0-2]; this.$.values.push($$[$0]) +case 126: + this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) break; -case 127: - this.$ = { values: [ $$[$0] ]} +case 127: case 154: case 222: case 243: case 248: + this.$ = $$[$0-2]; this.$.values.push($$[$0]) break; case 128: - this.$ = { op: 'call', function: $$[$0-3], arguments: $$[$0-1].values } + this.$ = { values: [ $$[$0] ]} break; -case 133: - this.$ = { op: 'delayed_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], arguments: $$[$0-1].values } +case 129: + this.$ = { op: 'call', function: $$[$0-3], arguments: $$[$0-1].values } break; -case 136: - this.$ = {...$$[$0], ...$$[$01]} +case 134: + this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], arguments: $$[$0-1].values } break; -case 138: - this.$ = { type: 'continue' } +case 137: + this.$ = {...$$[$0], ...$$[$01]} break; case 139: - this.$ = { type: 'break' } + this.$ = { type: 'continue' } break; -case 142: - this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } +case 140: + this.$ = { type: 'break' } break; case 143: - this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } + this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } break; case 144: - this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } + this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } break; -case 145: case 146: - this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } +case 145: + this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } break; -case 147: - this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } +case 146: case 147: + this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } break; case 148: - this.$ = $$[$0-4] + this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } break; case 149: - this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } + this.$ = $$[$0-4] break; case 150: - this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} + this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } break; -case 152: - this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) +case 151: + this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} break; -case 154: - this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) +case 153: + this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) break; case 155: - this.$ = { values: [$$[$0]] } + this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) break; case 156: - this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } + this.$ = { values: [$$[$0]] } break; case 157: - this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) + this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } break; case 158: - this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} + this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) break; -case 160: - this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } +case 159: + this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} break; case 161: - this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } + this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } break; case 162: - this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } + this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } break; case 163: - this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } + this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } break; -case 168: - this.$ = {...$$[$0], const: false} +case 164: + this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } break; case 169: - this.$ = {...$$[$0], const: true } + this.$ = {...$$[$0], const: false} break; case 170: - this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } + this.$ = {...$$[$0], const: true } break; case 171: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } break; case 172: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } break; case 173: - this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } break; case 174: - this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } break; case 175: - this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } break; case 176: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } break; case 177: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } break; case 178: - this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } break; case 179: - this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } break; case 180: - this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } break; case 181: - this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } break; case 182: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } break; case 183: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } break; case 184: - this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } break; case 185: - this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } break; case 186: - this.$ = { dim: 1, lengths: [null]} + this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } break; case 187: - this.$ = { dim: 1, lengths: [$$[$0-1]]} + this.$ = { dim: 1, lengths: [null]} break; case 188: - this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) + this.$ = { dim: 1, lengths: [$$[$0-1]]} break; case 189: - this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) + this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) break; -case 191: case 338: - this.$ = { ...$$[$0-1], ...$$[$0] } +case 190: + this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) break; -case 192: - this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); +case 192: case 339: + this.$ = { ...$$[$0-1], ...$$[$0] } break; case 193: - this.$ = {items: [{...$$[$0], _d_:2}]} + this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); break; case 194: - this.$ = { type: 'return', value: null } + this.$ = {items: [{...$$[$0], _d_:2}]} break; case 195: - this.$ = { type: 'return', value: $$[$0] } + this.$ = { type: 'return', value: null } break; case 196: - this.$ = { type: 'return', values: $$[$0-1] } + this.$ = { type: 'return', value: $$[$0] } break; case 197: - this.$ = { type: 'assign' } + this.$ = { type: 'return', values: $$[$0-1] } break; case 198: - this.$ = { type: 'increment' } + this.$ = { type: 'assign' } break; case 199: - this.$ = { type: 'substract' } + this.$ = { type: 'increment' } break; case 200: - this.$ = { type: 'product' } + this.$ = { type: 'substract' } break; case 201: - this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) + this.$ = { type: 'product' } break; case 202: - this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) + this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) break; case 203: - this.$ = { names: [$$[$0]] } + this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) break; case 204: - this.$ = $$[$0-2] + this.$ = { names: [$$[$0]] } break; case 205: - this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) + this.$ = $$[$0-2] break; case 206: - this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } + this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) break; case 207: - this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } + this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } break; case 208: - this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } + this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } break; case 209: - this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } break; -case 212: - this.$ = { type: 'include', file: $$[$0] } +case 210: + this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } break; case 213: - this.$ = { stage: $$[$0-1] } + this.$ = { type: 'include', file: $$[$0] } break; case 214: - this.$ = { stage: DEFAULT_STAGE } + this.$ = { stage: $$[$0-1] } break; case 215: - this.$ = { type: 'string', value: $$[$0] } + this.$ = { stage: DEFAULT_STAGE } break; case 216: - this.$ = { type: 'string', template: true, value: $$[$0] } + this.$ = { type: 'string', value: $$[$0] } break; case 217: - this.$ = {type: 'sequence', values: $$[$0-1].values} + this.$ = { type: 'string', template: true, value: $$[$0] } break; case 218: - this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } + this.$ = {type: 'sequence', values: $$[$0-1].values} break; case 219: - this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} + this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } break; case 220: - this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} + this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} break; -case 222: - this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) +case 221: + this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} break; case 223: - this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) break; case 224: - this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; case 225: - this.$ = $$[$0-8]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), - t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, - tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) + this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; case 226: - this.$ = $$[$0-8]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), + this.$ = $$[$0-8]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, - tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) + tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; case 227: - this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) + this.$ = $$[$0-8]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), + t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, + tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; case 228: - this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) + this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; case 229: - this.$ = $$[$0-5]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), - t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, - tn: false}) + this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; case 230: - this.$ = $$[$0-5]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), + this.$ = $$[$0-5]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, - tn: false}) + tn: false}) break; case 231: - this.$ = { type: 'seq_list', values: [$$[$0]] } + this.$ = $$[$0-5]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), + t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, + tn: false}) break; case 232: - this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } + this.$ = { type: 'seq_list', values: [$$[$0]] } break; case 233: - this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} + this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } break; case 234: - this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} + this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} break; case 235: - this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} + this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} break; case 236: - this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0], times: $$[$0-2]} + this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} break; case 237: - this.$ = {type: 'range_seq', from: $$[$0-6], to: $$[$0-2], times: $$[$0-4], toTimes: $$[$0]} + this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0], times: $$[$0-2]} break; case 238: - this.$ = {type: 'padding_seq', value: $$[$0-1]} + this.$ = {type: 'range_seq', from: $$[$0-6], to: $$[$0-2], times: $$[$0-4], toTimes: $$[$0]} break; case 239: - this.$ = {type: 'seq_list', values: [$$[$0-1]]} + this.$ = {type: 'padding_seq', value: $$[$0-1]} break; -case 241: - this.$ = {values: []} +case 240: + this.$ = {type: 'seq_list', values: [$$[$0-1]]} break; -case 243: - this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) +case 242: + this.$ = {values: []} break; case 244: - this.$ = { type: 'expression_list', values: $$[$0-1].values } + this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) break; case 245: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = { type: 'expression_list', values: $$[$0-1].values } break; case 246: - this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) + this.$ = { type: 'expression_list', values: [$$[$0]] } break; -case 248: - this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } +case 247: + this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) break; case 249: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } break; case 250: - this.$ = { dim: 1, lengths: [null] } + this.$ = { type: 'expression_list', values: [$$[$0]] } break; case 251: - this.$ = { dim: 1, lengths: [$$[$0-1]] } + this.$ = { dim: 1, lengths: [null] } break; case 252: - this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } + this.$ = { dim: 1, lengths: [$$[$0-1]] } break; case 253: - this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } + this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } break; -case 255: - this.$ = {...$$[$0-1], ...$$[$0]} +case 254: + this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } break; -case 256: case 344: case 346: case 350: case 351: - this.$ = { name: $$[$0] } +case 256: + this.$ = {...$$[$0-1], ...$$[$0]} break; -case 257: - this.$ = { name: $$[$0], reference: true } +case 257: case 345: case 347: case 351: case 352: + this.$ = { name: $$[$0] } break; case 258: - this.$ = { name: $$[$0], template: true } + this.$ = { name: $$[$0], reference: true } break; case 259: - this.$ = { name: 'air.'+$$[$0] } + this.$ = { name: $$[$0], template: true } break; case 260: - this.$ = { name: 'air.'+$$[$0], template: true } + this.$ = { name: 'air.'+$$[$0] } break; case 261: - this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } + this.$ = { name: 'air.'+$$[$0], template: true } break; case 262: - this.$ = { items: [$$[$0]] } + this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } break; case 263: - this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; + this.$ = { items: [$$[$0]] } break; case 264: - this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } + this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; break; case 265: - this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; case 266: - this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 267: - this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } + this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 268: - this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } + this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; case 269: - this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } break; case 270: - this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } + this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 271: - this.$ = { type: 'public_declaration', items: $$[$0].items } + this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } break; case 272: - this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} + this.$ = { type: 'public_declaration', items: $$[$0].items } break; case 273: - this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} + this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} break; case 274: - this.$ = { type: 'proof_value_declaration', items: $$[$0].items } + this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} break; case 275: - this.$ = { type: 'subproof_value_declaration', aggregateType: $$[$0-2], items: $$[$0].items } + this.$ = { type: 'proof_value_declaration', items: $$[$0].items } break; case 276: - this.$ = { type: 'subproof_definition', aggregate: true, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_value_declaration', aggregateType: $$[$0-2], items: $$[$0].items } break; case 277: - this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_definition', aggregate: true, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; case 278: - this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; case 279: - this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } break; case 280: - this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } + this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } +break; +case 281: + this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } +break; +case 282: + this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) break; case 283: - this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) break; case 284: - this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) break; case 285: - this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) break; case 286: - this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) break; case 287: - this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) break; case 288: - this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) break; case 289: - this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})); break; case 290: - this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})); + this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; case 291: - this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) break; case 292: - this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) + this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) break; case 293: - this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) break; case 294: - this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) break; case 295: - this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) break; case 296: - this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) break; case 297: - this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; case 298: - this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-1].insert('not') break; case 299: - this.$ = $$[$0-1].insert('not') + this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) break; case 300: - this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) break; case 301: - this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) break; case 302: - this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) break; case 303: - this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) break; case 304: - this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) break; case 305: - this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) break; -case 306: - this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) +case 307: + this.$ = $$[$0].insert('neg') break; case 308: - this.$ = $$[$0].insert('neg') + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) break; case 309: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) break; case 310: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) break; case 311: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) break; case 312: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) break; case 313: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($$[$0])}) break; case 314: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($$[$0])}) -break; -case 315: - this.$ = ExpressionFactory.fromObject({...$$[$0], op: 'string'}) -break; -case 317: case 319: - this.$ = ExpressionFactory.fromObject({...$$[$0]}) + this.$ = ExpressionFactory.fromObject({...$$[$0], op: 'string'}) break; -case 318: - this.$ = ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) +case 316: case 318: + this.$ = ExpressionFactory.fromObject({...$$[$0]}) break; -case 318: - this.$ = { op: 'cast', cast: 'int', value: $$[$0-1]} +case 317: + this.$ = ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) break; case 319: - this.$ = { op: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'int', value: $$[$0-1]} break; case 320: - this.$ = { op: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'fe', value: $$[$0-1] } break; case 321: - this.$ = { op: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'expr', value: $$[$0-1] } break; case 322: - this.$ = { op: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'col', value: $$[$0-1] } break; case 323: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'int', value: $$[$0-1] } + this.$ = { op: 'cast', cast: 'string', value: $$[$0-1] } break; case 324: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'int', value: $$[$0-1] } break; case 325: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'fe', value: $$[$0-1] } break; case 326: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'expr', value: $$[$0-1] } break; case 327: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'col', value: $$[$0-1] } break; case 328: - this.$ = { ...$$[$0-1], next:1 } + this.$ = { ...$$[$0-3], op: 'cast', cast: 'string', value: $$[$0-1] } break; case 329: - this.$ = { ...$$[$0-2], next:$$[$0] } + this.$ = { ...$$[$0-1], next:1 } break; case 330: - this.$ = { ...$$[$0-4], next:$$[$0-1] } + this.$ = { ...$$[$0-2], next:$$[$0] } break; -case 333: - this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) } +case 331: + this.$ = { ...$$[$0-4], next:$$[$0-1] } break; case 332: - this.$ = { ...$$[$0], prior:1 } + this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) } break; case 333: - this.$ = { ...$$[$0], prior:$$[$0-2] } + this.$ = { ...$$[$0], prior:1 } break; case 334: - this.$ = { ...$$[$0], prior:$$[$0-3] } + this.$ = { ...$$[$0], prior:$$[$0-2] } break; -case 337: - this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], op: 'positional_param'}) } +case 335: + this.$ = { ...$$[$0], prior:$$[$0-3] } break; -case 337: - this.$ = { ...$$[$0], dim: 0 } +case 336: + this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], op: 'positional_param'}) } break; -case 339: - this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } +case 338: + this.$ = { ...$$[$0], dim: 0 } break; case 340: - this.$ = { dim: 1, indexes: [$$[$0-1]]} + this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } break; case 341: - this.$ = { name: 'air.' + $$[$0].name } + this.$ = { dim: 1, indexes: [$$[$0-1]]} break; case 342: - this.$ = { name: 'subproof.' + $$[$0].name } + this.$ = { name: 'air.' + $$[$0].name } break; case 343: - this.$ = { name: 'proof.' + $$[$0].name } + this.$ = { name: 'subproof.' + $$[$0].name } +break; +case 344: + this.$ = { name: 'proof.' + $$[$0].name } break; -case 345: case 347: - this.$ = { name: $$[$0-2] + '.' + $$[$0].name } +case 346: case 348: + this.$ = { name: $$[$0-2] + '.' + $$[$0].name } break; -case 348: case 349: - this.$ = { name: $$[$0-2].name + '.' + $$[$0] } +case 349: case 350: + this.$ = { name: $$[$0-2].name + '.' + $$[$0] } break; } }, -table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,31:[1,19],51:20,52:$V1,53:$V2,60:$V3,61:[1,18],73:$V4,76:$V5,78:$V6,79:$V7,81:$V8,82:$V9,137:$Va,154:$Vb},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),{26:[1,33],153:[1,32]},{28:[1,34]},{46:[1,35]},{31:[1,37],51:36,52:$V1,53:$V2,61:[1,38]},{138:39,142:$Vc,143:$Vd},o($Ve,$Vf,{139:42,74:$Vg,75:$Vh,140:$Vi}),o($Ve,$Vf,{139:46,140:$Vi}),{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:47,152:48},{153:[1,54]},{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:56,152:55},{153:[1,57]},{26:[1,58]},{26:[1,59]},{52:[1,60]},{26:[1,61]},{28:[1,63],46:[1,62]},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:64,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{48:$V_,52:$V$,54:136,62:137,64:$V01,65:139,66:140,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{46:[1,154]},{51:155,52:$V1,53:$V2},{51:156,52:$V1,53:$V2},o($Vd1,[2,212]),o($Ve1,[2,215]),o($Ve1,[2,216]),{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:158,152:157},o($Ve,$Vf,{139:159,140:$Vi}),o($Ve,$Vf,{139:160,140:$Vi}),{46:[1,161]},{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:56,152:162},o([6,8,30,31,52,53,60,61,63,73,76,78,79,81,82,108,137,154],$Vf1,{148:164,56:$Vg1,127:[1,163]}),o($Vd1,[2,271],{63:$Vh1}),o($Vi1,[2,256]),o($Vi1,[2,257]),o($Vi1,[2,258]),{151:[1,167]},o($Vj1,[2,262]),{46:[1,168]},o($Vd1,[2,274],{63:$Vh1}),o($Vj1,$Vf1,{148:164,56:$Vg1}),{46:[1,169]},{56:$Vg1,127:[1,170],148:171},{46:$Vk1},{26:[1,172]},{46:[1,173]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:174,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:183,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{30:[1,184]},{30:[2,37]},{11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:[2,27],31:$Vt,34:186,36:185,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,30:[2,29],35:187},o($Vr1,[2,33],{35:188,8:$Vn}),o($Vr1,[2,36],{8:$Vs1}),o($Vt1,[2,105]),o($Vt1,[2,106]),o($Vt1,[2,107]),o($Vt1,[2,108],{86:[1,190],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vt1,[2,110]),o($Vt1,[2,111]),o($Vt1,[2,112]),o($Vt1,[2,113]),o($Vt1,[2,114]),o($Vt1,[2,115]),o($Vt1,[2,116]),o($Vt1,[2,117]),o($Vt1,[2,118]),o($VR1,[2,47]),{40:215,41:[1,216],42:[1,217],43:[1,218],46:[1,214]},{28:[1,219]},o($VR1,[2,51]),o($VR1,[2,52]),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:220,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VR1,[2,43]),o($Vt1,[2,134]),o($Vt1,[2,135]),o($Vt1,[2,136]),o($Vt1,[2,137]),o($Vt1,[2,138]),o($Vt1,[2,139]),o($Ve,$Vf,{139:42,68:222,46:$VS1,56:$VT1,74:$Vg,75:$Vh,140:$Vi}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:224,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:225,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:226,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o([8,30,86,107,108,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VU1,{130:229,121:$VV1,123:$VW1,127:$VX1,131:$VY1,132:$VZ1,133:$V_1}),{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,122:234,141:$V02,178:$V12,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,122:239,141:$V02,178:$V12,180:$VZ},o($Ve1,[2,312],{180:$V22}),o($Ve1,[2,313]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:241,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Ve1,[2,315]),o($Ve1,[2,316],{180:$V32}),o($Ve1,[2,317]),{60:[1,244],93:243},{22:245,26:$Vq,31:$Vt,56:$V42,61:$Vz,67:$VA,95:$VH,126:246},{22:248,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH},{46:[1,249]},{46:[1,250]},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:251,34:253,35:254,36:252,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{31:$V52,61:$V62,94:255,95:$V72},{46:[1,259]},{46:[1,260]},o($V82,[2,168]),{24:$V92,52:$Va2,69:$Vb2,70:$Vc2,71:$Vd2,77:$Ve2,124:261},{127:[1,268]},o($Vt1,[2,194],{138:104,90:106,179:108,91:122,22:130,122:177,47:269,26:$Vq,31:$Vt,46:$Vv,56:[1,270],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),o($Vf2,$Vg2,{46:$Vh2,180:$Vi2}),{22:130,26:$Vq,31:$Vt,61:$Vz,67:$VA,91:273,95:$VH},{22:279,26:$Vq,31:$Vt,46:$Vj2,56:[1,278],61:$Vz,67:$VA,68:275,95:$VH,125:276,126:277},{22:279,26:$Vq,31:$Vt,46:$Vk2,56:[1,284],61:$Vz,67:$VA,68:281,95:$VH,125:282,126:283},{22:279,26:$Vq,31:$Vt,46:$Vl2,56:[1,289],61:$Vz,67:$VA,68:286,95:$VH,125:287,126:288},{22:279,26:$Vq,31:$Vt,46:$Vm2,56:[1,294],61:$Vz,67:$VA,68:291,95:$VH,125:292,126:293},{22:279,26:[1,295],31:$Vt,61:$Vz,67:$VA,95:$VH,125:296,126:297},{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,122:299,134:298,141:$V02,178:$V12,180:$VZ},o($Vn2,[2,337],{181:300,56:[1,301]}),{151:[1,302]},{151:[1,303]},{151:[1,304]},o($Vo2,$Vp2,{151:$Vq2}),o($Vo2,[2,346],{151:[1,306]}),{48:[1,307]},{48:[2,62],63:[1,308]},{48:[2,64]},o($Vr2,[2,67]),{26:[1,309],67:[1,310]},o($Vs2,[2,72]),o($Vs2,[2,73]),o($Vs2,[2,74]),{69:[1,311],70:[1,312],71:[1,313],77:[1,314]},{74:[1,315],75:[1,316]},o($Vs2,[2,80]),o($Vs2,[2,81]),o($Vs2,[2,83]),o($Vs2,[2,84]),o($Vs2,[2,85]),o($Vs2,[2,86]),o($Vs2,[2,87]),o($Vs2,[2,88]),{48:$V_,52:$V$,54:317,62:137,64:$V01,65:139,66:140,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{46:[1,318]},{46:[1,319]},o($Vt2,[2,263],{63:$Vh1}),o($Vj1,$Vf1,{148:164,56:$Vg1,127:[1,320]}),{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:56,152:321},{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:323,152:322},{141:[1,324]},o($Vd1,[2,269],{63:$Vh1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:325,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vj1,[2,255],{56:$Vu2}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:328,58:[1,327],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:329,150:56},{26:[1,330],143:[1,331]},{26:[1,332]},{26:[1,333]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:334,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{56:$Vu2,127:[1,335]},{46:[2,55]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:336,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{48:[1,337],63:$Vv2},{22:130,26:$Vq,31:$Vt,46:$Vv,47:339,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vw2,[2,249],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Ve1,$VU1,{121:$VV1,123:$VW1}),{46:$Vj2,56:$VT1,68:275},{46:$Vk2,56:$VT1,68:281},{46:$Vl2,56:$VT1,68:286},{46:$VS1,56:$VT1,68:222},{46:$Vm2,56:$VT1,68:291},{30:[1,340]},o($V0,[2,22]),{8:$Vn,30:[2,28],35:341},o($Vr1,[2,30],{35:342,8:$Vn}),o($Vr1,[2,35],{8:$Vs1}),o($Vr1,[2,34],{8:$Vs1}),o($VR1,[2,42]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:343,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:344,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:345,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:346,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:347,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:348,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:349,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:350,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{52:$V$,59:351,66:352,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:353,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:354,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:355,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:356,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:357,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:358,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:359,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:360,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:361,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:362,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:363,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:364,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:365,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:366,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:367,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:368,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:369,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vx2,[2,44]),o($Vx2,[2,45]),o($Vx2,[2,46]),{26:$Vy2,50:371},{30:[1,373]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:374,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{46:[1,375],56:$Vz2},{58:$VA2},o($Ve1,[2,297]),o($Ve1,[2,305]),o($Ve1,[2,306]),o($Ve1,[2,310]),o($Ve1,[2,311]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:378,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VB2,[2,197],{136:379,56:$VC2}),o($VB2,[2,198]),o($VB2,[2,199]),o($VB2,[2,200]),o($Ve1,[2,308]),o($Vf2,$Vg2,{180:$Vi2}),{180:$V22},{22:130,26:$Vq,31:$Vt,46:$Vv,47:381,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{180:$V32},o($Ve1,[2,309]),{22:130,26:$Vq,31:$Vt,61:$Vz,67:$VA,91:382,95:$VH},{48:[1,383],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,61:$Vz,67:$VA,91:384,95:$VH},{31:$V52,61:$V62,94:385,95:$V72},o([31,61,95],[2,129]),o($Vt1,[2,18],{128:388,25:[1,386],28:[1,387],56:$VD2,127:$VE2}),{127:[1,390]},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,125:391,126:392},o($Vt1,[2,17]),{13:397,22:130,24:$V92,26:$Vq,31:$Vt,46:$V$1,52:$Va2,61:$Vz,67:$VA,69:$Vb2,70:$Vc2,71:$Vd2,72:$VE,73:$V4,77:$Ve2,84:394,91:235,95:$VH,97:395,105:393,122:396,124:118,141:$V02,178:$V12,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:398,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{108:[1,399]},{8:$Vn,35:401,108:[1,400]},o([21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,23],{35:402,8:$Vn}),o($VR1,[2,25]),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:403,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vx2,[2,130]),o($Vx2,[2,131]),o($Vx2,[2,132]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:404,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:405,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($V82,[2,169]),{22:279,26:$Vq,31:$Vt,56:[1,406],61:$Vz,67:$VA,95:$VH,125:276,126:277},{22:279,26:$Vq,31:$Vt,56:[1,407],61:$Vz,67:$VA,95:$VH,125:282,126:283},{22:279,26:$Vq,31:$Vt,56:[1,408],61:$Vz,67:$VA,95:$VH,125:287,126:288},{22:279,26:$Vq,31:$Vt,56:[1,409],61:$Vz,67:$VA,95:$VH,125:292,126:293},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,125:296,126:297},{22:279,26:$Vq,31:$Vt,56:$V42,61:$Vz,67:$VA,95:$VH,126:246},{22:130,26:$Vq,31:$Vt,56:[1,411],61:$Vz,67:$VA,90:410,91:412,95:$VH},o($Vt1,[2,195],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:413,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vf2,[2,328],{46:[1,415],141:[1,414],178:[1,416]}),o($Vr2,$VF2,{138:104,90:106,179:108,91:122,22:130,122:177,92:417,47:419,26:$Vq,31:$Vt,46:$Vv,56:$VG2,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),o($Vf2,[2,332]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:420,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{46:[1,421],56:$Vz2},o($V82,[2,170],{63:$VH2}),o($VI2,$VJ2,{127:[1,423]}),{22:279,26:$Vq,31:$Vt,58:$VA2,61:$Vz,67:$VA,95:$VH,125:424,126:392},o($VK2,$VE2,{128:388,56:$VD2}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:425,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{46:[1,426],56:$Vz2},o($V82,[2,171],{63:$VH2}),o($VI2,$VJ2,{127:[1,427]}),{22:279,26:$Vq,31:$Vt,58:$VA2,61:$Vz,67:$VA,95:$VH,125:428,126:392},{22:130,26:$Vq,31:$Vt,46:$Vv,47:429,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{46:[1,430],56:$Vz2},o($V82,[2,172],{63:$VH2}),o($VI2,$VJ2,{127:[1,431]}),{22:279,26:$Vq,31:$Vt,58:$VA2,61:$Vz,67:$VA,95:$VH,125:432,126:392},{22:130,26:$Vq,31:$Vt,46:$Vv,47:433,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{46:[1,434],56:$Vz2},o($V82,[2,173],{63:$VH2}),o($VI2,$VJ2,{127:[1,435]}),{22:279,26:$Vq,31:$Vt,58:$VA2,61:$Vz,67:$VA,95:$VH,125:436,126:392},o([8,30,56,63,108,127],$Vp2,{46:$Vk1,151:$Vq2}),o($V82,[2,174],{63:$VH2}),o($VI2,$VJ2,{127:[1,437]}),{58:[1,438],63:[1,439]},o($VL2,[2,203]),o($Vn2,[2,338],{56:[1,440]}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:441,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{26:$VM2,143:$VN2,182:442},{26:$VM2,143:$VN2,182:445},{26:$VM2,143:$VN2,182:446},{26:$VM2,143:$VN2,182:447},{26:$VM2,143:$VN2,182:448},{28:[1,450],55:[1,449]},{52:$V$,64:[1,451],65:452,66:140,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},o($Vr2,[2,68],{68:453,56:$VT1}),o($Vr2,[2,69],{68:454,56:$VT1}),o($Vs2,[2,75]),o($Vs2,[2,76]),o($Vs2,[2,77]),o($Vs2,[2,82]),o($Vs2,[2,78]),o($Vs2,[2,79]),{48:[1,455]},{48:$V_,52:$V$,54:456,62:137,64:$V01,65:139,66:140,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{48:$V_,52:$V$,54:457,62:137,64:$V01,65:139,66:140,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:458,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vt2,[2,265],{63:$Vh1}),o($Vt2,[2,266],{63:$Vh1}),o($Vj1,$Vf1,{148:164,56:$Vg1,127:[1,459]}),{48:[1,460]},o($Vd1,[2,270],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:462,58:[1,461],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vi1,[2,250]),{58:[1,463],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vj1,[2,261]),o($Vi1,[2,259]),o($Vi1,[2,260]),{63:[1,464]},{48:[1,465]},o($Vd1,[2,279],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{56:$VC2,136:466},{48:[1,467],63:$Vv2},{28:[1,468]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:470,61:$Vz,64:[1,469],67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vw2,[2,248],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($V0,[2,278]),o($Vr1,[2,32],{8:$Vs1}),o($Vr1,[2,31],{8:$Vs1}),o($Vt1,[2,109],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VO2,[2,281],{168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VO2,[2,282],{168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VO2,[2,283],{168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VO2,[2,284],{168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VO2,[2,285],{168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VO2,[2,286],{168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o([6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,107,108,118,137,146,147,154,161,162,163,164,165,166,167],[2,287],{155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Ve1,[2,288]),o($VP2,[2,93],{68:471,56:$VT1}),o($VQ2,[2,289],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{55:[1,472],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($VQ2,[2,291],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VQ2,[2,292],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VQ2,[2,293],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VR2,[2,294],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VQ2,[2,295],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VR2,[2,296],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,164:$VE1,165:$VF1,166:$VG1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VS2,[2,298],{173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VS2,[2,299],{173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VT2,[2,300],{177:$VQ1}),o($VT2,[2,301],{177:$VQ1}),o($VT2,[2,302],{177:$VQ1}),o($VT2,[2,303],{177:$VQ1}),o($Ve1,[2,304]),{48:[1,473],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($VR1,[2,49]),{8:$Vn,35:401},{30:[1,474],63:$VU2},o($VV2,[2,125],{55:[1,476]}),o($VR1,[2,53]),{48:[1,477],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:478,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,479]},o($VW2,[2,92]),o([8,30,48,63,108],[2,208],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o([8,30,48,63,107,108],[2,209]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:482,56:$VX2,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,144:480,145:481,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{48:[1,484],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vf2,[2,333]),o($Ve1,[2,314],{180:$VY2}),o($Vf2,[2,335]),{22:130,26:$Vq,31:$Vt,61:$Vz,67:$VA,91:486,95:$VH},{26:[1,487]},{13:491,14:492,15:493,16:494,17:495,18:496,19:497,24:$V92,29:488,30:$VZ2,39:489,52:$Va2,69:$Vb2,70:$Vc2,71:$Vd2,72:$VE,73:$V4,76:$V5,77:$Ve2,78:$V6,79:$V7,81:$V8,82:$V9,83:490,84:498,124:118,154:$Vb},o($VK2,[2,191],{56:[1,499]}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:501,58:[1,500],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:502,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,503],63:$VH2},o($VL2,$VJ2),{8:[1,504],107:[1,505]},o($V_2,[2,164]),o($V_2,[2,165]),o($V_2,[2,166],{130:229,127:$VX1,131:$VY1,132:$VZ1,133:$V_1}),o($V_2,[2,167]),{48:[1,506],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{46:[1,507]},{46:[1,508]},o($VR1,[2,26]),o($VR1,[2,24]),o($VR1,[2,147]),{48:[1,509],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{48:[1,510],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,125:424,126:392},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,125:428,126:392},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,125:432,126:392},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,125:436,126:392},o($Vt1,[2,206]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:511,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{46:$Vh2},{58:[1,512],63:$Vv2},o($Vf2,[2,329]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:513,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vf2,[2,331]),{48:[1,514],63:$V$2},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:516,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vr2,[2,245],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{48:[1,517],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:518,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:279,26:$Vq,31:$Vt,61:$Vz,67:$VA,95:$VH,126:519},{22:130,26:$Vq,31:$Vt,46:$Vv,47:520,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,521],63:$VH2},{48:[1,522],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:523,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:524,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,525],63:$VH2},{48:[1,526],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:527,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:528,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,529],63:$VH2},{48:[1,530],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:531,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:532,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,533],63:$VH2},{22:130,26:$Vq,31:$Vt,46:$Vv,47:534,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{127:[2,204]},o($VL2,[2,202],{22:130,91:235,122:536,26:$Vq,31:$Vt,46:$V$1,61:$Vz,64:[1,535],67:$VA,95:$VH,141:$V02,178:$V12,180:$VZ}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:537,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,538],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vo2,[2,341],{151:$V03}),o($V13,[2,350]),o($V13,[2,351]),o($Vo2,[2,342],{151:$V03}),o($Vo2,[2,343],{151:$V03}),o($Vo2,[2,345],{151:$V03}),o($Vo2,[2,347],{151:$V03}),{52:$V$,56:[1,540],59:541,66:352,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:542,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{48:[2,63]},o($Vr2,[2,66]),o($Vr2,[2,70],{56:$Vz2}),o($Vr2,[2,71],{56:$Vz2}),{28:[1,543]},{48:[1,544]},{48:[1,545]},o($Vd1,[2,264],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:546,56:$VC2,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,136:547,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Ve,[2,213]),o($Vi1,[2,252]),{58:[1,548],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vi1,[2,251]),{26:[1,549]},{26:$Vj,67:$Vk,95:$Vl,143:$Vm,149:53,150:56,152:550},o($Vd1,[2,280]),{28:[1,551]},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:552,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:553,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vw2,[2,247],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VP2,[2,94],{56:$Vz2}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:554,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:555,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VR1,[2,50]),{26:[1,556]},{22:130,26:$Vq,28:$V23,31:$Vt,46:$Vv,47:558,56:$V33,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,88:557,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Ve1,[2,321]),{48:[1,561],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($VW2,[2,91]),{58:[1,562],63:$V43},o($VL2,[2,231],{55:$V53,64:$V63}),o($V73,$V83,{55:[1,566],107:$Vu1,118:$V93,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:482,56:$VX2,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,144:568,145:481,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{180:$VY2},{22:130,26:$Vq,31:$Vt,61:$Vz,67:$VA,91:569,95:$VH},{46:[1,570]},o($Vt1,[2,19],{28:[1,571]}),{30:[1,572]},{8:$Vn,30:[2,39],35:573},o($Va3,[2,96]),o($Va3,[2,97]),o($Va3,[2,98]),o($Va3,[2,99]),o($Va3,[2,100]),o($Va3,[2,101]),o($Va3,[2,102]),o($Va3,[2,103]),o($Va3,[2,104]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:575,58:[1,574],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vb3,[2,186]),{58:[1,576],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vt1,[2,180],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{127:[1,577]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:578,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:580,56:[1,581],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,102:579,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:582,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:583,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:584,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{28:[1,586],112:585},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:587,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,588],63:$Vv2},o($Vt1,[2,196]),{48:[1,589],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Ve1,[2,128]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:590,56:[1,591],61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,592],63:$Vv2},o($Ve1,[2,318]),{48:[1,593],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o([8,30,58,63,107,108],[2,192]),o($Vt1,[2,175],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{127:[1,594]},o($Ve1,[2,319]),{48:[1,595],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vt1,[2,176],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{127:[1,596]},o($Ve1,[2,320]),{48:[1,597],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vt1,[2,177],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{127:[1,598]},o($Ve1,[2,322]),{48:[1,599],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vt1,[2,178],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{127:[1,600]},o($Vt1,[2,179],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{58:[1,601]},o($VL2,[2,201]),{58:[1,602],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vc3,[2,340]),{26:[1,603],143:[1,604]},{52:$V$,57:605,59:606,66:352,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{28:[1,607]},{30:[1,608]},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:609,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{28:[1,610]},{28:[1,611]},o($Vd1,[2,267],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vt2,[2,268]),o($Vi1,[2,253]),{48:[1,613],63:[1,612]},o($Vd1,[2,275],{63:$Vh1}),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:614,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{30:[1,615]},o($Vw2,[2,246],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o([6,8,30,31,48,52,53,55,58,60,61,63,64,73,76,78,79,81,82,86,108,118,137,146,147,154],[2,290],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VR1,[2,48]),o($VV2,[2,123],{55:[1,616]}),o($VV2,[2,124]),o($Vd3,[2,119],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{26:$Vy2,50:617},{22:130,26:$Vq,28:$V23,31:$Vt,46:$Vv,47:558,56:$V33,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,88:619,89:618,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Ve1,[2,326]),o($Ve3,[2,217],{55:[1,621],64:[1,620]}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:623,56:$VX2,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,145:622,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:624,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vf3,[2,238]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:625,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:626,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,627],63:$V43},o($Vf2,[2,334]),o($Vr2,$VF2,{138:104,90:106,179:108,91:122,22:130,122:177,47:419,92:628,26:$Vq,31:$Vt,46:$Vv,56:$VG2,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),{13:491,14:492,15:493,16:494,17:495,18:496,19:497,24:$V92,29:629,30:$VZ2,39:489,52:$Va2,69:$Vb2,70:$Vc2,71:$Vd2,72:$VE,73:$V4,76:$V5,77:$Ve2,78:$V6,79:$V7,81:$V8,82:$V9,83:490,84:498,124:118,154:$Vb},o($VR1,[2,20]),{8:$Vs1,13:491,14:492,15:493,16:494,17:495,18:496,19:497,24:$V92,30:[2,40],52:$Va2,69:$Vb2,70:$Vc2,71:$Vd2,72:$VE,73:$V4,76:$V5,77:$Ve2,78:$V6,79:$V7,81:$V8,82:$V9,83:630,84:498,124:118,154:$Vb},o($Vb3,[2,188]),{58:[1,631],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vb3,[2,187]),{56:[1,632]},{8:[1,633],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{48:[1,634]},{48:[2,140],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:635,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VR1,[2,144]),{48:[1,636],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{48:[1,637],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($VR1,[2,148]),{115:638,119:[1,639]},o([8,21,24,26,28,30,31,45,46,49,52,53,56,60,61,67,69,70,71,72,73,76,77,78,79,81,82,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,149],{114:[1,640]}),o($Vt1,[2,207]),o($Vf2,[2,330]),o($Vr2,[2,242],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:641,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vr2,[2,244]),o($Ve1,[2,323]),{56:[1,642]},o($Ve1,[2,324]),{56:[1,643]},o($Ve1,[2,325]),{56:[1,644]},o($Ve1,[2,327]),{56:[1,645]},{127:[2,205]},o($Vc3,[2,339]),o($V13,[2,348]),o($V13,[2,349]),{58:[1,646],63:[1,647]},o($VL2,[2,90]),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:648,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vg3,[2,58]),{30:[1,649]},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:650,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:651,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:652,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{26:[1,653]},{30:[1,654]},o($V0,[2,277]),{22:130,26:$Vq,28:$V23,31:$Vt,46:$Vv,47:558,56:$V33,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,88:655,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{30:[1,656],63:$VU2},{58:[1,657],63:[1,658]},o($VL2,[2,127]),o($Ve3,[2,218]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:659,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VL2,[2,221],{55:$V53,64:$V63}),o($V73,$V83,{55:[1,660],107:$Vu1,118:$V93,146:[1,661],147:[1,662],155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vf3,[2,233],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VL2,[2,232],{107:$Vu1,118:$Vh3,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($V73,[2,234],{55:[1,664],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vf3,[2,239]),{48:[1,665],63:$V$2},{30:[1,666]},o($Va3,[2,95]),o($Vb3,[2,189]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:667,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,97:670,106:668,120:669,121:$Vi3,122:673,123:$Vj3,141:$V02,178:$V12,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:674,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,675],63:$Vv2},o($VR1,[2,145]),o($VR1,[2,146]),{30:[1,676],116:[1,677],119:[1,678]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:680,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,117:679,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:681,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,682],63:$Vv2},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:683,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:684,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:685,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:176,61:$Vz,64:$Vl1,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,103:686,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{28:[1,687]},{52:$V$,59:688,66:352,69:$V11,70:$V21,71:$V31,72:$V41,73:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,82:$Vc1},{30:[1,689]},o($Vg3,[2,59]),{30:[1,690]},{30:[1,691]},{48:[1,692],63:$Vv2},{56:[1,693]},o($V0,[2,276]),o($VV2,[2,122]),o($Vd3,[2,120]),o($Vd3,[2,121]),{22:130,26:$Vq,28:$V23,31:$Vt,46:$Vv,47:558,56:$V33,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,88:694,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Ve3,[2,219],{64:[1,695],155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:696,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VL2,[2,227],{138:104,90:106,179:108,91:122,22:130,122:177,47:697,26:$Vq,31:$Vt,46:$Vv,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),o($VL2,[2,228],{138:104,90:106,179:108,91:122,22:130,122:177,47:698,26:$Vq,31:$Vt,46:$Vv,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:699,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:700,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vt1,[2,133]),o($VR1,[2,21]),{58:[1,701],63:$Vv2},{48:[1,702],63:[1,703]},o($Vr2,[2,211]),o($Vr2,[2,159]),{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,122:704,141:$V02,178:$V12,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,122:705,141:$V02,178:$V12,180:$VZ},{121:[1,706],123:[1,707],127:$VX1,130:229,131:$VY1,132:$VZ1,133:$V_1},o($VR1,[2,143]),{48:[2,141]},o($VR1,[2,151]),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,34:68,35:69,36:67,37:708,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:680,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,117:709,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{55:[1,710],63:$Vk3},o($Vl3,[2,155],{107:$Vu1,118:[1,712],155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VR1,[2,150]),o($Vr2,[2,243]),{58:[1,713],63:$Vv2},{58:[1,714],63:$Vv2},{58:[1,715],63:$Vv2},{58:[1,716],63:$Vv2},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,30:$Vs,31:$Vt,32:717,34:68,35:69,36:67,37:65,38:66,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VL2,[2,89]),o($Vg3,[2,57]),o($Vg3,[2,60]),o($Vg3,[2,61]),{26:[1,718]},{22:130,26:$Vq,31:$Vt,46:$Vv,47:719,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VL2,[2,126]),o($Ve3,[2,220]),o($VL2,[2,222],{107:$Vu1,118:$Vh3,146:[1,720],147:[1,721],155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VL2,[2,223],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VL2,[2,224],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($V73,[2,236],{55:[1,722],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vf3,[2,235],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($V82,[2,185]),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,33:723,34:253,35:254,36:370,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$V$1,61:$Vz,67:$VA,91:235,95:$VH,97:670,120:724,121:$Vi3,122:673,123:$Vj3,141:$V02,178:$V12,180:$VZ},o($Vr2,[2,160]),o($Vr2,[2,161]),o($Vr2,[2,162]),o($Vr2,[2,163]),{30:[1,725]},{55:[1,726],63:$Vk3},{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,34:68,35:69,36:728,38:727,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:729,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:730,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($V82,[2,181]),o($V82,[2,182]),o($V82,[2,183]),o($V82,[2,184]),{30:[1,731]},{56:[1,732]},{58:[1,733],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($VL2,[2,229],{138:104,90:106,179:108,91:122,22:130,122:177,47:734,26:$Vq,31:$Vt,46:$Vv,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),o($VL2,[2,230],{138:104,90:106,179:108,91:122,22:130,122:177,47:735,26:$Vq,31:$Vt,46:$Vv,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,95:$VH,121:$VR,123:$VS,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:736,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($VR1,[2,142]),o($Vr2,[2,210]),o($VR1,[2,152]),{8:$Vn,11:86,12:75,13:71,14:72,15:76,16:77,17:78,18:79,19:80,20:82,21:$Vo,22:130,23:81,24:$Vp,26:$Vq,27:87,28:$Vr,31:$Vt,34:68,35:69,36:728,38:737,44:83,45:$Vu,46:$Vv,47:73,49:$Vw,51:20,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,84:90,85:70,87:74,90:106,91:122,95:$VH,96:$VI,97:91,98:92,99:93,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,122:100,123:$VS,124:118,129:$VT,135:120,137:$Va,138:104,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vm3,[2,158],{51:20,85:70,13:71,14:72,47:73,87:74,12:75,15:76,16:77,17:78,18:79,19:80,23:81,20:82,44:83,11:86,27:87,84:90,97:91,98:92,99:93,122:100,138:104,90:106,179:108,124:118,135:120,91:122,22:130,34:186,36:738,21:$Vo,24:$Vp,26:$Vq,28:$Vr,31:$Vt,45:$Vu,46:$Vv,49:$Vw,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,95:$VH,96:$VI,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,123:$VS,129:$VT,137:$Va,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),{8:$Vn,35:187},o($Vl3,[2,153],{107:$Vu1,118:[1,739],155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vl3,[2,156],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vg3,[2,56]),{22:130,26:$Vq,31:$Vt,46:$Vv,47:740,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{56:[1,741]},{55:[1,742],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{55:[1,743],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vf3,[2,237],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($Vm3,[2,157],{51:20,85:70,13:71,14:72,47:73,87:74,12:75,15:76,16:77,17:78,18:79,19:80,23:81,20:82,44:83,11:86,27:87,84:90,97:91,98:92,99:93,122:100,138:104,90:106,179:108,124:118,135:120,91:122,22:130,34:186,36:738,21:$Vo,24:$Vp,26:$Vq,28:$Vr,31:$Vt,45:$Vu,46:$Vv,49:$Vw,52:$Vx,53:$V2,56:$Vy,60:$V3,61:$Vz,67:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,76:$V5,77:$VG,78:$V6,79:$V7,81:$V8,82:$V9,95:$VH,96:$VI,100:$VJ,101:$VK,104:$VL,108:$VM,109:$VN,110:$VO,111:$VP,113:$VQ,121:$VR,123:$VS,129:$VT,137:$Va,141:$VU,142:$Vc,143:$Vd,154:$Vb,170:$VV,171:$VW,172:$VX,178:$VY,180:$VZ}),{8:$Vn,35:341},{22:130,26:$Vq,31:$Vt,46:$Vv,47:744,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{58:[1,745],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},{22:130,26:$Vq,31:$Vt,46:$Vv,47:746,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:747,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},{22:130,26:$Vq,31:$Vt,46:$Vv,47:748,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vl3,[2,154],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{56:[1,749]},{58:[1,750],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($VL2,[2,225],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),o($VL2,[2,226],{107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1}),{22:130,26:$Vq,31:$Vt,46:$Vv,47:751,61:$Vz,67:$VA,69:$Vm1,70:$Vn1,71:$Vo1,73:$Vp1,77:$Vq1,90:106,91:122,95:$VH,121:$VR,122:177,123:$VS,138:104,141:$VU,142:$Vc,143:$Vd,170:$VV,171:$VW,172:$VX,178:$VY,179:108,180:$VZ},o($Vd1,[2,273]),{58:[1,752],107:$Vu1,155:$Vv1,156:$Vw1,157:$Vx1,158:$Vy1,159:$Vz1,160:$VA1,161:$VB1,162:$VC1,163:$VD1,164:$VE1,165:$VF1,166:$VG1,167:$VH1,168:$VI1,169:$VJ1,171:$VK1,172:$VL1,173:$VM1,174:$VN1,175:$VO1,176:$VP1,177:$VQ1},o($Vd1,[2,272])], -defaultActions: {4:[2,1],59:[2,54],65:[2,37],138:[2,64],172:[2,55],438:[2,204],451:[2,63],601:[2,205],675:[2,141]}, +table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:18,25:$V1,32:[1,20],52:21,53:$V2,54:$V3,61:$V4,62:[1,19],70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,124:31,137:$Vg,154:$Vh},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),{27:[1,41],153:[1,40]},{29:[1,42]},{47:[1,43]},{32:[1,45],52:44,53:$Vi,54:$V3,62:[1,46]},{138:48,142:$Vj,143:$Vk},o($Vl,$Vm,{139:51,75:$Vn,76:$Vo,140:$Vp}),o($Vl,$Vm,{139:55,140:$Vp}),{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:56,152:57},{153:[1,63]},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:64},{153:[1,66]},{27:[1,67]},o($Vu,[2,169]),{25:$V1,53:$Vv,70:$V5,71:$V6,72:$V7,78:$Vb,124:68},{23:73,27:[1,70],32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:71,126:72},{53:[1,78]},{23:73,27:$VA,32:$Vw,57:[1,81],62:$Vx,68:$Vy,95:$Vz,125:79,126:80},{23:73,27:$VA,32:$Vw,57:[1,85],62:$Vx,68:$Vy,95:$Vz,125:83,126:84},{23:73,27:$VA,32:$Vw,57:[1,88],62:$Vx,68:$Vy,95:$Vz,125:86,126:87},{23:73,27:$VA,32:$Vw,57:[1,91],62:$Vx,68:$Vy,95:$Vz,125:89,126:90},{23:73,27:$VA,32:$Vw,57:$VB,62:$Vx,68:$Vy,95:$Vz,126:92},{27:[1,94]},{29:[1,96],47:[1,95]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:97,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:$V61,53:$V71,55:161,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{47:[1,179]},{52:180,53:$Vi,54:$V3},{52:181,53:$Vi,54:$V3},{27:[1,182]},o($Vl1,[2,213]),o($Vm1,[2,216]),o($Vm1,[2,217]),{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:184,152:183},o($Vl,$Vm,{139:185,140:$Vp}),o($Vl,$Vm,{139:186,140:$Vp}),{47:[1,187]},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:188},o([6,8,25,31,32,53,54,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,137,154],$Vn1,{148:190,57:$Vo1,127:[1,189]}),o($Vl1,[2,272],{64:$Vp1}),o($Vq1,[2,257]),o($Vq1,[2,258]),o($Vq1,[2,259]),{151:[1,193]},o($Vr1,[2,263]),{47:[1,194]},o($Vl1,[2,275],{64:$Vp1}),o($Vr1,$Vn1,{148:190,57:$Vo1}),{47:[1,195]},{57:$Vo1,127:[1,196],148:197},o($Vu,[2,170]),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:71,126:72},o([6,8,25,31,32,53,54,57,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,127,137,154],$Vs1,{47:$Vt1,151:$Vu1}),o($Vu,[2,175],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,200]}),o($Vx1,$Vy1,{128:201,57:$Vz1}),{151:[1,203]},{151:[1,204]},{151:[1,205]},o($VA1,[2,347],{151:[1,206]}),{27:[1,207]},o($Vu,[2,171],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,208]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:209,126:210},o($VA1,$Vs1,{151:$Vu1}),o($Vu,[2,172],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,211]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:212,126:210},o($Vu,[2,173],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,213]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:214,126:210},o($Vu,[2,174],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,215]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:216,126:210},{127:[1,217]},{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:218,126:210},{47:[1,219]},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:220,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:229,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,230]},{31:[2,38]},{11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:[2,28],32:$Vw,35:232,37:231,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,31:[2,30],36:233},o($VH1,[2,34],{36:234,8:$VC}),o($VH1,[2,37],{8:$VI1}),o($VJ1,[2,106]),o($VJ1,[2,107]),o($VJ1,[2,108]),o($VJ1,[2,109],{86:[1,236],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VJ1,[2,111]),o($VJ1,[2,112]),o($VJ1,[2,113]),o($VJ1,[2,114]),o($VJ1,[2,115]),o($VJ1,[2,116]),o($VJ1,[2,117]),o($VJ1,[2,118]),o($VJ1,[2,119]),o($V52,[2,48]),{41:261,42:[1,262],43:[1,263],44:[1,264],47:[1,260]},{29:[1,265]},o($V52,[2,52]),o($V52,[2,53]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:266,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,44]),o($VJ1,[2,135]),o($VJ1,[2,136]),o($VJ1,[2,137]),o($VJ1,[2,138]),o($VJ1,[2,139]),o($VJ1,[2,140]),o($Vl,$Vm,{139:51,69:268,47:$V62,57:$V72,75:$Vn,76:$Vo,140:$Vp}),{23:160,27:$VA,32:$Vw,47:$VI,48:270,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:271,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:272,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o([8,31,86,107,108,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$V82,{130:275,121:$V92,123:$Va2,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:280,141:$Vg2,178:$Vh2,180:$V51},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:285,141:$Vg2,178:$Vh2,180:$V51},o($Vm1,[2,313],{180:$Vi2}),o($Vm1,[2,314]),{23:160,27:$VA,32:$Vw,47:$VI,48:287,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vm1,[2,316]),o($Vm1,[2,317],{180:$Vj2}),o($Vm1,[2,318]),{61:[1,290],93:289},{23:291,27:$VA,32:$Vw,57:$VB,62:$Vx,68:$Vy,95:$Vz,126:92},{23:292,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz},{47:[1,293]},{47:[1,294]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:295,35:297,36:298,37:296,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{32:$Vk2,62:$Vl2,94:299,95:$Vm2},{47:[1,303]},{47:[1,304]},{127:[1,305]},o($VJ1,[2,195],{138:137,90:139,179:141,91:153,23:160,122:223,48:306,27:$VA,32:$Vw,47:$VI,57:[1,307],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,$Vo2,{47:$Vp2,180:$Vq2}),{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:310,95:$Vz},{23:73,27:$VA,32:$Vw,47:$Vr2,57:[1,313],62:$Vx,68:$Vy,69:312,95:$Vz,125:79,126:80},{23:73,27:$VA,32:$Vw,47:$Vs2,57:[1,316],62:$Vx,68:$Vy,69:315,95:$Vz,125:83,126:84},{23:73,27:$VA,32:$Vw,47:$Vt2,57:[1,319],62:$Vx,68:$Vy,69:318,95:$Vz,125:86,126:87},{23:73,27:$VA,32:$Vw,47:$Vu2,57:[1,322],62:$Vx,68:$Vy,69:321,95:$Vz,125:89,126:90},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:324,134:323,141:$Vg2,178:$Vh2,180:$V51},o($Vv2,[2,338],{181:325,57:[1,326]}),{49:[1,327]},{49:[2,63],64:[1,328]},{49:[2,65]},o($Vw2,[2,68]),{27:[1,329],68:[1,330]},o($Vx2,[2,73]),o($Vx2,[2,74]),o($Vx2,[2,75]),{70:[1,331],71:[1,332],72:[1,333],78:[1,334]},{75:[1,335],76:[1,336]},o($Vx2,[2,81]),o($Vx2,[2,82]),o($Vx2,[2,84]),o($Vx2,[2,85]),o($Vx2,[2,86]),o($Vx2,[2,87]),o($Vx2,[2,88]),o($Vx2,[2,89]),{49:$V61,53:$V71,55:337,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{47:[1,338]},{47:[1,339]},{47:$Vt1},o($Vu,[2,264],{64:$Vp1}),o($Vr1,$Vn1,{148:190,57:$Vo1,127:[1,340]}),{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:341},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:343,152:342},{141:[1,344]},o($Vl1,[2,270],{64:$Vp1}),{23:160,27:$VA,32:$Vw,47:$VI,48:345,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vr1,[2,256],{57:$Vy2}),{23:160,27:$VA,32:$Vw,47:$VI,48:348,59:[1,347],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:349,150:65},{27:[1,350],143:[1,351]},{27:[1,352]},{27:[1,353]},{23:160,27:$VA,32:$Vw,47:$VI,48:354,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{57:$Vy2,127:[1,355]},{27:$Vz2,143:$VA2,182:356},{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,126:359},{23:160,27:$VA,32:$Vw,47:$VI,48:360,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vx1,[2,192],{57:[1,361]}),{23:160,27:$VA,32:$Vw,47:$VI,48:363,59:[1,362],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{27:$Vz2,143:$VA2,182:364},{27:$Vz2,143:$VA2,182:365},{27:$Vz2,143:$VA2,182:366},{27:$Vz2,143:$VA2,182:367},{47:[2,56]},{23:160,27:$VA,32:$Vw,47:$VI,48:368,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,369],64:$Vv1},o($VB2,$Vw1),{23:160,27:$VA,32:$Vw,47:$VI,48:370,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,371],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:372,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,373],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:374,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,375],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:376,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,377],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:378,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,379],64:$VC2},{23:160,27:$VA,32:$Vw,47:$VI,48:381,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VD2,[2,250],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,$V82,{121:$V92,123:$Va2}),{47:$Vr2,57:$V72,69:312},{47:$Vs2,57:$V72,69:315},{47:$Vt2,57:$V72,69:318},{47:$V62,57:$V72,69:268},{47:$Vu2,57:$V72,69:321},{31:[1,382]},o($V0,[2,23]),{8:$VC,31:[2,29],36:383},o($VH1,[2,31],{36:384,8:$VC}),o($VH1,[2,36],{8:$VI1}),o($VH1,[2,35],{8:$VI1}),o($V52,[2,43]),{23:160,27:$VA,32:$Vw,47:$VI,48:385,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:386,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:387,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:388,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:389,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:390,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:391,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:392,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{53:$V71,60:393,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{23:160,27:$VA,32:$Vw,47:$VI,48:395,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:396,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:397,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:398,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:399,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:400,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:401,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:402,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:403,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:404,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:405,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:406,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:407,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:408,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:409,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:410,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:411,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VE2,[2,45]),o($VE2,[2,46]),o($VE2,[2,47]),{27:$VF2,51:413},{31:[1,415]},{23:160,27:$VA,32:$Vw,47:$VI,48:416,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,417],57:$VG2},{59:$VH2},o($Vm1,[2,298]),o($Vm1,[2,306]),o($Vm1,[2,307]),o($Vm1,[2,311]),o($Vm1,[2,312]),{23:160,27:$VA,32:$Vw,47:$VI,48:420,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VI2,[2,198],{136:421,57:$VJ2}),o($VI2,[2,199]),o($VI2,[2,200]),o($VI2,[2,201]),o($Vm1,[2,309]),o($Vn2,$Vo2,{180:$Vq2}),{180:$Vi2},{23:160,27:$VA,32:$Vw,47:$VI,48:423,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{180:$Vj2},o($Vm1,[2,310]),{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:424,95:$Vz},{49:[1,425],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:426,95:$Vz},{32:$Vk2,62:$Vl2,94:427,95:$Vm2},o([32,62,95],[2,130]),o($VJ1,[2,19],{128:201,26:[1,428],29:[1,429],57:$Vz1,127:$Vy1}),o($VJ1,[2,18]),{13:434,20:431,23:160,25:$V1,27:$VA,32:$Vw,47:$Vf2,53:$Vv,62:$Vx,68:$Vy,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,78:$Vb,91:281,95:$Vz,97:432,105:430,122:433,124:31,141:$Vg2,178:$Vh2,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:435,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{108:[1,436]},{8:$VC,36:438,108:[1,437]},o([22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,24],{36:439,8:$VC}),o($V52,[2,26]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:440,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VE2,[2,131]),o($VE2,[2,132]),o($VE2,[2,133]),{23:160,27:$VA,32:$Vw,47:$VI,48:441,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:442,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,57:[1,444],62:$Vx,68:$Vy,90:443,91:445,95:$Vz},o($VJ1,[2,196],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:446,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vn2,[2,329],{47:[1,448],141:[1,447],178:[1,449]}),o($Vw2,$VK2,{138:137,90:139,179:141,91:153,23:160,122:223,92:450,48:452,27:$VA,32:$Vw,47:$VI,57:$VL2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,[2,333]),{23:160,27:$VA,32:$Vw,47:$VI,48:453,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,454],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:209,126:210},{23:160,27:$VA,32:$Vw,47:$VI,48:455,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,456],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:212,126:210},{23:160,27:$VA,32:$Vw,47:$VI,48:457,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,458],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:214,126:210},{23:160,27:$VA,32:$Vw,47:$VI,48:459,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,460],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:216,126:210},{59:[1,461],64:[1,462]},o($VB2,[2,204]),o($Vv2,[2,339],{57:[1,463]}),{23:160,27:$VA,32:$Vw,47:$VI,48:464,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{29:[1,466],56:[1,465]},{53:$V71,65:[1,467],66:468,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},o($Vw2,[2,69],{69:469,57:$V72}),o($Vw2,[2,70],{69:470,57:$V72}),o($Vx2,[2,76]),o($Vx2,[2,77]),o($Vx2,[2,78]),o($Vx2,[2,83]),o($Vx2,[2,79]),o($Vx2,[2,80]),{49:[1,471]},{49:$V61,53:$V71,55:472,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{49:$V61,53:$V71,55:473,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{23:160,27:$VA,32:$Vw,47:$VI,48:474,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vu,[2,266],{64:$Vp1}),o($Vu,[2,267],{64:$Vp1}),o($Vr1,$Vn1,{148:190,57:$Vo1,127:[1,475]}),{49:[1,476]},o($Vl1,[2,271],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:478,59:[1,477],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vq1,[2,251]),{59:[1,479],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vr1,[2,262]),o($Vq1,[2,260]),o($Vq1,[2,261]),{64:[1,480]},{49:[1,481]},o($Vl1,[2,280],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{57:$VJ2,136:482},o($VA1,[2,346],{151:$VM2}),o($VN2,[2,351]),o($VN2,[2,352]),o([6,8,25,31,32,53,54,59,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],[2,193]),o($Vl1,[2,180],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:485,59:[1,484],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VO2,[2,187]),{59:[1,486],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VA1,[2,342],{151:$VM2}),o($VA1,[2,343],{151:$VM2}),o($VA1,[2,344],{151:$VM2}),o($VA1,[2,348],{151:$VM2}),o($Vl1,[2,176],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,487]},o($Vl1,[2,177],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,488]},o($Vl1,[2,178],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,489]},o($Vl1,[2,179],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,490]},o($Vl1,[2,181],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,491]},{49:[1,492],64:$VC2},{29:[1,493]},{23:160,27:$VA,32:$Vw,47:$VI,48:495,62:$Vx,65:[1,494],68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VD2,[2,249],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V0,[2,279]),o($VH1,[2,33],{8:$VI1}),o($VH1,[2,32],{8:$VI1}),o($VJ1,[2,110],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,282],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,283],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,284],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,285],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,286],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,287],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,161,162,163,164,165,166,167],[2,288],{155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,[2,289]),o($VQ2,[2,94],{69:496,57:$V72}),o($VR2,[2,290],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{56:[1,497],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VR2,[2,292],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,293],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,294],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VS2,[2,295],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,296],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VS2,[2,297],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,299],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,300],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VU2,[2,301],{177:$V42}),o($VU2,[2,302],{177:$V42}),o($VU2,[2,303],{177:$V42}),o($VU2,[2,304],{177:$V42}),o($Vm1,[2,305]),{49:[1,498],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,50]),{8:$VC,36:438},{31:[1,499],64:$VV2},o($VW2,[2,126],{56:[1,501]}),o($V52,[2,54]),{49:[1,502],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:503,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,504]},o($VX2,[2,93]),o([8,31,49,64,108],[2,209],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([8,31,49,64,107,108],[2,210]),{23:160,27:$VA,32:$Vw,47:$VI,48:507,57:$VY2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,144:505,145:506,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,509],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vn2,[2,334]),o($Vm1,[2,315],{180:$VZ2}),o($Vn2,[2,336]),{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:511,95:$Vz},{27:[1,512]},{13:516,14:517,15:518,16:519,17:520,18:521,19:522,20:523,25:$V1,30:513,31:$V_2,40:514,53:$Vv,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:515,124:31,154:$Vh},{8:[1,524],107:[1,525]},o($V$2,[2,165]),o($V$2,[2,166]),o($V$2,[2,167],{130:275,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),o($V$2,[2,168]),{49:[1,526],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{47:[1,527]},{47:[1,528]},o($V52,[2,27]),o($V52,[2,25]),o($V52,[2,148]),{49:[1,529],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{49:[1,530],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VJ1,[2,207]),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:531,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:$Vp2},{59:[1,532],64:$VC2},o($Vn2,[2,330]),{23:160,27:$VA,32:$Vw,47:$VI,48:533,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vn2,[2,332]),{49:[1,534],64:$V03},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:536,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vw2,[2,246],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{49:[1,537],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:538,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,539],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:540,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,541],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:542,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,543],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:544,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{127:[2,205]},o($VB2,[2,203],{23:160,91:281,122:546,27:$VA,32:$Vw,47:$Vf2,62:$Vx,65:[1,545],68:$Vy,95:$Vz,141:$Vg2,178:$Vh2,180:$V51}),{23:160,27:$VA,32:$Vw,47:$VI,48:547,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,548],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{53:$V71,57:[1,549],60:550,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:551,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[2,64]},o($Vw2,[2,67]),o($Vw2,[2,71],{57:$VG2}),o($Vw2,[2,72],{57:$VG2}),{29:[1,552]},{49:[1,553]},{49:[1,554]},o($Vl1,[2,265],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:555,57:$VJ2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,136:556,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vl,[2,214]),o($Vq1,[2,253]),{59:[1,557],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vq1,[2,252]),{27:[1,558]},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:559},o($Vl1,[2,281]),{27:[1,560],143:[1,561]},o($VO2,[2,189]),{59:[1,562],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VO2,[2,188]),{57:[1,563]},{57:[1,564]},{57:[1,565]},{57:[1,566]},{57:[1,567]},{29:[1,568]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:569,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:570,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VD2,[2,248],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VQ2,[2,95],{57:$VG2}),{23:160,27:$VA,32:$Vw,47:$VI,48:571,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:572,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,51]),{27:[1,573]},{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:574,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vm1,[2,322]),{49:[1,578],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VX2,[2,92]),{59:[1,579],64:$V33},o($VB2,[2,232],{56:$V43,65:$V53}),o($V63,$V73,{56:[1,583],107:$VK1,118:$V83,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:507,57:$VY2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,144:585,145:506,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{180:$VZ2},{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:586,95:$Vz},{47:[1,587]},o($VJ1,[2,20],{29:[1,588]}),{31:[1,589]},{8:$VC,31:[2,40],36:590},o($V93,[2,97]),o($V93,[2,98]),o($V93,[2,99]),o($V93,[2,100]),o($V93,[2,101]),o($V93,[2,102]),o($V93,[2,103]),o($V93,[2,104]),o($V93,[2,105]),{23:160,27:$VA,32:$Vw,47:$VI,48:591,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:593,57:[1,594],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,102:592,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:595,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:596,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:597,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{29:[1,599],112:598},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:600,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,601],64:$VC2},o($VJ1,[2,197]),{49:[1,602],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,129]),{23:160,27:$VA,32:$Vw,47:$VI,48:603,57:[1,604],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,605],64:$VC2},o($Vm1,[2,319]),{49:[1,606],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,320]),{49:[1,607],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,321]),{49:[1,608],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,323]),{49:[1,609],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{59:[1,610]},o($VB2,[2,202]),{59:[1,611],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Va3,[2,341]),{53:$V71,58:612,60:613,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{29:[1,614]},{31:[1,615]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:616,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{29:[1,617]},{29:[1,618]},o($Vl1,[2,268],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vu,[2,269]),o($Vq1,[2,254]),{49:[1,620],64:[1,619]},o($Vl1,[2,276],{64:$Vp1}),o($VN2,[2,349]),o($VN2,[2,350]),o($VO2,[2,190]),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:621,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:622,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:623,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:624,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:625,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:626,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,627]},o($VD2,[2,247],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,154],[2,291],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,49]),o($VW2,[2,124],{56:[1,628]}),o($VW2,[2,125]),o($Vb3,[2,120],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{27:$VF2,51:629},{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:631,89:630,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vm1,[2,327]),o($Vc3,[2,218],{56:[1,633],65:[1,632]}),{23:160,27:$VA,32:$Vw,47:$VI,48:635,57:$VY2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,145:634,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:636,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vd3,[2,239]),{23:160,27:$VA,32:$Vw,47:$VI,48:637,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:638,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,639],64:$V33},o($Vn2,[2,335]),o($Vw2,$VK2,{138:137,90:139,179:141,91:153,23:160,122:223,48:452,92:640,27:$VA,32:$Vw,47:$VI,57:$VL2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{13:516,14:517,15:518,16:519,17:520,18:521,19:522,20:523,25:$V1,30:641,31:$V_2,40:514,53:$Vv,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:515,124:31,154:$Vh},o($V52,[2,21]),{8:$VI1,13:516,14:517,15:518,16:519,17:520,18:521,19:522,20:523,25:$V1,31:[2,41],53:$Vv,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:642,124:31,154:$Vh},{8:[1,643],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{49:[1,644]},{49:[2,141],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:645,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,145]),{49:[1,646],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{49:[1,647],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,149]),{115:648,119:[1,649]},o([8,22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,150],{114:[1,650]}),o($VJ1,[2,208]),o($Vn2,[2,331]),o($Vw2,[2,243],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:651,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vw2,[2,245]),o($Vm1,[2,324]),o($Vm1,[2,325]),o($Vm1,[2,326]),o($Vm1,[2,328]),{127:[2,206]},o($Va3,[2,340]),{59:[1,652],64:[1,653]},o($VB2,[2,91]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:654,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Ve3,[2,59]),{31:[1,655]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:656,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:657,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:658,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{27:[1,659]},{59:[1,660],64:$VC2},{59:[1,661],64:$VC2},{59:[1,662],64:$VC2},{59:[1,663],64:$VC2},{59:[1,664],64:$VC2},{31:[1,665]},o($V0,[2,278]),{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:666,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,667],64:$VV2},{59:[1,668],64:[1,669]},o($VB2,[2,128]),o($Vc3,[2,219]),{23:160,27:$VA,32:$Vw,47:$VI,48:670,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,222],{56:$V43,65:$V53}),o($V63,$V73,{56:[1,671],107:$VK1,118:$V83,146:[1,672],147:[1,673],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vd3,[2,234],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,233],{107:$VK1,118:$Vf3,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V63,[2,235],{56:[1,675],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vd3,[2,240]),{49:[1,676],64:$V03},{31:[1,677]},o($V93,[2,96]),{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,97:680,106:678,120:679,121:$Vg3,122:683,123:$Vh3,141:$Vg2,178:$Vh2,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:684,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,685],64:$VC2},o($V52,[2,146]),o($V52,[2,147]),{31:[1,686],116:[1,687],119:[1,688]},{23:160,27:$VA,32:$Vw,47:$VI,48:690,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,117:689,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:691,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,692],64:$VC2},{29:[1,693]},{53:$V71,60:694,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{31:[1,695]},o($Ve3,[2,60]),{31:[1,696]},{31:[1,697]},{49:[1,698],64:$VC2},{57:[1,699]},o($Vu,[2,182]),o($Vu,[2,183]),o($Vu,[2,184]),o($Vu,[2,185]),o($Vu,[2,186]),o($V0,[2,277]),o($VW2,[2,123]),o($Vb3,[2,121]),o($Vb3,[2,122]),{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:700,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vc3,[2,220],{65:[1,701],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:702,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,228],{138:137,90:139,179:141,91:153,23:160,122:223,48:703,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,229],{138:137,90:139,179:141,91:153,23:160,122:223,48:704,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{23:160,27:$VA,32:$Vw,47:$VI,48:705,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:706,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VJ1,[2,134]),o($V52,[2,22]),{49:[1,707],64:[1,708]},o($Vw2,[2,212]),o($Vw2,[2,160]),{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:709,141:$Vg2,178:$Vh2,180:$V51},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:710,141:$Vg2,178:$Vh2,180:$V51},{121:[1,711],123:[1,712],127:$Vb2,130:275,131:$Vc2,132:$Vd2,133:$Ve2},o($V52,[2,144]),{49:[2,142]},o($V52,[2,152]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,35:101,36:102,37:100,38:713,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:690,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,117:714,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{56:[1,715],64:$Vi3},o($Vj3,[2,156],{107:$VK1,118:[1,717],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,151]),o($Vw2,[2,244]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:718,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,90]),o($Ve3,[2,58]),o($Ve3,[2,61]),o($Ve3,[2,62]),{27:[1,719]},{23:160,27:$VA,32:$Vw,47:$VI,48:720,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,127]),o($Vc3,[2,221]),o($VB2,[2,223],{107:$VK1,118:$Vf3,146:[1,721],147:[1,722],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,224],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,225],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V63,[2,237],{56:[1,723],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vd3,[2,236],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:724,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,97:680,120:725,121:$Vg3,122:683,123:$Vh3,141:$Vg2,178:$Vh2,180:$V51},o($Vw2,[2,161]),o($Vw2,[2,162]),o($Vw2,[2,163]),o($Vw2,[2,164]),{31:[1,726]},{56:[1,727],64:$Vi3},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,35:101,36:102,37:729,39:728,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:730,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:731,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,732]},{57:[1,733]},{59:[1,734],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,230],{138:137,90:139,179:141,91:153,23:160,122:223,48:735,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,231],{138:137,90:139,179:141,91:153,23:160,122:223,48:736,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{23:160,27:$VA,32:$Vw,47:$VI,48:737,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,143]),o($Vw2,[2,211]),o($V52,[2,153]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,35:101,36:102,37:729,39:738,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vk3,[2,159],{52:21,124:31,85:103,13:104,14:105,48:106,87:107,12:108,15:109,16:110,17:111,18:112,19:113,24:114,21:115,45:116,11:119,28:120,20:123,97:124,98:125,99:126,122:133,138:137,90:139,179:141,135:151,91:153,23:160,35:232,37:739,22:$VD,25:$VE,27:$VA,29:$VF,32:$Vw,46:$VH,47:$VI,50:$VJ,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vz,96:$VQ,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,123:$V_,129:$V$,137:$Vg,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VC,36:233},o($Vj3,[2,154],{107:$VK1,118:[1,740],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vj3,[2,157],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,57]),{23:160,27:$VA,32:$Vw,47:$VI,48:741,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{57:[1,742]},{56:[1,743],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{56:[1,744],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vd3,[2,238],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vk3,[2,158],{52:21,124:31,85:103,13:104,14:105,48:106,87:107,12:108,15:109,16:110,17:111,18:112,19:113,24:114,21:115,45:116,11:119,28:120,20:123,97:124,98:125,99:126,122:133,138:137,90:139,179:141,135:151,91:153,23:160,35:232,37:739,22:$VD,25:$VE,27:$VA,29:$VF,32:$Vw,46:$VH,47:$VI,50:$VJ,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vz,96:$VQ,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,123:$V_,129:$V$,137:$Vg,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VC,36:383},{23:160,27:$VA,32:$Vw,47:$VI,48:745,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,746],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:747,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:748,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:749,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vj3,[2,155],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{57:[1,750]},{59:[1,751],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,226],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,227],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:752,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vl1,[2,274]),{59:[1,753],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vl1,[2,273])], +defaultActions: {4:[2,1],98:[2,38],163:[2,65],182:[2,55],207:[2,56],461:[2,205],467:[2,64],610:[2,206],685:[2,142]}, parseError: function parseError (str, hash) { if (hash.recoverable) { this.trace(str); @@ -1398,211 +1395,211 @@ options: {}, performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { var YYSTATE=YY_START; switch($avoiding_name_collisions) { -case 0: /* skip whitespace */ +case 0: /* skip whitespace */ break; -case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ +case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ break; -case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ +case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ break; -case 3: return 73; +case 3: return 74; break; -case 4: return 74; +case 4: return 75; break; -case 5: return 75; +case 5: return 76; break; -case 6: return 24; +case 6: return 25; break; -case 7: return 'DECLARE'; +case 7: return 'DECLARE'; break; -case 8: return 21; +case 8: return 22; break; -case 9: return 25; +case 9: return 26; break; -case 10: return 137; +case 10: return 137; break; -case 11: return 107; +case 11: return 107; break; -case 12: return 161; +case 12: return 161; break; -case 13: return 82; +case 13: return 83; break; -case 14: return 81; +case 14: return 82; break; -case 15: return 154 +case 15: return 154 break; -case 16: return 72 +case 16: return 73 break; -case 17: return 78 +case 17: return 79 break; -case 18: return 79 +case 18: return 80 break; -case 19: return 61 +case 19: return 62 break; -case 20: return 95 +case 20: return 95 break; -case 21: return 31 +case 21: return 32 break; -case 22: return 69 +case 22: return 70 break; -case 23: return 70 +case 23: return 71 break; -case 24: return 71 +case 24: return 72 break; -case 25: return 77 +case 25: return 78 break; -case 26: return 76 +case 26: return 77 break; -case 27: return 104 +case 27: return 104 break; -case 28: return 108 +case 28: return 108 break; -case 29: return 109 +case 29: return 109 break; -case 30: return 101 +case 30: return 101 break; -case 31: return 100 +case 31: return 100 break; -case 32: return 113 +case 32: return 113 break; -case 33: return 'ELSEIF' +case 33: return 'ELSEIF' break; -case 34: return 114 +case 34: return 114 break; -case 35: return 111 +case 35: return 111 break; -case 36: return 119 +case 36: return 119 break; -case 37: return 116 +case 37: return 116 break; -case 38: return 45 +case 38: return 46 break; -case 39: return 153 +case 39: return 153 break; -case 40: return 140 +case 40: return 140 break; -case 41: return 110 +case 41: return 110 break; -case 42: return 96 +case 42: return 96 break; -case 43: return 53 +case 43: return 54 break; -case 44: return 60 +case 44: return 61 break; -case 45: return 52 +case 45: return 53 break; -case 46: return 129 +case 46: return 129 break; -case 47: return 41 +case 47: return 42 break; -case 48: return 42 +case 48: return 43 break; -case 49: return 43 +case 49: return 44 break; -case 50: return 146 +case 50: return 146 break; -case 51: return 147 +case 51: return 147 break; -case 52: return 64 +case 52: return 65 break; -case 53: return 118 +case 53: return 118 break; -case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; +case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; break; -case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; +case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; break; -case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; +case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; break; -case 57: return 26; +case 57: return 27; break; -case 58: yy_.yytext = yy_.yytext.slice(1); return 67; +case 58: yy_.yytext = yy_.yytext.slice(1); return 68; break; -case 59: yy_.yytext = yy_.yytext.slice(1); return 49; +case 59: yy_.yytext = yy_.yytext.slice(1); return 50; break; -case 60: yy_.yytext = yy_.yytext.slice(1); return 178; +case 60: yy_.yytext = yy_.yytext.slice(1); return 178; break; -case 61: return 177; +case 61: return 177; break; -case 62: return 121; +case 62: return 121; break; -case 63: return 123; +case 63: return 123; break; -case 64: return 131; +case 64: return 131; break; -case 65: return 132; +case 65: return 132; break; -case 66: return 133; +case 66: return 133; break; -case 67: return 171; +case 67: return 171; break; -case 68: return 172; +case 68: return 172; break; -case 69: return 173; +case 69: return 173; break; -case 70: return "'"; +case 70: return "'"; break; -case 71: return "?"; +case 71: return "?"; break; -case 72: return "%"; +case 72: return "%"; break; -case 73: return "\\\\"; +case 73: return "\\\\"; break; -case 74: return "/"; +case 74: return "/"; break; -case 75: return 8; +case 75: return 8; break; -case 76: return 63; +case 76: return 64; break; -case 77: return 151; +case 77: return 151; break; -case 78: return 162; +case 78: return 162; break; -case 79: return 167; +case 79: return 167; break; -case 80: return 164; +case 80: return 164; break; -case 81: return 165; +case 81: return 165; break; -case 82: return 166; +case 82: return 166; break; -case 83: return 168; +case 83: return 168; break; -case 84: return 169; +case 84: return 169; break; -case 85: return 159; +case 85: return 159; break; -case 86: return 160; +case 86: return 160; break; -case 87: return 157; +case 87: return 157; break; -case 88: return 158; +case 88: return 158; break; -case 89: return 86; +case 89: return 86; break; -case 90: return 156; +case 90: return 156; break; -case 91: return 155; +case 91: return 155; break; -case 92: return 127; +case 92: return 127; break; -case 93: return 46; +case 93: return 47; break; -case 94: return 48; +case 94: return 49; break; -case 95: return 56; +case 95: return 57; break; -case 96: return 58; +case 96: return 59; break; -case 97: return 28; +case 97: return 29; break; -case 98: return 30; +case 98: return 31; break; -case 99: return '::'; +case 99: return '::'; break; -case 100: return 55; +case 100: return 56; break; -case 101: return 170; +case 101: return 170; break; -case 102: return 6; +case 102: return 6; break; case 103: console.log("INVALID: " + yy_.yytext); return 'INVALID' break; diff --git a/src/assign.js b/src/assign.js index 104cceb..5638a74 100644 --- a/src/assign.js +++ b/src/assign.js @@ -1,15 +1,9 @@ -const References = require("./references.js"); -const Expressions = require("./expressions.js"); const Expression = require("./expression.js"); +const Context = require('./context.js'); const {assert, assertLog} = require('./assert.js'); module.exports = class Assign { - constructor (Fr, parent, context, references, expressions) { - this.Fr = Fr; - this.context = context; - this.references = references; - this.expressions = expressions; - this.parent = parent; + constructor () { } assign (name, indexes, value) { @@ -22,7 +16,7 @@ module.exports = class Assign { return this.__assign(name, indexes, value); } __assign(name, indexes, value) { - const [type, reference, array] = this.references.getTypeR(name, indexes); + const [type, reference, array] = Context.references.getTypeR(name, indexes); console.log([type, reference, array]); const dim = (array && array.dim) ? array.dim : 0; if (dim > 0) { @@ -40,7 +34,7 @@ module.exports = class Assign { assignArray(name, indexes, value, array) { const ref = value.getAloneOperand(); let valueIndexes = value.__indexes ?? []; - const def = this.references.getDefinition(ref.name); + const def = Context.references.getDefinition(ref.name); if (array.dim != def.array.dim) { throw new Error(`different array dimension on asignation ${array.dim} vs ${def.array.dim}`); @@ -64,26 +58,25 @@ module.exports = class Assign { } } assignReference (name, value) { - this.references.setReference(name, value); + Context.references.setReference(name, value); } assignTypeInt(name, indexes, value, type) { // TODO: WARNING: e2value an extra evaluation - const v = this.expressions.getValue(value); + const v = Expression.getValue(value); if (typeof v === 'number' || typeof v === 'bigint') { - return this.references.set(name, indexes, v); + return Context.references.set(name, indexes, v); } } assignTypeExpr(name, indexes, value, type) { if (!(value instanceof Expression)) { - this.references.set(name, indexes, value); + Context.references.set(name, indexes, value); return; } value = value.instance(true); - if (this.context.sourceRef === 'std_sum.pil:195') { + if (Context.sourceRef === 'std_sum.pil:195') { console.log('XXX'); } - console.log(`ASSIGN ${this.context.sourceRef} ${value}`); - this.references.set(name, indexes, value); - return + console.log(`ASSIGN ${Context.sourceRef} ${value}`); + Context.references.set(name, indexes, value); } } diff --git a/src/builtin/assert_eq.js b/src/builtin/assert_eq.js index a98fad0..f2160f5 100644 --- a/src/builtin/assert_eq.js +++ b/src/builtin/assert_eq.js @@ -1,16 +1,19 @@ const Function = require("../function.js"); +const Expression = require('../expression.js'); module.exports = class AssertEq extends Function { - constructor (parent) { - super(parent, {funcname: 'assert_eq'}); + constructor () { + super(999999, {funcname: 'assert_eq'}); } mapArguments(s) { if (s.arguments.length !== 2) { throw new Error('Invalid number of parameters'); } - const arg0 = this.expressions.e2value(s.arguments[0]); - const arg1 = this.expressions.e2value(s.arguments[1]); + assert(s.arguments[0] instanceof Expression); + assert(s.arguments[1] instanceof Expression); + const arg0 = s.arguments[0].e2value(); + const arg1 = s.arguments[1].e2value(); if (arg0 !== arg1) { - throw new Error(`Assert fails (${arg0} === ${arg1}) on ${this.parent.sourceRef}`); + throw new Error(`Assert fails (${arg0} === ${arg1}) on ${Context.sourceRef}`); } return 0n; } diff --git a/src/constraints.js b/src/constraints.js index 4b86a27..d78dbb5 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -1,11 +1,9 @@ const {assert, assertLog} = require('./assert.js'); const Expression = require('./expression.js'); +const Context = require('./context.js'); module.exports = class Constraints { - - constructor (Fr, expressions) { - this.Fr = Fr; + constructor () { this.constraints = []; - this.expressions = expressions; } clone() { @@ -22,7 +20,7 @@ module.exports = class Constraints { } getExpr(id) { - return this.expressions.get(this.constraints[id].exprId); + return Context.expressions.get(this.constraints[id].exprId); } isDefined(id) { @@ -30,7 +28,7 @@ module.exports = class Constraints { } getPackedExpressionId(id, container, options) { - return this.expressions.getPackedExpressionId(id, container, options); + return Context.expressions.getPackedExpressionId(id, container, options); } define(left, right, boundery, sourceRef) { console.log(left, right); @@ -52,7 +50,7 @@ module.exports = class Constraints { left.insert('sub', right); } // left.simplify(); - const exprId = this.expressions.insert(left); + const exprId = Context.expressions.insert(left); return this.constraints.push({exprId, sourceRef, boundery}) - 1; } @@ -82,12 +80,12 @@ module.exports = class Constraints { getDebugInfo(index, packed, options) { const constraint = this.constraints[index]; const eid = constraint.exprId; - const peid = this.expressions.getPackedExpressionId(eid); + const peid = Context.expressions.getPackedExpressionId(eid); let info = `INFO ${index}: ${eid} ${peid} ${constraint.sourceRef}` options = options ?? {}; if (packed) { - info += ' ' + packed.exprToString(peid, {...options, labels: this.expressions, hideClass: true}); + info += ' ' + packed.exprToString(peid, {...options, labels: Context.expressions, hideClass: true}); } return info; } diff --git a/src/containers.js b/src/containers.js index e162419..172a19f 100644 --- a/src/containers.js +++ b/src/containers.js @@ -1,9 +1,8 @@ +const Context = require('./context.js'); const {assert, assertLog} = require('./assert.js'); module.exports = class Containers { - constructor (parent,context, scope) { + constructor (parent) { this.parent = parent; - this.context = context; - this.scope = scope; this.containers = {}; this.current = false; this.uses = []; @@ -17,8 +16,8 @@ module.exports = class Containers { throw new Error(`Alias ${alias} already defined on ${this.aliases[alias].sourceRef}`); } - this.scope.addToScopeProperty('aliases', alias); - this.aliases[alias] = {container: value, sourceRef: this.context.sourceRef}; + Context.scope.addToScopeProperty('aliases', alias); + this.aliases[alias] = {container: value, sourceRef: Context.sourceRef}; } getAlias(alias, defaultValue) { return this.aliases[alias] ?? defaultValue; @@ -102,7 +101,7 @@ module.exports = class Containers { // TODO: defined must be check containers throw new Exception(`Use not created container ${name}`); } - this.scope.addToScopeProperty('uses', name); + Context.scope.addToScopeProperty('uses', name); this.uses.push(name); } getReferenceInside(container, name, defaultValue) { diff --git a/src/context.js b/src/context.js index daf291c..4ab49f6 100644 --- a/src/context.js +++ b/src/context.js @@ -1,20 +1,40 @@ const {assert} = require("chai"); -const References = require("./references.js"); -const Expressions = require("./expressions.js"); -const Router = require("./router.js"); module.exports = class Context { + static _instance = null; + constructor (Fr, processor) { + assert(Context._instance === null); + Context._instance = this; this.Fr = Fr; - this.processor = processor; + this._processor = processor; this.namespace = ''; this.subproof = false; this.stack = []; this.config = {debug: {}}; - this.sourceRef = ''; this.uses = []; } - + static get expressions() { + return this._instance._processor.expressions; + } + static get runtime() { + return this._instance._processor.runtime; + } + static get scope() { + return this._instance._processor.scope; + } + static get sourceRef() { + return this._instance._processor.sourceRef; + } + static get processor() { + return this._instance._processor; + } + static get current() { + return this._instance; + } + static get references() { + return this._instance._processor.references; + } setNamespace(namespace, subproof) { this.namespace = namespace; if (typeof subproof !== 'undefined') { diff --git a/src/definition_items.js b/src/definition_items.js new file mode 100644 index 0000000..ea0bfb3 --- /dev/null +++ b/src/definition_items.js @@ -0,0 +1,33 @@ +const DefinitionItem = require("./definition_items/definition_item.js"); +const FeValue = require("./definition_items/fe_value.js"); +const IntValue = require("./definition_items/int_value.js"); +const ProofItem = require("./definition_items/proof_item.js"); +const Proofval = require("./definition_items/proofval.js"); +const Challenge = require("./definition_items/challenge.js"); +const Public = require("./definition_items/public.js"); +const Publictable = require("./definition_items/publictable.js"); +const ReferenceItem = require("./definition_items/reference_item.js"); +const RuntimeItem = require("./definition_items/runtime_item.js"); +const StringValue = require("./definition_items/string_value.js"); +const Subproofval = require("./definition_items/subproofval.js"); +const ValueItem = require("./definition_items/value_item.js"); +const WitnessCol = require("./definition_items/witness_col.js"); +const FixedCol = require("./definition_items/fixed_col.js"); + +module.exports = { + DefinitionItem, + FeValue, + FixedCol, + IntValue, + ProofItem, + Proofval, + Challenge, + Public, + Publictable, + ReferenceItem, + RuntimeItem, + StringValue, + Subproofval, + ValueItem, + WitnessCol +} diff --git a/src/definition_items/challenge.js b/src/definition_items/challenge.js new file mode 100644 index 0000000..f1afdee --- /dev/null +++ b/src/definition_items/challenge.js @@ -0,0 +1,12 @@ +const ProofStageItem = require("./proof_stage_item.js"); +module.exports = class Challenge extends ProofStageItem { + constructor (id, data = {}) { + super(id, data.stage); + this.sourceRef = data.sourceRef; + this.label = data.label; + } + clone() { + return new Challenge(this.id, {stage: this.stage, sourceRef: this.sourceRef, + label: (this.label && typeof this.label.clone === 'function') ? this.label.clone(): this.label}); + } +} diff --git a/src/definition_items/definition_item.js b/src/definition_items/definition_item.js new file mode 100644 index 0000000..f2f0cc3 --- /dev/null +++ b/src/definition_items/definition_item.js @@ -0,0 +1,68 @@ +/* cexp next ind Parent Item DefClas Definition + ---- ---- --- -------------- -------------- -------------- --------------------------------------------- + Challenge - - * ProofStageItem id ProofStageDef id + stage [used] + SubExpression - * * ProofItem id - id [const,use] + FeValue - - - ValueItem value - value (fe) [const] + IntValue * - - ValueItem value - value (bigint) [const] + FixedCol - - * ProofItem id - id [used] + FunctionCall * * ? RuntimeItem "id",argValues Function name,args,return,statements + Proofval - - * ProofItem id - id [used] + Public - - * ProofItem id - id [used] + Publictable - - * ProofItem id PublictableDef id + numCols,maxRows,aggType,rowExpressionId [used] + *PublictableCol - - * ProofItem id,colId - [const, used] + ReferenceItem * * * RuntimeItem name ? name + type, instance, etc. + StringValue * - - RuntimeItem value - value (string) [const, used] + Subproofval - - * ProofItem id SubproofvalDef id + subproofId [used] + WitnessCol - * * ProofStageItem id ProofStageDef id + stage [used] + + + Type List Item + ---------- -------------- -------------- + Challenge challenge challenges (Ids) stage Ids: new cls(id) + Expression expr exprs (Variables) value Variables: new cls(value) + SubExpression subexpr subexprs (Ids) id Ids: new cls(id) + FeValue fe fes (Variables) value Variables: new cls(value) + IntValue int ints (Variables) value Variables: new cls(value) + FixedCol fixed fixeds (FixedCols) id Ids: new cls(id) + Proofval proofvalue proofvalues (Ids) id Ids: new cls(id) + Public public publics (Ids) id Ids: new cls(id) + Publictable publictable id + *PublictableCol id,colId + ReferenceItem - references (References) name + StringValue string strings (Variables) value Variables: new cls(value) + Subproofval subproofval subproofvalues (Ids) id Ids: new cls(id) + WitnessCol witness witness (WitnessCols) id WitnessCols: new WitnessCol(id, stage) + + + + cexp: compiler expression (build) + next: allowed next + ind: allowed indexes + + ExpressionItem > ProofItem > ProofStageItem + > RuntimeItem + > ValueItem + + Array information on reference + + ArrayOf (multiarray, from: ExpressionItem) + ArrayOf (multiarray, [ExpressionItem]) = List + +*/ +module.exports = class DefinitionItem { + constructor (id, properties = {}) { + this.id = id; + this.label = properties.label; + } + dump(options) { + return `${this.constructor.name}()`; + } + get type() { + console.log(this); + throw new Error(`FATAL: use type obsolete-property`) + } + cloneProperties(cloned) { + cloned.id = this.id; + cloned.label = this.label; + } +} diff --git a/src/definition_items/expression_reference.js b/src/definition_items/expression_reference.js new file mode 100644 index 0000000..6651b7c --- /dev/null +++ b/src/definition_items/expression_reference.js @@ -0,0 +1,3 @@ +const RuntimeItem = require("./runtime_item.js"); +module.exports = class ExpressionReference extends RuntimeItem { +} diff --git a/src/definition_items/fe_value.js b/src/definition_items/fe_value.js new file mode 100644 index 0000000..4d5d13a --- /dev/null +++ b/src/definition_items/fe_value.js @@ -0,0 +1,17 @@ +const LabelRanges = require("../label_ranges.js"); +const ValueItem = require("./value_item.js"); + +module.exports = class FeValue extends ValueItem { + constructor (value = 0n) { + super(value); + } + clone() { + return new FeValue(this.value); + } + asInt() { + return this.value; + } + asNumber() { + return Number(this.value); + } +} diff --git a/src/definition_items/fixed_col.js b/src/definition_items/fixed_col.js new file mode 100644 index 0000000..03b2bb3 --- /dev/null +++ b/src/definition_items/fixed_col.js @@ -0,0 +1,54 @@ +const ProofItem = require("./proof_item.js"); +// const Sequence = require("../sequence.js"); +module.exports = class FixedCol extends ProofItem { + constructor (id) { + super(id); + this.rows = 0; + this.sequence = null; + this.values = []; + this.fullFilled = false; + } + getId() { + return this.id; + } + isPeriodic() { + return this.rows > 0; + } + getValue(row) { + if (this.sequence === null) { + return this.values[row] + } + return this.sequence.getValue(row); + } + setValue(value) { + // REVIEW + this.set(value); + } + set(value) { + // REVIEW: cyclic references + if (value instanceof Object) { + if (this.sequence !== null) { + EXIT_HERE; + } + if (this.values.length > 0) { + EXIT_HERE; + } + this.sequence = value; + this.rows = this.sequence.size; + } + else { + console.log(value); + EXIT_HERE; + } + } + clone() { + let cloned = new FixedCol(this.id); + cloned.rows = this.rows; + cloned.values = [...this.values]; + cloned.fullFilled = this.fullFilled; + if (this.sequence) { + cloned.sequence = this.sequence.clone(); + } + return cloned; + } +} diff --git a/src/definition_items/int_value.js b/src/definition_items/int_value.js new file mode 100644 index 0000000..b14c3eb --- /dev/null +++ b/src/definition_items/int_value.js @@ -0,0 +1,40 @@ +const {assert, assertLog} = require('../assert.js'); +const ValueItem = require("./value_item.js"); + +module.exports = class IntValue extends ValueItem { + constructor (value = 0n) { + if (value instanceof IntValue) { + value = value.value; + } + if (typeof value === 'number') { + value = BigInt(value); + } + assertLog(typeof value === 'bigint', value); + super(value); + } + setValue(value) { + console.log(value); + if (typeof value.asInt === 'function') { + value = value.asInt(); + } + if (typeof value === 'number') { + value = BigInt(value); + } + assertLog(typeof value === 'bigint', value); + super.setValue(value); + } + clone() { + return new IntValue(this.value); + } + static castTo(value) { + if (value instanceof IntValue) { + return value.value; + } + } + asInt() { + return this.value; + } + asNumber() { + return Number(this.value); + } +} diff --git a/src/definition_items/proof_item.js b/src/definition_items/proof_item.js new file mode 100644 index 0000000..2c6e9c3 --- /dev/null +++ b/src/definition_items/proof_item.js @@ -0,0 +1,26 @@ +const ExpressionItem = require("./definition_item.js"); +module.exports = class ProofItem extends ExpressionItem { + constructor (id) { + super(); + this.id = id; + } + getId() { + return this.id; + } + getLabel(options) { + const manager = this.getManager(); + if (!manager) return ''; + return manager.getLabel(this.id, options); + } + dump(options) { + const [pre,post] = this.getNextStrings(); + options = options ?? {}; + const defaultType = options.type ? options.type : this.constructor.name; + if (!options.label && !options.hideLabel && options.dumpToString) { + options = {...options, label: this.getLabel(options)}; + } + const label = options.label ? options.label : `${defaultType}@${this.id}`; + return `${pre}${label}${post}`; + } +} + diff --git a/src/expression_items/proof_stage_item.js b/src/definition_items/proof_stage_item.js similarity index 100% rename from src/expression_items/proof_stage_item.js rename to src/definition_items/proof_stage_item.js diff --git a/src/definition_items/proofval.js b/src/definition_items/proofval.js new file mode 100644 index 0000000..5f90c12 --- /dev/null +++ b/src/definition_items/proofval.js @@ -0,0 +1,10 @@ +const ProofItem = require("./proof_item.js"); + +module.exports = class Proofval extends ProofItem { + constructor (id) { + super(id); + } + clone() { + return new Proofval(this.id); + } +} diff --git a/src/definition_items/public.js b/src/definition_items/public.js new file mode 100644 index 0000000..52b84d1 --- /dev/null +++ b/src/definition_items/public.js @@ -0,0 +1,12 @@ +const ProofItem = require("./proof_item.js"); +module.exports = class Public extends ProofItem { + constructor (id) { + super(id); + } + getId() { + return this.id; + } + clone() { + return new Public(this.id); + } +} diff --git a/src/definition_items/publictable.js b/src/definition_items/publictable.js new file mode 100644 index 0000000..28b63f1 --- /dev/null +++ b/src/definition_items/publictable.js @@ -0,0 +1,12 @@ +const ProofItem = require("./proof_item.js"); +module.exports = class PublicTable extends ProofItem { + constructor (id) { + super(id); + } + getId() { + return this.id; + } + clone() { + return new PublicTable(this.id); + } +} diff --git a/src/definition_items/reference_item.js b/src/definition_items/reference_item.js new file mode 100644 index 0000000..0d12510 --- /dev/null +++ b/src/definition_items/reference_item.js @@ -0,0 +1,20 @@ +const RuntimeItem = require("./runtime_item.js"); +module.exports = class ReferenceItem extends RuntimeItem { + constructor (name, indexes = [], next = 0) { + super(); + this.name = name; + this.indexes = [...indexes]; + this.next = Number(next ?? 0); + } + dump(options) { + const [pre,post] = this.getNextStrings(); + return `ReferenceItem(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + } + clone() { + let cloned = new ReferenceItem(this.name, this.indexes, this.next); + this.cloneProperties(cloned); + } + cloneProperties(cloned) { + super.cloneProperties(cloned); + } +} diff --git a/src/definition_items/runtime_item.js b/src/definition_items/runtime_item.js new file mode 100644 index 0000000..3c03673 --- /dev/null +++ b/src/definition_items/runtime_item.js @@ -0,0 +1,20 @@ +const DefinitionItem = require("./definition_item.js"); +module.exports = class RuntimeItem extends DefinitionItem { + constructor (id, properties = {}) { + super(id, properties); + this.const = properties.const ?? false; + this.initialized = false; + } + cloneProperties(cloned) { + super.cloneProperties(cloned); + cloned.const = this.const; + cloned.initialized + } + setValue(value) { + if (this.const && this.initialized) { + throw new Error(`Setting a constant element`); + } + this.initialized = true; + } +} + diff --git a/src/definition_items/string_value.js b/src/definition_items/string_value.js new file mode 100644 index 0000000..13f493e --- /dev/null +++ b/src/definition_items/string_value.js @@ -0,0 +1,27 @@ +const {assert, assertLog} = require("../assert.js"); +const RuntimeItem = require("./runtime_item.js"); + +module.exports = class StringValue extends RuntimeItem { + constructor (id, properties) { + super(id, properties); + const value = properties.value ?? ''; + assertLog(typeof value === 'string', value); + this.value = value; + } + getValue() { + return this.value; + } + setValue(value) { + assert(typeof value === 'string') + this.value = value; + return this.value; + } + clone() { + let cloned = new StringValue(this.id); + this.cloneProperties(cloned); + } + cloneProperties(cloned) { + super.cloneProperties(cloned); + cloned.value = this.value; + } +} diff --git a/src/definition_items/subproofval.js b/src/definition_items/subproofval.js new file mode 100644 index 0000000..431b491 --- /dev/null +++ b/src/definition_items/subproofval.js @@ -0,0 +1,16 @@ +const ProofItem = require("./proof_item.js"); +module.exports = class Subproofval extends ProofItem { + constructor (id, data = {}) { + super(id); + this.aggregateType = data.aggregateType; + this.sourceRef = data.sourceRef; + this.subproofId = data.subproofId; + this.label = data.label; + } + clone() { + return new Subproofval(this.id, {aggregateType: this.aggregateType, + sourceRef: this.sourceRef, + subproofId: this.subproofId, + label: (this.label && typeof this.label.clone === 'function') ? this.label.clone : this.label}); + } +} diff --git a/src/definition_items/value_item.js b/src/definition_items/value_item.js new file mode 100644 index 0000000..5e6152f --- /dev/null +++ b/src/definition_items/value_item.js @@ -0,0 +1,21 @@ +const ExpressionItem = require("./definition_item.js"); + +module.exports = class ValueItem extends ExpressionItem { + static directValue = true; + constructor (value) { + super(); + this.value = value; + } + getValue() { + return this.value; + } + setValue(value) { + this.value = value; + } + dump() { + return `${this.constructor.name}(${this.value})`; + } + clone() { + return new ValueItem(this.value); + } +} diff --git a/src/definition_items/witness_col.js b/src/definition_items/witness_col.js new file mode 100644 index 0000000..9abc538 --- /dev/null +++ b/src/definition_items/witness_col.js @@ -0,0 +1,14 @@ +const ProofStageItem = require("./proof_stage_item.js"); +const {assert, assertLog} = require('../assert.js'); +module.exports = class WitnessCol extends ProofStageItem { + constructor (id, stage = 1) { + assert(typeof id !== 'undefined'); + super(id, stage); + console.log('CONSTRUCTOR_WITNESS', id, this.id); + } + clone() { + let cloned = new WitnessCol(this.id, this.stage); + console.log('CLONE_WITNESS:', this, cloned); + return cloned; + } +} diff --git a/src/definitions.js b/src/definitions.js index 06b30f2..a313d21 100644 --- a/src/definitions.js +++ b/src/definitions.js @@ -1,7 +1,6 @@ module.exports = class Definitions { - constructor (Fr) { - this.Fr = Fr; + constructor () { this.definitions = {}; } get length () { diff --git a/src/expression.js b/src/expression.js index 2c5c6c0..adbb997 100644 --- a/src/expression.js +++ b/src/expression.js @@ -17,6 +17,7 @@ const RuntimeItem = require("./expression_items/runtime_item.js"); const FixedCol = require("./expression_items/fixed_col.js"); const Public = require("./expression_items/public.js"); const Challenge = require("./expression_items/challenge.js"); +const Context = require('./context.js'); const OP_VALUE = 'value'; const OP_ID_REF = 'idref'; const OP_STACK = 'stack'; @@ -76,10 +77,6 @@ module.exports = class Expression extends ExpressionItem { Expression.parent = parent; } - static setContext (context) { - Expression.context = context; - } - get isExpression() { return true; } @@ -549,7 +546,7 @@ module.exports = class Expression extends ExpressionItem { } else if (value instanceof ProofItem) { return null; } else if (value instanceof ReferenceItem) { - let res = Expression.context.runtime.eval(value, {}); + let res = Context.runtime.eval(value, {}); return res; } else { console.log(value); @@ -1099,9 +1096,14 @@ module.exports = class Expression extends ExpressionItem { // container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); // break; const id = ope.getId(); + const def = Context.references.getDefinitionByItem(ope); + assert(def !== false); if (ope instanceof WitnessCol) { // container.pushWitnessCol(id, next ?? 0, stage ?? 1) - container.pushWitnessCol(id, ope.getNext(), ope.getStage()); + console.log(ope); + // CURRENT ERROR: in this scope definition not available. + console.log(def); + container.pushWitnessCol(id, ope.getNext(), def.stage); } else if (ope instanceof FixedCol) { // container.pushFixedCol(id, next ?? 0); diff --git a/src/expression_items/challenge.js b/src/expression_items/challenge.js index 0ae43ac..526ed5c 100644 --- a/src/expression_items/challenge.js +++ b/src/expression_items/challenge.js @@ -1,9 +1,9 @@ -const ProofStageItem = require("./proof_stage_item.js"); -module.exports = class Challenge extends ProofStageItem { - constructor (id, stage) { - super(id, stage); +const ProofItem = require("./proof_item.js"); +module.exports = class Challenge extends ProofItem { + constructor (id) { + super(id); } clone() { - return new Challenge(this.id, this.stage); + return new Challenge(this.id); } } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 6594395..f135ba2 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -1,6 +1,6 @@ /* cexp next ind Parent Item DefClas Definition ---- ---- --- -------------- -------------- -------------- --------------------------------------------- - Challenge - - * ProofStageItem id ProofStageDef id + stage [used] + Challenge - - * ProofItem id ProofStageDef id + stage [used] SubExpression - * * ProofItem id - id [const,use] FeValue - - - ValueItem value - value (fe) [const] IntValue * - - ValueItem value - value (bigint) [const] @@ -14,7 +14,7 @@ StackItem - - - ExpressionItem offset - - StringValue * - - RuntimeItem value - value (string) [const, used] Subproofval - - * ProofItem id SubproofvalDef id + subproofId [used] - WitnessCol - * * ProofStageItem id ProofStageDef id + stage [used] + WitnessCol - * * ProofItem id ProofStageDef id + stage [used] Type List Item @@ -43,7 +43,7 @@ next: allowed next ind: allowed indexes - ExpressionItem > ProofItem > ProofStageItem + ExpressionItem > ProofItem > RuntimeItem > ValueItem diff --git a/src/expression_items/fe_value.js b/src/expression_items/fe_value.js index 1803dee..4d5d13a 100644 --- a/src/expression_items/fe_value.js +++ b/src/expression_items/fe_value.js @@ -8,10 +8,10 @@ module.exports = class FeValue extends ValueItem { clone() { return new FeValue(this.value); } - asInt(value) { + asInt() { return this.value; } - asNumber(value) { + asNumber() { return Number(this.value); } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index d7cd580..b305c49 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -5,7 +5,9 @@ module.exports = class FunctionCall extends RuntimeItem { this.name = name; this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); this.indexes = indexes.map(x => (typeof x.clone === 'function') ? x.clone() : x); - this.next = next; + } + setFunction(funcdef) { + this.funcdef = funcdef; } dump(options) { const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; @@ -13,6 +15,7 @@ module.exports = class FunctionCall extends RuntimeItem { return `Function(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; } clone() { - return new FunctionCall(this.name, this.args, this.indexes); + let cloned = new FunctionCall(this.name, this.args, this.indexes); + cloned.funcdef = this.funcdef; } } diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index 682635f..d138b54 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -26,11 +26,16 @@ module.exports = class IntValue extends ValueItem { if (value instanceof IntValue) { return value.value; } + if (typeof value.asInt === 'function') { + return value.asInt(); + } + console.log(value); + EXIT_HERE; } - asInt(value) { + asInt() { return this.value; } - asNumber(value) { + asNumber() { return Number(this.value); } } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index 9abc538..ea59f45 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,8 +1,8 @@ -const ProofStageItem = require("./proof_stage_item.js"); +const ProofItem = require("./proof_item.js"); const {assert, assertLog} = require('../assert.js'); -module.exports = class WitnessCol extends ProofStageItem { +module.exports = class WitnessCol extends ProofItem { constructor (id, stage = 1) { - assert(typeof id !== 'undefined'); + assertLog(typeof id !== 'undefined', id); super(id, stage); console.log('CONSTRUCTOR_WITNESS', id, this.id); } diff --git a/src/expressions.js b/src/expressions.js index 078b35b..a94a28a 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -4,15 +4,9 @@ const Expression = require('./expression.js'); const WitnessCol = require('./expression_items/witness_col.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); module.exports = class Expressions { - - constructor (Fr, parent, references, publics, constants) { - this.Fr = Fr; + constructor () { this.expressions = []; this.packedIds = []; - this.references = references; - this.constants = constants; - this.parent = parent; - this.context = parent.context; this.labelRanges = new LabelRanges(); Expression.setParent(this); } @@ -126,7 +120,7 @@ module.exports = class Expressions { throw new Error(`Invalid runtime operation ${op}`); } _evalString(e) { - if (e.template) return this.parent.evaluateTemplate(e.value); + if (e.template) return Context.processor.evaluateTemplate(e.value); return e.value; } eval2(e, pos, values) { @@ -146,13 +140,13 @@ module.exports = class Expressions { return e; } _evalCall(e) { - return this.parent.execCall(e); + return Context.processor.execCall(e); } _evalIdref(e) { if (e.array) { return e; } - return this.evalReferenceValue(this.references.getIdRefValue(e.refType, e.id)); + return this.evalReferenceValue(Context.references.getIdRefValue(e.refType, e.id)); } evalReference(e) { const ref = this.evalReferenceValue(e); @@ -254,7 +248,7 @@ module.exports = class Expressions { if (type === 'im') { return this.labelRanges.getLabel(id, options); } - return this.references.getLabel(type, id, options); + return Context.references.getLabel(type, id, options); } resolveReference(operand, deeply = false) { const names = this.context.getNames(operand.name); @@ -275,7 +269,7 @@ module.exports = class Expressions { options.postDelta = -1n; } } - let res = this.references.getTypedValue(names, operand.__indexes, options); + let res = Context.references.getTypedValue(names, operand.__indexes, options); if (typeof operand.__next !== 'undefined') { res.__next = res.next = operand.__next; } else if (typeof operand.next !== 'number' && (operand.next || operand.prior)) { @@ -287,7 +281,7 @@ module.exports = class Expressions { } getReferenceInfo(e, options) { const names = this.context.getNames(e.getAloneOperand().name); - return this.references.getTypeInfo(names, e.__indexes, options); + return Context.references.getTypeInfo(names, e.__indexes, options); } e2num(e, s, title = '') { return this.e2types(e, s, title, ['number','bigint']); diff --git a/src/fixed_cols.js b/src/fixed_cols.js index 4c02698..b280ff1 100644 --- a/src/fixed_cols.js +++ b/src/fixed_cols.js @@ -1,9 +1,10 @@ const Indexable = require("./indexable.js"); -const FixedCol = require("./expression_items/fixed_col.js"); +const FixedColItem = require("./expression_items/fixed_col.js"); +const FixedCol = require("./definition_items/fixed_col.js"); module.exports = class FixedCols extends Indexable { constructor () { - super('fixed', FixedCol); + super('fixed', FixedCol, FixedColItem); } getEmptyValue(id) { return new FixedCol(id); diff --git a/src/function.js b/src/function.js index b02754f..b1b289b 100644 --- a/src/function.js +++ b/src/function.js @@ -1,21 +1,38 @@ const util = require('util'); const {cloneDeep} = require('lodash'); +const {assert, assertLog} = require('./assert.js'); const {FlowAbortCmd, BreakCmd, ContinueCmd, ReturnCmd} = require("./flow_cmd.js"); const Expression = require("./expression.js"); const List = require("./list.js"); +const Context = require('./context.js'); module.exports = class Function { - - constructor (parent, s) { - this.parent = parent; - this.references = parent.references; - this.expressions = parent.expressions; - this.scope = parent.scope; - this.name = s.funcname; - if (s.args) { - this.defineArguments(s.args); + constructor (id, data = {}) { + console.log(data); + this.id = id; + // this.references = parent.references; + // this.expressions = parent.expressions; + this.initialized = [data.args, data.returns, data.statements, data.funcname].some(x => typeof x !== 'undefined'); + // this.scope = parent.scope; + this.name = data.funcname; + if (data.args) { + this.defineArguments(data.args); + } + this.returns = data.returns ?? [] + this.statements = data.statements ?? []; + } + setValue(value) { + if (this.initialized) { + throw new Error(`function it's initialized again`); + } + if (value instanceof Function === false) { + throw new Error(`Invalid value to setValue of function`); } - this.returns = s.returns ?? [] - this.statements = s.statements ?? []; + this.initialized = value.initialized; + this.name = value.name; + // TODO: clone return types + this.args = {...value.args}; + this.returns = value.returns ? [...value.returns] : value.returns; + this.statements = value.statements; } defineArguments(args) { this.args = {}; @@ -53,7 +70,7 @@ module.exports = class Function { // special case of col, could be witness, fixed or im if (type === 'col') { - type = this.parent.references.getReferenceType(ref.name); + type = Context.references.getReferenceType(ref.name); } const dim = ref.array ? ref.array.dim : 0; if (dim !== argDim) { @@ -61,29 +78,29 @@ module.exports = class Function { console.log(ref); console.log(argDim); console.log(s.arguments[iarg].getAloneOperand()); - throw new Error(`Invalid array on ${this.parent.sourceRef}`); + throw new Error(`Invalid array on ${Context.sourceRef}`); } - this.parent.declareReference(name, type, ref.array ? ref.array.lengths : []); - this.parent.references.setReference(name, ref); + Context.processor.declareReference(name, type, ref.array ? ref.array.lengths : []); + Context.references.setReference(name, ref); } else if (arg.type === 'int' || arg.type === 'fe') { if (argDim) { s.arguments[iarg].eval(); const ref = s.arguments[iarg].getReference(); console.log(ref); console.log(ref.name); - const def = this.references.getDefinition(ref.name); + const def = Context.references.getDefinition(ref.name); const dup = def.array.applyIndex(def, ref.__indexes ?? []); if (dup.array.dim !== argDim) { console.log(dup.array.dim, argDim); - throw new Error(`Invalid array on ${this.parent.sourceRef}`); + throw new Error(`Invalid array on ${Context.processor.sourceRef}`); } - this.parent.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); + Context.processor.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); } else { - const value = this.parent.expressions.eval(s.arguments[iarg]); + const value = Context.processor.expressions.eval(s.arguments[iarg]); // TODO: review? no referece? - this.parent.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); + Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } } else { // console.log(`MAP-${arg.type}`); @@ -92,11 +109,11 @@ module.exports = class Function { // check (argDim === 1 && arg.type === 'expr') const list = new List(this, s.arguments[iarg], false); const values = s.arguments[iarg].values; - this.parent.declareReference(name, type, [values.length], {}); + Context.processor.declareReference(name, type, [values.length], {}); let index = 0; for (const value of list.values) { // console.log(value); - this.parent.references.set(name, [index++], value instanceof Expression ? value.instance() : value); + Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); } } else if (!(s.arguments[iarg] instanceof Expression)) { console.log(arg); @@ -109,9 +126,9 @@ module.exports = class Function { const value = s.arguments[iarg].evaluateAloneReference(); const dim = value.array ? value.array.dim : 0; if (dim !== argDim) { - throw new Error(`Invalid array on ${this.parent.sourceRef}`); + throw new Error(`Invalid array on ${Context.sourceRef}`); } - this.parent.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); + Context.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } } ++iarg; @@ -119,9 +136,10 @@ module.exports = class Function { return false; } exec(s, mapInfo) { - let res = this.parent.execute(this.statements, `FUNCTION ${this.name}`); + console.log(Context.constructor.name); + let res = Context.processor.execute(this.statements, `FUNCTION ${this.name}`); if (res instanceof ReturnCmd) { - this.parent.traceLog('[TRACE-BROKE-RETURN]', '38;5;75;48;5;16'); + Context.processor.traceLog('[TRACE-BROKE-RETURN]', '38;5;75;48;5;16'); const resvalue = res.value.eval(); return resvalue; } diff --git a/src/ids.js b/src/ids.js index f6111bc..e187c9f 100644 --- a/src/ids.js +++ b/src/ids.js @@ -3,12 +3,12 @@ const ExpressionItem = require('./expression_items/expression_item.js'); const {assert,assertLog} = require('./assert.js'); module.exports = class Ids { - constructor (type, cls) { + constructor (type, definitionClass, itemClass) { this.lastId = 0; this.datas = []; this.type = type; - this.cls = cls; - assertLog(cls.prototype instanceof ExpressionItem, cls); + this.definitionClass = definitionClass; + this.itemClass = itemClass; this.labelRanges = new LabelRanges(); } get length() { @@ -35,10 +35,13 @@ module.exports = class Ids { get(id, offset) { return this.getTypedValue(id, offset) } - getTypedValue(id, offset = 0) { - // return { type: this.type, value: id + offset, data: this.datas[id + offset] }; - return new this.cls(id + offset); + OBSOLETE; + return this.getItem(id, offset); + } + getItem(id, offset = 0) { + // return { type: this.type, value: id + offset, data: this.datas[id + offset] }; + return new this.itemClass(id + offset); } isDefined(id) { diff --git a/src/indexable.js b/src/indexable.js index 867fe7f..ad369a3 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -1,13 +1,16 @@ const LabelRanges = require("./label_ranges.js"); const {cloneDeep} = require('lodash'); const {assert, assertLog} = require('./assert.js'); +const ExpressionItem = require('./expression_items/expression_item.js'); module.exports = class Indexable { - constructor (type, cls, options) { - this.cls = cls ?? false; + constructor (type, definitionClass, expressionItemClass, options) { + this.expressionItemClass = expressionItemClass ?? false; + this.definitionClass = definitionClass ?? false; this.values = []; this.type = type; this.options = options ?? {} this.rtype = this.options.rtype ?? type; + assertLog(this.expressionItemClass.prototype instanceof ExpressionItem, expressionItemClass); this.labelRanges = new LabelRanges(); this.debug = false; } @@ -37,14 +40,24 @@ module.exports = class Indexable { getType(id) { return this.rtype; } - getEmptyValue(id, data) { + getEmptyValue(id, data = {}) { + if (this.type === 'subproofvalue') { + console.log(['SUBPROOFVALUE-E', data]); + } + if (this.definitionClass) { + return new this.definitionClass(id, data); + } return null; } reserve(count, label, multiarray, data) { + if (this.type === 'subproofvalue') { + console.log(['SUBPROOFVALUE-R', data]); + } const id = this.values.length; for (let index = 0; index < count; ++index) { const absoluteIndex = index + id; - this.values[absoluteIndex] = this.getEmptyValue(absoluteIndex, data); + const _label = label + (multiarray ? multiarray.offsetToIndexesString(index) : ''); + this.values[absoluteIndex] = this.getEmptyValue(absoluteIndex, {...data, label: _label}); if (this.debug) { console.log(`INIT ${this.constructor.name}.${this.type} @${absoluteIndex} (${id}+${index}) ${this.values[absoluteIndex]} LABEL:${label}`); } @@ -54,18 +67,20 @@ module.exports = class Indexable { } return id; } + // get definition object get(id) { let res = this.values[id]; - if (typeof res === 'undefined' || res === null) { + if (res === null) { return this.getEmptyValue(id); } return res; } + // get expression item to add in a expression getItem(id, properties) { - let res = this.get(id); - if (this.cls && (res instanceof this.cls) === false) { + let res = this.values[id]; + if (this.expressionItemClass && (res instanceof this.expressionItemClass) === false) { properties = properties ?? {}; - res = new this.cls(this.id); + res = new this.expressionItemClass(id); for (const property in properties) { res[property] = properties[property]; } @@ -87,9 +102,17 @@ module.exports = class Indexable { } this.set(id, value); } - + getLastId() { + return this.values.length === 0 ? false : this.values.length - 1; + } + getNextId() { + return this.values.length; + } set(id, value) { - this.values[id] = value; + console.log(this.values[id]); + console.log(value); + if (this.values[id] && this.values[id].constructor) console.log(this.values[id].constructor.name) + this.values[id].setValue(value); /* if (typeof this.cls === 'function') { if ((value instanceof this.cls) === false) { @@ -117,7 +140,7 @@ module.exports = class Indexable { *[Symbol.iterator]() { for (let index = 0; index < this.values.length; ++index) { - yield this.values[index] ?? this.undefined; + yield this.get(index); } } @@ -143,4 +166,44 @@ module.exports = class Indexable { console.log(`${index}: ${this.values[index]}`); } } + countByProperty(property) { + let res = {}; + for (let index = 0; index < this.values.length; ++index) { + const value = this.get(index); + const key = value[property]; + res[key] = (res[key] ?? 0) + 1; + } + return res; + } + getPropertyValues(property) { + let res = []; + let isArray = Array.isArray(property); + const properties = isArray ? property : [property]; + for (let index = 0; index < this.values.length; ++index) { + let value; + let pvalues = []; + for (const _property of properties) { + const definition = this.get(index); + console.log(definition); + value = _property === 'id' ? definition.id ?? index : definition[_property]; + if (isArray) { + pvalues.push(value); + } + } + res.push(isArray ? pvalues : value); + } + return res; + } + getPropertiesString(properties, options = {}) { + let res = []; + for (let index = 0; index < this.values.length; ++index) { + const definition = this.get(index); + let propValues = []; + for (const property of properties) { + propValues.push(definition[property] ?? ''); + } + res.push(this.getLabel(id)+'@'+id+':'+propValues.join(',')); + } + return res.join('#'); + } } diff --git a/src/multi_array.js b/src/multi_array.js index bbcfd82..2c5b637 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -23,6 +23,9 @@ class MultiArray { getIndexesOffset(indexes) { return this.getIndexesTypedOffset(indexes).offset; } + offsetToIndexesString(offset) { + return '['+this.offsetToIndexes(offset).join('][')+']'; + } offsetToIndexes(offset) { let level = 0; let indexes = []; diff --git a/src/pil_parser.jison b/src/pil_parser.jison index beeef04..1ee90f4 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -244,8 +244,12 @@ top_level_block | subproof_value_declaration { $$ = $1 } - | constant_definition +/* | constant_definition + { $$ = $1 } +*/ + | variable_declaration { $$ = $1 } + ; use_directive @@ -552,9 +556,9 @@ declare_item | subproof_value_declaration { $$ = $1 } - | constant_definition +/* | constant_definition { $$ = $1 } - +*/ | variable_declaration { $$ = $1 } ; diff --git a/src/processor.js b/src/processor.js index 6539dc0..da99af7 100644 --- a/src/processor.js +++ b/src/processor.js @@ -25,22 +25,24 @@ const Context = require("./context.js"); const Runtime = require("./runtime.js"); // const FunctionCall = require("./function_call.js"); const {FlowAbortCmd, BreakCmd, ContinueCmd, ReturnCmd} = require("./flow_cmd.js") -const {ReferenceItem, ExpressionItem, FeValue, IntValue, ProofItem, Proofval, Subproofval, Challenge, Public, ProofStageItem, - ExpressionReference, StringValue, FixedCol, WitnessCol } = require("./expression_items.js"); +// const {ReferenceItem, ExpressionItem, FeValue, IntValue, ProofItem, Proofval, Subproofval, Challenge, Public, ProofStageItem, +// ExpressionReference, StringValue, FixedCol, WitnessCol } = require("./expression_items.js"); + +const ExpressionItems = require("./expression_items.js"); +const ExpressionItem = ExpressionItems.ExpressionItem; +const DefinitionItems = require("./definition_items.js"); const fs = require('fs'); const { log2, getKs, getRoots } = require("./utils.js"); module.exports = class Processor { - constructor (Fr, parent, references, expressions) { + constructor (Fr, parent) { this.compiler = parent; this.trace = true; this.Fr = Fr; + this.references = new References(); + this.scope = new Scope(); + this.runtime = new Runtime(); this.context = new Context(this.Fr, this); - this.scope = new Scope(this.Fr); - this.references = new References(Fr, this.context, this.scope); - this.runtime = new Runtime(this.context); - - Expression.setContext(this.context); this.scope.mark('proof'); this.delayedCalls = {}; @@ -48,66 +50,67 @@ module.exports = class Processor { this.airId = 0; this.subproofId = 0; - this.ints = new Variables('int', IntValue); + this.ints = new Variables('int', DefinitionItems.IntValue, ExpressionItems.IntValue); this.references.register('int', this.ints); - this.fes = new Variables('fe', FeValue); + this.fes = new Variables('fe', DefinitionItems.FeValue, ExpressionItems.FeValue); this.references.register('fe', this.fes); - this.strings = new Variables('string', StringValue); + this.strings = new Variables('string', DefinitionItems.StringValue, ExpressionItems.FeValue); this.references.register('string', this.strings); - this.exprs = new Variables('expr', Expression); + this.exprs = new Variables('expr', DefinitionItems.Expression, Expression); this.references.register('expr', this.exprs); - this.subexprs = new Variables('subexpr', Expression); + this.subexprs = new Variables('subexpr', DefinitionItems.Expression, Expression); this.references.register('subexpr', this.subexprs); // this.lexprs = new Variables('lexpr', Expression); // this.references.register('lexpr', this.lexprs); this.fixeds = new FixedCols(); - ExpressionItem.setManager(FixedCol, this.fixeds); + ExpressionItem.setManager(ExpressionItems.FixedCol, this.fixeds); this.fixeds.runtimeRows = true; this.references.register('fixed', this.fixeds); this.witness = new WitnessCols(); - ExpressionItem.setManager(WitnessCol, this.witness); + ExpressionItem.setManager(ExpressionItems.WitnessCol, this.witness); this.references.register('witness', this.witness); - this.constants = new Indexable('constant', IntValue); - this.references.register('constant', this.constants); +// this.constants = new Indexable('constant', IntValue); +// this.references.register('constant', this.constants); - this.publics = new Ids('public', Public); - ExpressionItem.setManager(Public, this.publics); + this.publics = new Indexable('public', DefinitionItems.Public, ExpressionItems.Public); + ExpressionItem.setManager(ExpressionItems.Public, this.publics); this.references.register('public', this.publics); - this.challenges = new Ids('challenge', Challenge); - ExpressionItem.setManager(Challenge, this.challenges); + this.challenges = new Indexable('challenge', DefinitionItems.Challenge, ExpressionItems.Challenge); + ExpressionItem.setManager(ExpressionItems.Challenge, this.challenges); this.references.register('challenge', this.challenges); - this.proofvalues = new Ids('proofvalue', Proofval); - ExpressionItem.setManager(Proofval, this.proofvalues); + this.proofvalues = new Indexable('proofvalue', DefinitionItems.Proofval, ExpressionItems.Proofval); + ExpressionItem.setManager(ExpressionItems.Proofval, this.proofvalues); this.references.register('proofvalue', this.proofvalues); - this.subproofvalues = new Ids('subproofvalue', Subproofval); - ExpressionItem.setManager(Subproofval, this.subproofvalues); + this.subproofvalues = new Indexable('subproofvalue', DefinitionItems.Subproofval, ExpressionItems.Subproofval); + ExpressionItem.setManager(ExpressionItems.Subproofval, this.subproofvalues); this.references.register('subproofvalue', this.subproofvalues); - this.functions = new Indexable('function'); + this.functions = new Indexable('function', Function, ExpressionItems.FunctionCall); + ExpressionItem.setManager(ExpressionItems.FunctionCall, this.functions); this.references.register('function', this.functions); - this.subproofs = new Subproofs(Fr, this.context); + this.subproofs = new Subproofs(); - this.expressions = new Expressions(Fr, this, this.references, this.publics, this.constants); - this.globalExpressions = new Expressions(Fr, this, this.references, this.publics, this.constants); + this.expressions = new Expressions(); + this.globalExpressions = new Expressions(); - this.references.register('im', this.expressions); + // this.references.register('im', this.expressions); - this.constraints = new Constraints(Fr, this.expressions); - this.globalConstraints = new Constraints(Fr, this.globalExpressions); + this.constraints = new Constraints(); + this.globalConstraints = new Constraints(); - this.assign = new Assign(Fr, this, this.context, this.references, this.expressions); + this.assign = new Assign(); this.executeCounter = 0; this.executeStatementCounter = 0; @@ -126,6 +129,7 @@ module.exports = class Processor { if (this.context.config.debug.builtInLoad) { console.log(`Loading builtin ${filename}.....`); } + console.log(filename); const builtInCls = require(__dirname + '/builtin/'+ filename); const builtInObj = new builtInCls(this); this.builtIn[builtInObj.name] = builtInObj; @@ -243,8 +247,6 @@ module.exports = class Processor { this.traceLog(`[TRACE] #${__executeStatementCounter} ${st.debug ?? ''} (DEEP:${this.scope.deep})`, '38;5;75'); this.sourceRef = st.debug ?? ''; - this.context.sourceRef = this.sourceRef - // console.log(`SOURCE ${this.sourceRef}`); if (typeof st.type === 'undefined') { console.log(st); @@ -276,12 +278,13 @@ module.exports = class Processor { } execCall(st) { const name = st.function.name; - const func = this.builtIn[name] ?? this.references.getTypedValue(name); + const func = this.builtIn[name] ?? this.references.get(name); if (func) { this.callstack.push(st.debug); ++this.functionDeep; this.scope.push(); + console.log(func.constructor.name); const mapInfo = func.mapArguments(st); this.references.pushVisibilityScope(); const res = func.exec(st, mapInfo); @@ -291,7 +294,7 @@ module.exports = class Processor { this.callstack.pop(); return res; } - this.error(st, `Undefined function statement type: ${name}`); + this.error(st, `Undefined function ${name}`); } execAssign(st) { // type: number(int), fe, string, col, challenge, public, prover, @@ -488,6 +491,7 @@ module.exports = class Processor { } } execFunctionDefinition(s) { + console.log('FUNCTION '+s.funcname); let func = new Function(this, s); this.references.declare(func.name, 'function'); this.references.set(func.name, [], func); @@ -496,7 +500,7 @@ module.exports = class Processor { console.log(s); expr.dump(); // expr.expr.dump(); - const se = IntValue.castTo(expr.eval()); + const se = ExpressionItems.IntValue.castTo(expr.eval()); if (typeof se !== 'bigint') { // if (se.op !== 'number') { console.log('ERROR'); @@ -564,7 +568,7 @@ module.exports = class Processor { this.checkRows(subproofRows); // TODO: Fr inside context - const subproof = new Subproof(this.context, subproofRows, s.statements, s.aggregate ?? false); + const subproof = new Subproof(subproofRows, s.statements, s.aggregate ?? false); this.subproofs.define(subproofName, subproof, `subproof ${subproofName} has been defined previously on ${this.context.sourceRef}`); } execSubproofBlock(s) { @@ -594,9 +598,9 @@ module.exports = class Processor { console.log([air.bits, air.rows, Expression.constructor.name]); // create built-in constants - this.references.set('N', [], new IntValue(air.rows)); - this.references.set('BITS', [], new IntValue(air.bits)); - this.references.set('__SUBPROOF__', [], new StringValue(subproofName)); + this.references.set('N', [], air.rows); + this.references.set('BITS', [], air.bits); + this.references.set('__SUBPROOF__', [], subproofName); this.context.push(false, subproofName); this.scope.pushInstanceType('air'); @@ -660,7 +664,7 @@ module.exports = class Processor { let init = s.sequence ?? null; let seq = null; if (init) { - seq = new Sequence(this, init, IntValue.castTo(this.references.get('N'))); + seq = new Sequence(this, init, ExpressionItems.IntValue.castTo(this.references.get('N'))); // console.log(`Extending fixed col ${colname} ...`); seq.extend(); // console.log('SEQ:'+seq.values.join(',')); @@ -856,7 +860,7 @@ module.exports = class Processor { // initValue.dump('INIT2 '+name); } else { - initValue = new IntValue(this.expressions.e2value(s.init[index])); + initValue = new ExpressionItems.IntValue(this.expressions.e2value(s.init[index])); } } console.log(initValue); diff --git a/src/proto_out.js b/src/proto_out.js index ebb00d4..e83defa 100644 --- a/src/proto_out.js +++ b/src/proto_out.js @@ -153,6 +153,7 @@ module.exports = class ProtoOut { this.spvId2Proto = []; let subproofBaseId = []; for (const [id, aggregation, subproofId] of values) { + console.log([id, aggregation, subproofId]); let baseId = subproofBaseId[subproofId] ?? false; if (baseId === false) { baseId = id; @@ -259,8 +260,10 @@ module.exports = class ProtoOut { const property = periodic ? 'periodicCols':'fixedCols'; const airCols = this.setupAirProperty(property); + console.log(cols.constructor.name); const colType = periodic ? 'P':'F'; for (const col of cols) { + console.log(col.constructor.name); const colIsPeriodic = col.isPeriodic() && col.rows < rows; if (colIsPeriodic !== periodic) continue; const _rows = periodic ? col.rows : rows; diff --git a/src/reference.js b/src/reference.js index 5c3670f..671f44f 100644 --- a/src/reference.js +++ b/src/reference.js @@ -25,7 +25,7 @@ module.exports = class Reference { } getId(indexes = []) { - return (indexes.length === 0 || !this.array) ? this.id : this.array.getIndexesOffset(indexes); + return (indexes.length === 0 || !this.array) ? this.locator : this.array.getIndexesOffset(indexes); } init (value, indexes = []) { return this.set(value, indexes); @@ -46,7 +46,13 @@ module.exports = class Reference { get (indexes = []) { return this.instance.get(this.getId(indexes)); } - getItem(indexes, options) { + getItem(indexes, options = {}) { + if (Array.isArray(indexes) && indexes.length === 0) { + console.log(this.instance); + return this.instance.getItem(this.locator); + } + console.log(indexes, indexes === [], this); + console.log(indexes, options); EXIT_HERE_TODO; } } diff --git a/src/references.js b/src/references.js index e29f3e2..cf6587a 100644 --- a/src/references.js +++ b/src/references.js @@ -4,19 +4,25 @@ const Expression = require("./expression.js"); const {ExpressionItem, ArrayOf} = require("./expression_items.js"); const Reference = require('./reference.js'); const Containers = require('./containers.js'); +const Context = require('./context.js'); module.exports = class References { - constructor (Fr, context, scope) { - this.Fr = Fr; + constructor () { this.references = {}; this.types = {}; - this.context = context; - this.scope = scope; this.visibilityScope = 0; this.visibilityStack = []; - this.containers = new Containers(this, context, scope); - this.scope.setReferences(this); - this.context.references = this; + this.containers = new Containers(this); + } + getDefinitionByItem(item) { + let instance = null; + console.log(this.types); + for (const type in this.types) { + instance = this.types[type].instance ?? {}; + if (instance.expressionItemClass === item.constructor) break; + } + console.log(instance.constructor.name); + return instance.get ? instance.get(instance.id): false; } getNameScope(name) { const nameInfo = this.decodeName(name); @@ -30,7 +36,7 @@ module.exports = class References { } pushVisibilityScope() { this.visibilityStack.push(this.visibilityScope); - this.visibilityScope = this.scope.deep; + this.visibilityScope = Context.scope.deep; } popVisibilityScope() { if (this.visibilityStack.length < 1) { @@ -130,10 +136,10 @@ module.exports = class References { prepareScope(nameInfo, type, existingReference) { if (nameInfo.isStatic) { - return [this.scope.declare(nameInfo.name, type, false, nameInfo.scope), nameInfo.scope]; + return [Context.scope.declare(nameInfo.name, type, false, nameInfo.scope), nameInfo.scope]; } - const scopeId = this.hasScope(type) ? this.scope.declare(nameInfo.name, type, existingReference, false) : 0; + const scopeId = this.hasScope(type) ? Context.scope.declare(nameInfo.name, type, existingReference, false) : 0; // scope(name, def) => exception !!! // => scopeId; if (existingReference !== false && existingReference.scopeId === scopeId) { @@ -148,7 +154,7 @@ module.exports = class References { assert(!name.includes('.object')); const nameInfo = this.decodeName(name); - console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${this.scope.deep} ${initValue}`, data); + console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}`, data); let [array, size] = Reference.getArrayAndSize(lengths); @@ -185,7 +191,8 @@ module.exports = class References { } if (initValue !== null) { - reference.init(reference, initValue); + console.log(initValue); + reference.init(initValue); } return id; } @@ -227,15 +234,16 @@ module.exports = class References { const item = reference.getItem(indexes); console.log(item); - EXIT_HERE; if (options.preDelta) { + EXIT_HERE; console.log(typeof tvalue.value); assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); tvalue.value += options.preDelta; instance.set(info.locator + info.offset, tvalue.value); } if (options.postDelta) { + EXIT_HERE; assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); instance.set(info.locator + info.offset, tvalue.value + options.postDelta); } @@ -351,7 +359,7 @@ module.exports = class References { // TODO: defined must be check containers throw new Exception(`Use not created container ${name}`); } - this.scope.addToScopeProperty('uses', name); + Context.scope.addToScopeProperty('uses', name); this.uses.push(name); } searchDefinition(name) { @@ -360,15 +368,11 @@ module.exports = class References { const lname = subnames[subnames.length - 1]; let reference = false; - - if (name === 'MODULE_ID') { - debugger; - } if (!explicitContainer) { reference = this.containers.getReferenceInsideCurrent(lname, false); } else { if (['proof', 'subproof', 'air'].includes(explicitContainer)) { - const scopeId = this.scope.getScopeId(explicitContainer); + const scopeId = Context.scope.getScopeId(explicitContainer); if (scopeId === false) { throw new Error(`not found scope ${explicitContainer}`); } @@ -390,7 +394,7 @@ module.exports = class References { return reference; } isVisible(def) { - return !def.scopeId || def.type === 'constant' || def.scopeId >= this.visibilityScope; // || def.scopeId <= this.scope.getScopeId('air'); + return !def.scopeId || def.type === 'constant' || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } getReference(name, defaultValue) { // if more than one name is sent, use the first one (mainName). Always first name it's directly @@ -416,7 +420,7 @@ module.exports = class References { console.log(names); if (!names) { - names = this.context.getNames(name); + names = Context.current.getNames(name); } console.log(names); diff --git a/src/runtime.js b/src/runtime.js index 08109a0..72a15fe 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -3,14 +3,10 @@ const Expression = require('./expression.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const {assert, assertLog} = require('./assert.js'); const {ReferenceItem, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); +const Context = require('./context.js'); module.exports = class Runtime { - constructor (context) { - context.runtime = this; - this.context = context; - } - eval(operand, options) { if (operand instanceof ReferenceItem) { @@ -30,7 +26,7 @@ module.exports = class Runtime { throw new Error(`Invalid runtime operation ${op}`); } resolveReference(operand, options) { - const names = this.context.getNames(operand.name); + const names = Context.current.getNames(operand.name); let getTypeValueOptions = {}; if (operand.inc === 'pre') { @@ -46,7 +42,7 @@ module.exports = class Runtime { if (operand.dec === 'post') { getTypeValueOptions.postDelta = -1n; } - let res = this.context.references.getItem(names, operand.__indexes ?? [], options); + let res = Context.references.getItem(names, operand.__indexes ?? [], options); if (typeof operand.__next !== 'undefined') { res.__next = res.next = operand.__next; } else if (typeof operand.next !== 'number' && (operand.next || operand.prior)) { diff --git a/src/scope.js b/src/scope.js index c5445ed..8129149 100644 --- a/src/scope.js +++ b/src/scope.js @@ -1,6 +1,6 @@ +const Context = require('./context.js'); module.exports = class Scope { - constructor (Fr) { - this.Fr = Fr; + constructor () { this.deep = 0; this.shadows = [{}]; this.properties = [{}]; @@ -22,9 +22,6 @@ module.exports = class Scope { } } } - setReferences(references) { - this.references = references; - } addToScopeProperty(property, value) { if (typeof this.properties[this.deep][property] === 'undefined') { this.properties[this.deep][property] = [value]; @@ -62,19 +59,19 @@ module.exports = class Scope { // console.log(`POP ${name}`); // console.log(shadows[name]); if (shadows[name].ref === false) { - if (!exclude) this.references.unset(name); + if (!exclude) Context.references.unset(name); } else { // I could not 'update' reference name, because was an excluded type. This situation // was an error because could exists same name in scope linked. if (exclude) { throw new Error(`Excluded type ${shadows[name].type} has shadow reference called ${name}`); } - this.references.restore(name, shadows[name].ref); + Context.references.restore(name, shadows[name].ref); } } this.shadows[this.deep] = {}; for (const property in this.properties[this.deep]) { - this.references.unsetProperty(property, this.properties[this.deep][property]); + Context.references.unsetProperty(property, this.properties[this.deep][property]); } this.properties[this.deep] = {}; --this.deep; @@ -104,21 +101,4 @@ module.exports = class Scope { this.pop(excludeTypes); return this.instanceType; } - *[Symbol.iterator]() { - for (let index in this.references) { - yield index; - } - } - - *values() { - for (let index in this.references) { - yield this.references[index]; - } - } - - *keyValues() { - for (let index in this.references) { - yield [index, this.references[index]]; - } - } } diff --git a/src/sequence.js b/src/sequence.js index 75e1aaa..824a16c 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -36,6 +36,7 @@ module.exports = class Sequence { } clone() { let cloned = new Sequence(this.parent, this.expression, this.maxSize); + console.log(['CLONED', this.maxSize, cloned.maxSize]); this.#values.mutable = false; cloned.#values = this.#values.clone(); return cloned; diff --git a/src/subproof.js b/src/subproof.js index 186ed12..0adf5ff 100644 --- a/src/subproof.js +++ b/src/subproof.js @@ -1,11 +1,10 @@ const Definitions = require("./definitions.js"); const Airs = require("./airs.js"); const Air = require("./air.js") - +const Context = require('./context.js'); module.exports = class Subproof { - constructor (context, rows, statements, aggregate) { - this.context = context; + constructor (rows, statements, aggregate) { this.rows = rows; // array of rows this.blocks = [statements]; this.airs = new Airs(this); @@ -42,7 +41,8 @@ module.exports = class Subproof { } if (this.insideFirstAir) { // this.colDeclaration(s, 'subproofvalue', true, false, {aggregateType: s.aggregateType}); - const res = this.context.processor.references.declare(name, 'subproofvalue', lengths, data); + console.log(['SUBPROOFVALUE', name,lengths, data]); + const res = Context.references.declare(name, 'subproofvalue', lengths, data); this.spvDeclaredInFirstAir[name] = {res, lengths: [...lengths]}; return res; } diff --git a/src/subproofs.js b/src/subproofs.js index 0fe24ab..48d70d8 100644 --- a/src/subproofs.js +++ b/src/subproofs.js @@ -1,9 +1,7 @@ const Definitions = require("./definitions.js"); module.exports = class Subproofs extends Definitions { - - constructor (Fr, context) { - super(Fr) - this.context = context; + constructor () { + super(); } } diff --git a/src/variables.js b/src/variables.js index 78c9eb8..d74af30 100644 --- a/src/variables.js +++ b/src/variables.js @@ -3,7 +3,7 @@ const Indexable = require("./indexable.js"); module.exports = class Variables extends Indexable { - constructor (type, cls, options) { - super(type, cls, options); + constructor (type, definitionClass, expressionItemClass, options) { + super(type, definitionClass, expressionItemClass, options); } } diff --git a/src/witness_cols.js b/src/witness_cols.js index bf41c45..f91ca2c 100644 --- a/src/witness_cols.js +++ b/src/witness_cols.js @@ -1,10 +1,10 @@ -const LabelRanges = require("./label_ranges.js"); const Indexable = require("./indexable.js"); -const WitnessCol = require("./expression_items/witness_col.js"); +const WitnessColItem = require("./expression_items/witness_col.js"); +const WitnessCol = require("./definition_items/witness_col.js"); module.exports = class WitnessCols extends Indexable { constructor () { - super('witness', WitnessCol); + super('witness', WitnessCol, WitnessColItem); } getEmptyValue(id, options) { let _options = options ?? {}; diff --git a/test/pil2/vadcop-fibonacci/module.pil b/test/pil2/vadcop-fibonacci/module.pil index df9f928..6af5965 100644 --- a/test/pil2/vadcop-fibonacci/module.pil +++ b/test/pil2/vadcop-fibonacci/module.pil @@ -1,4 +1,4 @@ -constant MODULE_ID=1; +const int MODULE_ID = 1; subproof Module(2**16) { From d063c73e2ae5306d67b9886681a8711df3980fc6 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 19 Sep 2023 21:36:17 +0200 Subject: [PATCH 09/33] WIP refactoring --- build/pil_parser.js | 780 ++++++++++--------- src/assign.js | 1 + src/builtin/assert.js | 11 +- src/builtin/assert_eq.js | 10 +- src/builtin/assert_not_eq.js | 6 +- src/builtin/cast.js | 37 + src/builtin/defined.js | 4 +- src/builtin/is_array.js | 4 +- src/builtin/length.js | 6 +- src/builtin/println.js | 2 +- src/compiler.js | 2 +- src/context.js | 1 - src/definition_items.js | 4 +- src/definition_items/definition_item.js | 5 +- src/definition_items/expression.js | 17 + src/definition_items/expression_reference.js | 3 - src/definition_items/int_value.js | 4 + src/definition_items/string_value.js | 9 +- src/expression.js | 262 ++++--- src/expression_factory.js | 36 +- src/expression_items/expression_item.js | 11 +- src/expression_items/function_call.js | 20 +- src/expression_items/int_value.js | 77 +- src/expression_items/reference_item.js | 2 +- src/expression_items/runtime_item.js | 3 + src/expression_items/string_value.js | 24 +- src/expression_items/value_item.js | 10 +- src/expression_operations_info.js | 29 + src/expression_operator_methods.js | 23 + src/expressions.js | 1 - src/function.js | 33 +- src/indexable.js | 14 +- src/list.js | 3 +- src/pil_parser.jison | 50 +- src/processor.js | 54 +- src/reference.js | 7 +- src/references.js | 2 +- src/runtime.js | 5 +- test/pil2/collection/expressions.pil | 14 + 39 files changed, 982 insertions(+), 604 deletions(-) create mode 100644 src/builtin/cast.js create mode 100644 src/definition_items/expression.js delete mode 100644 src/definition_items/expression_reference.js create mode 100644 src/expression_operations_info.js create mode 100644 src/expression_operator_methods.js create mode 100644 test/pil2/collection/expressions.pil diff --git a/build/pil_parser.js b/build/pil_parser.js index 15436e5..38ebb9c 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -72,518 +72,524 @@ } */ var pil_parser = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,25,32,53,54,61,62,70,71,72,73,74,77,78,79,80,82,83,137,154],$V1=[1,39],$V2=[1,33],$V3=[1,34],$V4=[1,22],$V5=[1,35],$V6=[1,36],$V7=[1,37],$V8=[1,32],$V9=[1,24],$Va=[1,25],$Vb=[1,38],$Vc=[1,28],$Vd=[1,29],$Ve=[1,26],$Vf=[1,27],$Vg=[1,23],$Vh=[1,30],$Vi=[1,47],$Vj=[1,49],$Vk=[1,50],$Vl=[27,68,95,143],$Vm=[2,215],$Vn=[1,52],$Vo=[1,53],$Vp=[1,54],$Vq=[1,58],$Vr=[1,59],$Vs=[1,61],$Vt=[1,60],$Vu=[6,8,25,31,32,53,54,61,62,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],$Vv=[1,69],$Vw=[1,76],$Vx=[1,75],$Vy=[1,77],$Vz=[1,74],$VA=[1,82],$VB=[1,93],$VC=[1,122],$VD=[1,144],$VE=[1,143],$VF=[1,121],$VG=[2,39],$VH=[1,117],$VI=[1,138],$VJ=[1,118],$VK=[1,159],$VL=[1,155],$VM=[1,156],$VN=[1,157],$VO=[1,129],$VP=[1,158],$VQ=[1,142],$VR=[1,127],$VS=[1,128],$VT=[1,145],$VU=[1,146],$VV=[1,147],$VW=[1,148],$VX=[1,149],$VY=[1,150],$VZ=[1,134],$V_=[1,135],$V$=[1,152],$V01=[1,136],$V11=[1,130],$V21=[1,131],$V31=[1,132],$V41=[1,140],$V51=[1,154],$V61=[2,66],$V71=[1,178],$V81=[1,163],$V91=[1,166],$Va1=[1,167],$Vb1=[1,168],$Vc1=[1,169],$Vd1=[1,170],$Ve1=[1,171],$Vf1=[1,172],$Vg1=[1,173],$Vh1=[1,174],$Vi1=[1,175],$Vj1=[1,176],$Vk1=[1,177],$Vl1=[6,8,25,31,32,53,54,61,62,70,71,72,73,74,77,78,79,80,82,83,108,137,154],$Vm1=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vn1=[2,255],$Vo1=[1,191],$Vp1=[1,192],$Vq1=[6,8,25,31,32,53,54,57,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137,154],$Vr1=[6,8,25,31,32,53,54,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],$Vs1=[2,345],$Vt1=[2,55],$Vu1=[1,198],$Vv1=[1,199],$Vw1=[2,194],$Vx1=[6,8,25,31,32,53,54,59,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137,154],$Vy1=[2,191],$Vz1=[1,202],$VA1=[6,8,25,26,29,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VB1=[1,221],$VC1=[1,224],$VD1=[1,225],$VE1=[1,226],$VF1=[1,227],$VG1=[1,228],$VH1=[22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$VI1=[1,235],$VJ1=[8,31,108],$VK1=[1,243],$VL1=[1,237],$VM1=[1,238],$VN1=[1,239],$VO1=[1,240],$VP1=[1,241],$VQ1=[1,242],$VR1=[1,244],$VS1=[1,245],$VT1=[1,246],$VU1=[1,247],$VV1=[1,248],$VW1=[1,249],$VX1=[1,250],$VY1=[1,251],$VZ1=[1,252],$V_1=[1,253],$V$1=[1,254],$V02=[1,255],$V12=[1,256],$V22=[1,257],$V32=[1,258],$V42=[1,259],$V52=[8,22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$V62=[1,267],$V72=[1,269],$V82=[2,308],$V92=[1,273],$Va2=[1,274],$Vb2=[1,276],$Vc2=[1,277],$Vd2=[1,278],$Ve2=[1,279],$Vf2=[1,283],$Vg2=[1,282],$Vh2=[1,284],$Vi2=[1,286],$Vj2=[1,288],$Vk2=[1,301],$Vl2=[1,302],$Vm2=[1,300],$Vn2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vo2=[2,337],$Vp2=[1,309],$Vq2=[1,308],$Vr2=[1,311],$Vs2=[1,314],$Vt2=[1,317],$Vu2=[1,320],$Vv2=[6,8,25,31,32,47,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vw2=[49,64],$Vx2=[6,8,25,27,29,31,32,49,53,54,56,57,59,61,62,64,65,68,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vy2=[1,346],$Vz2=[1,357],$VA2=[1,358],$VB2=[59,64],$VC2=[1,380],$VD2=[49,59,64],$VE2=[8,22,25,27,29,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,121,123,129,137,141,142,143,154,170,171,172,178,180],$VF2=[1,414],$VG2=[1,418],$VH2=[1,419],$VI2=[27,32,47,62,68,70,71,72,74,78,95,121,123,141,142,143,170,171,172,178,180],$VJ2=[1,422],$VK2=[2,242],$VL2=[1,451],$VM2=[1,483],$VN2=[6,8,25,26,29,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,151,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VO2=[6,8,25,31,32,53,54,57,59,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137,154],$VP2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167],$VQ2=[6,8,25,29,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VR2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,154,162,163,167],$VS2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,154,163,167],$VT2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172],$VU2=[6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176],$VV2=[1,500],$VW2=[31,64],$VX2=[6,8,25,29,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VY2=[1,508],$VZ2=[1,510],$V_2=[2,42],$V$2=[8,107],$V03=[1,535],$V13=[1,576],$V23=[1,577],$V33=[1,580],$V43=[1,581],$V53=[1,582],$V63=[59,64,65],$V73=[2,241],$V83=[1,584],$V93=[8,31],$Va3=[6,8,25,31,32,47,49,53,54,56,57,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vb3=[31,59,64],$Vc3=[6,8,25,31,32,49,53,54,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],$Vd3=[56,59,64,65],$Ve3=[6,8,22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vf3=[1,674],$Vg3=[1,681],$Vh3=[1,682],$Vi3=[1,716],$Vj3=[56,64],$Vk3=[31,116,119]; +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,24,31,55,56,61,62,70,71,72,73,74,77,78,79,80,82,83,137],$V1=[1,37],$V2=[1,31],$V3=[1,32],$V4=[1,21],$V5=[1,33],$V6=[1,34],$V7=[1,35],$V8=[1,30],$V9=[1,23],$Va=[1,24],$Vb=[1,36],$Vc=[1,27],$Vd=[1,28],$Ve=[1,25],$Vf=[1,26],$Vg=[1,22],$Vh=[1,45],$Vi=[1,47],$Vj=[1,48],$Vk=[26,68,95,143],$Vl=[2,215],$Vm=[1,50],$Vn=[1,51],$Vo=[1,52],$Vp=[1,56],$Vq=[1,57],$Vr=[1,59],$Vs=[1,58],$Vt=[6,8,24,30,31,55,56,61,62,70,71,72,73,74,77,78,79,80,82,83,107,108,137],$Vu=[1,66],$Vv=[1,73],$Vw=[1,72],$Vx=[1,74],$Vy=[1,71],$Vz=[1,79],$VA=[1,90],$VB=[1,119],$VC=[1,142],$VD=[1,141],$VE=[1,118],$VF=[2,38],$VG=[1,114],$VH=[1,135],$VI=[1,115],$VJ=[1,157],$VK=[1,153],$VL=[1,154],$VM=[1,155],$VN=[1,126],$VO=[1,156],$VP=[1,139],$VQ=[1,124],$VR=[1,125],$VS=[1,143],$VT=[1,144],$VU=[1,145],$VV=[1,146],$VW=[1,147],$VX=[1,148],$VY=[1,131],$VZ=[1,132],$V_=[1,150],$V$=[1,133],$V01=[1,140],$V11=[1,127],$V21=[1,128],$V31=[1,129],$V41=[1,137],$V51=[1,152],$V61=[2,67],$V71=[1,176],$V81=[1,161],$V91=[1,164],$Va1=[1,165],$Vb1=[1,166],$Vc1=[1,167],$Vd1=[1,168],$Ve1=[1,169],$Vf1=[1,170],$Vg1=[1,171],$Vh1=[1,172],$Vi1=[1,173],$Vj1=[1,174],$Vk1=[1,175],$Vl1=[6,8,24,30,31,55,56,61,62,70,71,72,73,74,77,78,79,80,82,83,108,137],$Vm1=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vn1=[2,255],$Vo1=[1,189],$Vp1=[1,190],$Vq1=[6,8,24,30,31,51,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137],$Vr1=[6,8,24,30,31,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137],$Vs1=[2,345],$Vt1=[2,56],$Vu1=[1,194],$Vv1=[1,195],$Vw1=[2,194],$Vx1=[6,8,24,30,31,53,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137],$Vy1=[2,191],$Vz1=[1,198],$VA1=[6,8,24,25,28,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VB1=[1,217],$VC1=[1,220],$VD1=[1,221],$VE1=[1,222],$VF1=[1,223],$VG1=[1,224],$VH1=[21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$VI1=[1,231],$VJ1=[8,30,108],$VK1=[1,239],$VL1=[1,233],$VM1=[1,234],$VN1=[1,235],$VO1=[1,236],$VP1=[1,237],$VQ1=[1,238],$VR1=[1,240],$VS1=[1,241],$VT1=[1,242],$VU1=[1,243],$VV1=[1,244],$VW1=[1,245],$VX1=[1,246],$VY1=[1,247],$VZ1=[1,248],$V_1=[1,249],$V$1=[1,250],$V02=[1,251],$V12=[1,252],$V22=[1,253],$V32=[1,254],$V42=[1,255],$V52=[8,21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$V62=[1,265],$V72=[1,267],$V82=[2,308],$V92=[1,271],$Va2=[1,272],$Vb2=[1,274],$Vc2=[1,275],$Vd2=[1,276],$Ve2=[1,277],$Vf2=[1,281],$Vg2=[1,280],$Vh2=[1,282],$Vi2=[1,284],$Vj2=[1,286],$Vk2=[1,300],$Vl2=[1,301],$Vm2=[1,299],$Vn2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vo2=[2,337],$Vp2=[1,308],$Vq2=[1,307],$Vr2=[1,310],$Vs2=[1,313],$Vt2=[1,316],$Vu2=[1,319],$Vv2=[6,8,24,30,31,46,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vw2=[48,64],$Vx2=[6,8,24,26,28,30,31,48,51,53,55,56,58,61,62,64,65,68,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vy2=[1,345],$Vz2=[1,354],$VA2=[1,355],$VB2=[53,64],$VC2=[1,377],$VD2=[48,53,64],$VE2=[8,21,24,26,28,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,121,123,129,137,141,142,143,154,170,171,172,178,180],$VF2=[1,411],$VG2=[1,415],$VH2=[1,416],$VI2=[1,421],$VJ2=[1,422],$VK2=[26,31,46,62,68,70,71,72,74,78,95,121,123,141,142,143,170,171,172,178,180],$VL2=[1,425],$VM2=[2,242],$VN2=[1,456],$VO2=[1,487],$VP2=[6,8,24,25,28,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,151,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VQ2=[6,8,24,30,31,51,53,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137],$VR2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167],$VS2=[6,8,24,28,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VT2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,162,163,167],$VU2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,163,167],$VV2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172],$VW2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176],$VX2=[1,504],$VY2=[30,64],$VZ2=[1,507],$V_2=[30,53,64],$V$2=[6,8,24,28,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$V03=[1,516],$V13=[1,518],$V23=[2,41],$V33=[8,107],$V43=[1,544],$V53=[1,589],$V63=[1,590],$V73=[1,591],$V83=[53,64,65],$V93=[2,241],$Va3=[1,593],$Vb3=[8,30],$Vc3=[6,8,24,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vd3=[6,8,24,30,31,48,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137],$Ve3=[53,58,64,65],$Vf3=[6,8,21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vg3=[1,678],$Vh3=[1,685],$Vi3=[1,686],$Vj3=[1,719],$Vk3=[58,64],$Vl3=[30,116,119]; var parser = {trace: function trace () { Jison.print.apply(null, arguments); }, yy: {}, -symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"constant_definition":19,"variable_declaration":20,"use_directive":21,"USE":22,"name_reference":23,"no_closed_container_definition":24,"CONTAINER":25,"ALIAS":26,"IDENTIFIER":27,"closed_container_definition":28,"{":29,"declare_block":30,"}":31,"PROOF":32,"statement_block":33,"non_delimited_statement":34,"statement_closed":35,"lcs":36,"statement_no_closed":37,"statement_list":38,"statement_list_closed":39,"declare_list":40,"when_boundary":41,"FIRST":42,"LAST":43,"FRAME":44,"codeblock_closed":45,"WHEN":46,"(":47,"expression":48,")":49,"METADATA":50,"data_object":51,"function":52,"FUNCTION":53,"PRIVATE":54,"arguments":55,":":56,"[":57,"return_type_list":58,"]":59,"return_type":60,"FINAL":61,"SUBPROOF":62,"arguments_list":63,",":64,"DOTS_FILL":65,"argument":66,"basic_type":67,"REFERENCE":68,"type_array":69,"INT":70,"FE":71,"EXPR":72,"CONST":73,"COL":74,"WITNESS":75,"FIXED":76,"CHALLENGE":77,"T_STRING":78,"PROOF_VALUE":79,"SUBPROOF_VALUE":80,"AIR_VALUE":81,"PUBLIC":82,"PUBLIC_TABLE":83,"declare_item":84,"codeblock_no_closed":85,"===":86,"delayed_function_call":87,"data_value":88,"data_array":89,"function_call":90,"name_optional_index":91,"multiple_expression_list":92,"delayed_function_event":93,"defined_scopes":94,"AIR":95,"ON":96,"variable_assignment":97,"variable_multiple_assignment":98,"return_statement":99,"CONTINUE":100,"BREAK":101,"in_expression":102,"expression_list":103,"FOR":104,"for_init":105,"variable_assignment_list":106,"IN":107,"WHILE":108,"DO":109,"ONCE":110,"SWITCH":111,"case_body":112,"IF":113,"ELSE":114,"case_list":115,"DEFAULT":116,"case_value":117,"DOTS_RANGE":118,"CASE":119,"for_assignation":120,"INC":121,"name_id":122,"DEC":123,"variable_type_declaration":124,"variable_declaration_list":125,"variable_declaration_item":126,"=":127,"variable_declaration_array":128,"RETURN":129,"assign_operation":130,"+=":131,"-=":132,"*=":133,"left_variable_multiple_assignment_list":134,"left_variable_multiple_assignment":135,"sequence_definition":136,"INCLUDE":137,"flexible_string":138,"stage_definition":139,"STAGE":140,"NUMBER":141,"STRING":142,"TEMPLATE_STRING":143,"sequence_list":144,"sequence":145,"DOTS_ARITH_SEQ":146,"DOTS_GEOM_SEQ":147,"declaration_array":148,"col_declaration_item":149,"col_declaration_ident":150,".":151,"col_declaration_list":152,"AGGREGATE":153,"CONSTANT":154,"EQ":155,"NE":156,"LT":157,"GT":158,"LE":159,"GE":160,"IS":161,"AND":162,"?":163,"B_AND":164,"B_OR":165,"B_XOR":166,"OR":167,"SHL":168,"SHR":169,"!":170,"+":171,"-":172,"*":173,"%":174,"/":175,"\\\\":176,"POW":177,"POSITIONAL_PARAM":178,"casting":179,"'":180,"array_index":181,"name_reference_right":182,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"EOF",8:"CS",22:"USE",25:"CONTAINER",26:"ALIAS",27:"IDENTIFIER",29:"{",31:"}",32:"PROOF",42:"FIRST",43:"LAST",44:"FRAME",46:"WHEN",47:"(",49:")",50:"METADATA",53:"FUNCTION",54:"PRIVATE",56:":",57:"[",59:"]",61:"FINAL",62:"SUBPROOF",64:",",65:"DOTS_FILL",68:"REFERENCE",70:"INT",71:"FE",72:"EXPR",73:"CONST",74:"COL",75:"WITNESS",76:"FIXED",77:"CHALLENGE",78:"T_STRING",79:"PROOF_VALUE",80:"SUBPROOF_VALUE",81:"AIR_VALUE",82:"PUBLIC",83:"PUBLIC_TABLE",86:"===",95:"AIR",96:"ON",100:"CONTINUE",101:"BREAK",104:"FOR",107:"IN",108:"WHILE",109:"DO",110:"ONCE",111:"SWITCH",113:"IF",114:"ELSE",116:"DEFAULT",118:"DOTS_RANGE",119:"CASE",121:"INC",123:"DEC",127:"=",129:"RETURN",131:"+=",132:"-=",133:"*=",137:"INCLUDE",140:"STAGE",141:"NUMBER",142:"STRING",143:"TEMPLATE_STRING",146:"DOTS_ARITH_SEQ",147:"DOTS_GEOM_SEQ",151:".",153:"AGGREGATE",154:"CONSTANT",155:"EQ",156:"NE",157:"LT",158:"GT",159:"LE",160:"GE",161:"IS",162:"AND",163:"?",164:"B_AND",165:"B_OR",166:"B_XOR",167:"OR",168:"SHL",169:"SHR",170:"!",171:"+",172:"-",173:"*",174:"%",175:"/",176:"\\\\",177:"POW",178:"POSITIONAL_PARAM",180:"'"}, -productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[21,2],[24,2],[24,4],[28,5],[28,7],[10,4],[34,1],[34,2],[34,1],[34,2],[38,1],[38,2],[38,1],[39,2],[39,3],[39,3],[39,1],[39,2],[39,2],[39,1],[33,1],[33,0],[30,1],[30,2],[30,0],[36,2],[36,1],[41,1],[41,1],[41,1],[35,1],[35,5],[35,3],[35,4],[35,1],[35,1],[35,3],[52,2],[52,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[55,1],[55,3],[55,1],[55,0],[63,3],[63,1],[66,2],[66,2],[66,3],[66,3],[67,1],[67,1],[67,1],[67,2],[67,2],[67,2],[67,2],[67,2],[67,1],[67,1],[67,2],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[58,3],[58,1],[69,3],[69,2],[60,1],[60,2],[40,3],[40,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[37,1],[37,1],[37,1],[37,1],[37,3],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[88,1],[88,3],[88,3],[51,5],[51,3],[51,3],[51,1],[89,3],[89,1],[90,4],[93,1],[94,1],[94,1],[94,1],[87,7],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[102,1],[102,3],[45,9],[45,7],[45,5],[45,6],[45,6],[45,3],[45,5],[45,5],[45,7],[112,3],[112,5],[117,3],[117,5],[117,1],[117,3],[115,5],[115,4],[120,1],[120,2],[120,2],[120,2],[120,2],[105,1],[105,1],[105,1],[105,1],[20,1],[20,2],[124,2],[124,2],[124,2],[124,2],[124,2],[124,4],[124,4],[124,4],[124,4],[124,4],[124,4],[124,8],[124,8],[124,8],[124,8],[124,8],[128,2],[128,3],[128,3],[128,4],[126,1],[126,2],[125,3],[125,1],[99,1],[99,2],[99,4],[130,1],[130,1],[130,1],[130,1],[134,3],[134,2],[134,1],[135,3],[135,5],[98,3],[98,5],[97,3],[97,3],[106,3],[106,1],[12,2],[139,4],[139,0],[138,1],[138,1],[136,3],[136,4],[136,5],[136,6],[144,3],[144,5],[144,5],[144,5],[144,9],[144,9],[144,4],[144,4],[144,6],[144,6],[144,1],[144,3],[145,3],[145,3],[145,5],[145,5],[145,7],[145,2],[145,3],[145,1],[92,0],[92,3],[92,5],[92,3],[92,1],[103,4],[103,3],[103,2],[103,1],[148,2],[148,3],[148,3],[148,4],[149,1],[149,2],[150,1],[150,1],[150,1],[150,3],[150,3],[152,3],[152,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[19,4],[19,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,2],[48,1],[48,2],[48,2],[48,2],[48,2],[48,1],[48,1],[48,3],[48,1],[48,1],[48,1],[179,4],[179,4],[179,4],[179,4],[179,4],[179,5],[179,5],[179,5],[179,5],[179,5],[122,2],[122,3],[122,5],[122,3],[122,2],[122,3],[122,5],[122,3],[122,1],[91,1],[91,2],[181,4],[181,3],[23,3],[23,3],[23,3],[23,1],[23,3],[23,1],[23,3],[182,3],[182,3],[182,1],[182,1]], +symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"variable_declaration":19,"use_directive":20,"USE":21,"name_reference":22,"no_closed_container_definition":23,"CONTAINER":24,"ALIAS":25,"IDENTIFIER":26,"closed_container_definition":27,"{":28,"declare_block":29,"}":30,"PROOF":31,"statement_block":32,"non_delimited_statement":33,"statement_closed":34,"lcs":35,"statement_no_closed":36,"statement_list":37,"statement_list_closed":38,"declare_list":39,"when_boundary":40,"FIRST":41,"LAST":42,"FRAME":43,"codeblock_closed":44,"WHEN":45,"(":46,"expression":47,")":48,"HINT":49,"data_object":50,"[":51,"data_array":52,"]":53,"function":54,"FUNCTION":55,"PRIVATE":56,"arguments":57,":":58,"return_type_list":59,"return_type":60,"FINAL":61,"SUBPROOF":62,"arguments_list":63,",":64,"DOTS_FILL":65,"argument":66,"basic_type":67,"REFERENCE":68,"type_array":69,"INT":70,"FE":71,"EXPR":72,"CONST":73,"COL":74,"WITNESS":75,"FIXED":76,"CHALLENGE":77,"T_STRING":78,"PROOF_VALUE":79,"SUBPROOF_VALUE":80,"AIR_VALUE":81,"PUBLIC":82,"PUBLIC_TABLE":83,"declare_item":84,"codeblock_no_closed":85,"===":86,"delayed_function_call":87,"constant_definition":88,"data_value":89,"function_call":90,"name_optional_index":91,"multiple_expression_list":92,"delayed_function_event":93,"defined_scopes":94,"AIR":95,"ON":96,"variable_assignment":97,"variable_multiple_assignment":98,"return_statement":99,"CONTINUE":100,"BREAK":101,"in_expression":102,"expression_list":103,"FOR":104,"for_init":105,"variable_assignment_list":106,"IN":107,"WHILE":108,"DO":109,"ONCE":110,"SWITCH":111,"case_body":112,"IF":113,"ELSE":114,"case_list":115,"DEFAULT":116,"case_value":117,"DOTS_RANGE":118,"CASE":119,"for_assignation":120,"INC":121,"name_id":122,"DEC":123,"variable_type_declaration":124,"variable_declaration_list":125,"variable_declaration_item":126,"=":127,"variable_declaration_array":128,"RETURN":129,"assign_operation":130,"+=":131,"-=":132,"*=":133,"left_variable_multiple_assignment_list":134,"left_variable_multiple_assignment":135,"sequence_definition":136,"INCLUDE":137,"flexible_string":138,"stage_definition":139,"STAGE":140,"NUMBER":141,"STRING":142,"TEMPLATE_STRING":143,"sequence_list":144,"sequence":145,"DOTS_ARITH_SEQ":146,"DOTS_GEOM_SEQ":147,"declaration_array":148,"col_declaration_item":149,"col_declaration_ident":150,".":151,"col_declaration_list":152,"AGGREGATE":153,"CONSTANT":154,"EQ":155,"NE":156,"LT":157,"GT":158,"LE":159,"GE":160,"IS":161,"AND":162,"?":163,"B_AND":164,"B_OR":165,"B_XOR":166,"OR":167,"SHL":168,"SHR":169,"!":170,"+":171,"-":172,"*":173,"%":174,"/":175,"\\\\":176,"POW":177,"POSITIONAL_PARAM":178,"casting":179,"'":180,"array_index":181,"name_reference_right":182,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"EOF",8:"CS",21:"USE",24:"CONTAINER",25:"ALIAS",26:"IDENTIFIER",28:"{",30:"}",31:"PROOF",41:"FIRST",42:"LAST",43:"FRAME",45:"WHEN",46:"(",48:")",49:"HINT",51:"[",53:"]",55:"FUNCTION",56:"PRIVATE",58:":",61:"FINAL",62:"SUBPROOF",64:",",65:"DOTS_FILL",68:"REFERENCE",70:"INT",71:"FE",72:"EXPR",73:"CONST",74:"COL",75:"WITNESS",76:"FIXED",77:"CHALLENGE",78:"T_STRING",79:"PROOF_VALUE",80:"SUBPROOF_VALUE",81:"AIR_VALUE",82:"PUBLIC",83:"PUBLIC_TABLE",86:"===",95:"AIR",96:"ON",100:"CONTINUE",101:"BREAK",104:"FOR",107:"IN",108:"WHILE",109:"DO",110:"ONCE",111:"SWITCH",113:"IF",114:"ELSE",116:"DEFAULT",118:"DOTS_RANGE",119:"CASE",121:"INC",123:"DEC",127:"=",129:"RETURN",131:"+=",132:"-=",133:"*=",137:"INCLUDE",140:"STAGE",141:"NUMBER",142:"STRING",143:"TEMPLATE_STRING",146:"DOTS_ARITH_SEQ",147:"DOTS_GEOM_SEQ",151:".",153:"AGGREGATE",154:"CONSTANT",155:"EQ",156:"NE",157:"LT",158:"GT",159:"LE",160:"GE",161:"IS",162:"AND",163:"?",164:"B_AND",165:"B_OR",166:"B_XOR",167:"OR",168:"SHL",169:"SHR",170:"!",171:"+",172:"-",173:"*",174:"%",175:"/",176:"\\\\",177:"POW",178:"POSITIONAL_PARAM",180:"'"}, +productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[20,2],[23,2],[23,4],[27,5],[27,7],[10,4],[33,1],[33,2],[33,1],[33,2],[37,1],[37,2],[37,1],[38,2],[38,3],[38,3],[38,1],[38,2],[38,2],[38,1],[32,1],[32,0],[29,1],[29,2],[29,0],[35,2],[35,1],[40,1],[40,1],[40,1],[34,1],[34,5],[34,3],[34,4],[34,4],[34,3],[34,1],[34,1],[34,3],[54,2],[54,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[57,1],[57,3],[57,1],[57,0],[63,3],[63,1],[66,2],[66,2],[66,3],[66,3],[67,1],[67,1],[67,1],[67,2],[67,2],[67,2],[67,2],[67,2],[67,1],[67,1],[67,2],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[59,3],[59,1],[69,3],[69,2],[60,1],[60,2],[39,3],[39,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[36,1],[36,1],[36,1],[36,1],[36,3],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[89,1],[89,3],[89,3],[50,5],[50,3],[50,3],[50,1],[52,3],[52,1],[90,4],[93,1],[94,1],[94,1],[94,1],[87,7],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[102,1],[102,3],[44,9],[44,7],[44,5],[44,6],[44,6],[44,3],[44,5],[44,5],[44,7],[112,3],[112,5],[117,3],[117,5],[117,1],[117,3],[115,5],[115,4],[120,1],[120,2],[120,2],[120,2],[120,2],[105,1],[105,1],[105,1],[105,1],[19,1],[19,2],[124,2],[124,2],[124,2],[124,2],[124,2],[124,4],[124,4],[124,4],[124,4],[124,4],[124,4],[124,8],[124,8],[124,8],[124,8],[124,8],[128,2],[128,3],[128,3],[128,4],[126,1],[126,2],[125,3],[125,1],[99,1],[99,2],[99,4],[130,1],[130,1],[130,1],[130,1],[134,3],[134,2],[134,1],[135,3],[135,5],[98,3],[98,5],[97,3],[97,3],[106,3],[106,1],[12,2],[139,4],[139,0],[138,1],[138,1],[136,3],[136,4],[136,5],[136,6],[144,3],[144,5],[144,5],[144,5],[144,9],[144,9],[144,4],[144,4],[144,6],[144,6],[144,1],[144,3],[145,3],[145,3],[145,5],[145,5],[145,7],[145,2],[145,3],[145,1],[92,0],[92,3],[92,5],[92,3],[92,1],[103,4],[103,3],[103,2],[103,1],[148,2],[148,3],[148,3],[148,4],[149,1],[149,2],[150,1],[150,1],[150,1],[150,3],[150,3],[152,3],[152,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[88,4],[88,5],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,5],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,2],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,2],[47,2],[47,1],[47,2],[47,2],[47,2],[47,2],[47,1],[47,1],[47,3],[47,1],[47,1],[47,1],[179,4],[179,4],[179,4],[179,4],[179,4],[179,5],[179,5],[179,5],[179,5],[179,5],[122,2],[122,3],[122,5],[122,3],[122,2],[122,3],[122,5],[122,3],[122,1],[91,1],[91,2],[181,4],[181,3],[22,3],[22,3],[22,3],[22,1],[22,3],[22,1],[22,3],[182,3],[182,3],[182,1],[182,1]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { /* this == yyval */ var $0 = $$.length - 1; switch (yystate) { case 1: - this.$ = $$[$0-2]; return this.$; + this.$ = $$[$0-2]; return this.$; break; case 2: - this.$ = [...$$[$0-2], $$[$0]] + this.$ = [...$$[$0-2], $$[$0]] break; case 3: - this.$ = [] + this.$ = [] break; -case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 28: case 30: case 52: case 53: case 63: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 107: case 108: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 130: case 131: case 132: case 133: case 135: case 136: case 138: case 141: case 160: case 166: case 167: case 168: case 191: case 241: case 255: case 306: case 337: - this.$ = $$[$0] +case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 27: case 29: case 53: case 54: case 64: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 107: case 108: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 130: case 131: case 132: case 133: case 135: case 136: case 138: case 141: case 160: case 166: case 167: case 168: case 191: case 241: case 255: case 306: case 337: + this.$ = $$[$0] +break; +case 17: + this.$ = { type: 'use', name: $$[$0].name } break; case 18: - this.$ = { type: 'use', name: $$[$0].name } + this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } break; case 19: - this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } + this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } break; case 20: - this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } + this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } break; case 21: - this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } break; case 22: - this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'proof', statements: $$[$0-1].statements } break; -case 23: - this.$ = { type: 'proof', statements: $$[$0-1].statements } +case 23: case 37: case 39: case 165: + this.$ = $$[$0]; break; -case 24: case 38: case 40: case 165: - this.$ = $$[$0]; +case 24: case 40: + this.$ = $$[$0-1]; break; -case 25: case 41: - this.$ = $$[$0-1]; +case 26: case 121: case 122: case 142: case 152: case 315: + this.$ = $$[$0-1] break; -case 27: case 121: case 142: case 152: case 315: - this.$ = $$[$0-1] +case 28: + this.$ = $$[$0-1]; this.$.statements.push($$[$0]); break; -case 29: - this.$ = $$[$0-1]; this.$.statements.push($$[$0]); +case 30: + this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } break; -case 31: - this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } +case 31: case 32: + this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } break; -case 32: case 33: - this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } +case 33: case 98: case 212: + this.$ = { statements: [$$[$0]] } break; -case 34: case 97: case 212: - this.$ = { statements: [$$[$0]] } +case 34: case 35: + this.$ = { statements: [$$[$0-1]] } break; -case 35: case 36: - this.$ = { statements: [$$[$0-1]] } +case 44: + this.$ = { boundary: 'first' } break; case 45: - this.$ = { boundary: 'first' } + this.$ = { boundary: 'last' } break; case 46: - this.$ = { boundary: 'last' } + this.$ = { boundary: 'frame' } break; case 47: - this.$ = { boundary: 'frame' } + this.$ = { type: 'code', statements: $$[$0] }; break; case 48: - this.$ = { type: 'code', statements: $$[$0] }; + this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } break; case 49: - this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } + this.$ = { ...$$[$0-1], type: 'when', statements: $$[$0] } break; case 50: - this.$ = { ...$$[$0-1], type: "when", statements: $$[$0] } + this.$ = { type: 'hint', name: $$[$0-3], data: $$[$0-1] } break; case 51: - this.$ = { type: 'metadata', data: $$[$0-1] } + this.$ = { type: 'hint', name: $$[$0-3], data: $$[$0-1] } break; -case 54: - this.$ = { type: 'scope_definition', ...$$[$0-1] }; +case 52: + this.$ = { type: 'hint', name: $$[$0-2], data: $$[$0-1] } break; case 55: - this.$ = {private: false, funcname: $$[$0]} + this.$ = { type: 'scope_definition', ...$$[$0-1] }; break; case 56: - this.$ = {private: true, funcname: $$[$0]} + this.$ = {private: false, funcname: $$[$0]} break; case 57: - this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } + this.$ = {private: true, funcname: $$[$0]} break; case 58: - this.$ = { ...$$[$0-8], type: 'function_definition', final: false, ...$$[$0-6], returns: $$[$0-3], ...$$[$0-1] } + this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } break; case 59: - this.$ = { ...$$[$0-6], type: 'function_definition', final: false, ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-8], type: 'function_definition', final: false, ...$$[$0-6], returns: $$[$0-3], ...$$[$0-1] } break; case 60: - this.$ = { ...$$[$0-6], type: 'function_definition', final: 'air', ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-6], type: 'function_definition', final: false, ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 61: - this.$ = { ...$$[$0-6], type: 'function_definition', final: 'proof', ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-6], type: 'function_definition', final: 'air', ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 62: - this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } + this.$ = { ...$$[$0-6], type: 'function_definition', final: 'proof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 64: - this.$ = $$[$0-2]; this.$.vargs = true +case 63: + this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; case 65: - this.$ = { args: [], varargs: false } + this.$ = $$[$0-2]; this.$.vargs = true break; case 66: this.$ = { args: [], varargs: false } break; case 67: - this.$ = $$[$0-2]; this.$.args.push($$[$0]) + this.$ = { args: [], varargs: false } break; case 68: - this.$ = { args: [ $$[$0] ] } + this.$ = $$[$0-2]; this.$.args.push($$[$0]) break; case 69: - this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } + this.$ = { args: [ $$[$0] ] } break; case 70: - this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } + this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } break; case 71: - this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } + this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } break; case 72: - this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } + this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } break; case 73: - this.$ = { type: 'int' } + this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } break; case 74: - this.$ = { type: 'fe' } + this.$ = { type: 'int' } break; case 75: - this.$ = { type: 'expr' } + this.$ = { type: 'fe' } break; case 76: - this.$ = { type: 'int', const: true } + this.$ = { type: 'expr' } break; case 77: - this.$ = { type: 'fe', const: true } + this.$ = { type: 'int', const: true } break; case 78: - this.$ = { type: 'expr', const: true } + this.$ = { type: 'fe', const: true } break; case 79: - this.$ = { type: 'witness' } + this.$ = { type: 'expr', const: true } break; case 80: - this.$ = { type: 'fixed' } + this.$ = { type: 'witness' } break; case 81: - this.$ = { type: 'challenge' } + this.$ = { type: 'fixed' } break; case 82: - this.$ = { type: 'string' } + this.$ = { type: 'challenge' } break; case 83: - this.$ = { type: 'string', const: true } + this.$ = { type: 'string' } break; case 84: - this.$ = { type: 'proof' } + this.$ = { type: 'string', const: true } break; case 85: - this.$ = { type: 'subproof' } + this.$ = { type: 'proof' } break; case 86: - this.$ = { type: 'air' } + this.$ = { type: 'subproof' } break; case 87: - this.$ = { type: 'public' } + this.$ = { type: 'air' } break; case 88: - this.$ = { type: 'publicTable' } + this.$ = { type: 'public' } break; case 89: - this.$ = { type: 'function' } + this.$ = { type: 'publicTable' } break; case 90: - this.$ = {returns: [...$$[$0-2], $$[$0]]} + this.$ = { type: 'function' } break; case 91: - this.$.returns = [$$[$0]] + this.$ = {returns: [...$$[$0-2], $$[$0]]} break; case 92: - this.$ = {dim: $$[$0-2].dim + 1} + this.$.returns = [$$[$0]] break; case 93: - this.$ = {dim: 1} + this.$ = {dim: $$[$0-2].dim + 1} break; case 94: - this.$ = { type: $$[$0].type, dim: 0 } + this.$ = {dim: 1} break; case 95: - this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } + this.$ = { type: $$[$0].type, dim: 0 } +break; +case 96: + this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } break; -case 96: case 211: - this.$ = $$[$0-2]; this.$.statements.push($$[$0]); +case 97: case 211: + this.$ = $$[$0-2]; this.$.statements.push($$[$0]); break; case 106: - this.$ = { type: 'code', statements: $$[$0] } + this.$ = { type: 'code', statements: $$[$0] } break; case 109: - this.$ = { type: 'expr', expr: $$[$0] } + this.$ = { type: 'expr', expr: $$[$0] } break; case 110: - this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } -break; -case 122: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = $$[$02] + this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } break; case 123: - this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] + this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] break; case 124: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $$[$0] }) break; case 125: - this.$ = {data: {}}; this.$.data[$$[$0-2]] = $$[$0] + this.$ = { type: 'object', data: {}}; this.$.data[$$[$0-2]] = $$[$0] break; case 126: - this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $$[$0] }) + this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $$[$0] }) break; -case 127: case 154: case 222: case 243: case 248: - this.$ = $$[$0-2]; this.$.values.push($$[$0]) +case 127: + this.$ = $$[$0-2]; this.$.data.push($$[$0]) break; case 128: - this.$ = { values: [ $$[$0] ]} + this.$ = { type: 'array', data: [ $$[$0] ] } break; case 129: - this.$ = { op: 'call', function: $$[$0-3], arguments: $$[$0-1].values } + this.$ = { type: 'call', function: $$[$0-3], args: $$[$0-1].values } break; case 134: - this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], arguments: $$[$0-1].values } + this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], args: $$[$0-1].values } break; case 137: - this.$ = {...$$[$0], ...$$[$01]} + this.$ = {...$$[$0], ...$$[$01]} break; case 139: - this.$ = { type: 'continue' } + this.$ = { type: 'continue' } break; case 140: - this.$ = { type: 'break' } + this.$ = { type: 'break' } break; case 143: - this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } + this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } break; case 144: - this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } + this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } break; case 145: - this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } + this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } break; case 146: case 147: - this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } + this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } break; case 148: - this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } + this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } break; case 149: - this.$ = $$[$0-4] + this.$ = $$[$0-4] break; case 150: - this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } + this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } break; case 151: - this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} + this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} break; case 153: - this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) + this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) +break; +case 154: case 222: case 243: case 248: + this.$ = $$[$0-2]; this.$.values.push($$[$0]) break; case 155: - this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) + this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) break; case 156: - this.$ = { values: [$$[$0]] } + this.$ = { values: [$$[$0]] } break; case 157: - this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } + this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } break; case 158: - this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) + this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) break; case 159: - this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} + this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} break; case 161: - this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } + this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } break; case 162: - this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } + this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } break; case 163: - this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } + this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } break; case 164: - this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } + this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } break; case 169: - this.$ = {...$$[$0], const: false} + this.$ = {...$$[$0], const: false} break; case 170: - this.$ = {...$$[$0], const: true } + this.$ = {...$$[$0], const: true } break; case 171: - this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } break; case 172: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } break; case 173: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } break; case 174: - this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } break; case 175: - this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } + this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } break; case 176: - this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } break; case 177: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } break; case 178: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } break; case 179: - this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } break; case 180: - this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } break; case 181: - this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } + this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } break; case 182: - this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } break; case 183: - this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } break; case 184: - this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } break; case 185: - this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } break; case 186: - this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } + this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } break; case 187: - this.$ = { dim: 1, lengths: [null]} + this.$ = { dim: 1, lengths: [null]} break; case 188: - this.$ = { dim: 1, lengths: [$$[$0-1]]} + this.$ = { dim: 1, lengths: [$$[$0-1]]} break; case 189: - this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) + this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) break; case 190: - this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) + this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) break; case 192: case 339: - this.$ = { ...$$[$0-1], ...$$[$0] } + this.$ = { ...$$[$0-1], ...$$[$0] } break; case 193: - this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); + this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); break; case 194: - this.$ = {items: [{...$$[$0], _d_:2}]} + this.$ = {items: [{...$$[$0], _d_:2}]} break; case 195: - this.$ = { type: 'return', value: null } + this.$ = { type: 'return', value: null } break; case 196: - this.$ = { type: 'return', value: $$[$0] } + this.$ = { type: 'return', value: $$[$0] } break; case 197: - this.$ = { type: 'return', values: $$[$0-1] } + this.$ = { type: 'return', values: $$[$0-1] } break; case 198: - this.$ = { type: 'assign' } + this.$ = { type: 'assign' } break; case 199: - this.$ = { type: 'increment' } + this.$ = { type: 'increment' } break; case 200: - this.$ = { type: 'substract' } + this.$ = { type: 'substract' } break; case 201: - this.$ = { type: 'product' } + this.$ = { type: 'product' } break; case 202: - this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) + this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) break; case 203: - this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) + this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) break; case 204: - this.$ = { names: [$$[$0]] } + this.$ = { names: [$$[$0]] } break; case 205: - this.$ = $$[$0-2] + this.$ = $$[$0-2] break; case 206: - this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) + this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) break; case 207: - this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } + this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } break; case 208: - this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } + this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } break; case 209: - this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } break; case 210: - this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } break; case 213: - this.$ = { type: 'include', file: $$[$0] } + this.$ = { type: 'include', file: $$[$0] } break; case 214: - this.$ = { stage: $$[$0-1] } + this.$ = { stage: $$[$0-1] } break; case 215: - this.$ = { stage: DEFAULT_STAGE } + this.$ = { stage: DEFAULT_STAGE } break; case 216: - this.$ = { type: 'string', value: $$[$0] } + this.$ = { type: 'string', value: $$[$0] } break; case 217: - this.$ = { type: 'string', template: true, value: $$[$0] } + this.$ = { type: 'string', template: true, value: $$[$0] } break; case 218: - this.$ = {type: 'sequence', values: $$[$0-1].values} + this.$ = {type: 'sequence', values: $$[$0-1].values} break; case 219: - this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } + this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } break; case 220: - this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} + this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} break; case 221: - this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} + this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} break; case 223: - this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) break; case 224: - this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; case 225: - this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) + this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; case 226: this.$ = $$[$0-8]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, - tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) + tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; case 227: this.$ = $$[$0-8]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, - tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) + tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; case 228: - this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) + this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; case 229: - this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) + this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; case 230: this.$ = $$[$0-5]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, - tn: false}) + tn: false}) break; case 231: this.$ = $$[$0-5]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, - tn: false}) + tn: false}) break; case 232: - this.$ = { type: 'seq_list', values: [$$[$0]] } + this.$ = { type: 'seq_list', values: [$$[$0]] } break; case 233: - this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } + this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } break; case 234: - this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} + this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} break; case 235: - this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} + this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} break; case 236: - this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} + this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} break; case 237: this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0], times: $$[$0-2]} @@ -592,306 +598,306 @@ case 238: this.$ = {type: 'range_seq', from: $$[$0-6], to: $$[$0-2], times: $$[$0-4], toTimes: $$[$0]} break; case 239: - this.$ = {type: 'padding_seq', value: $$[$0-1]} + this.$ = {type: 'padding_seq', value: $$[$0-1]} break; case 240: - this.$ = {type: 'seq_list', values: [$$[$0-1]]} + this.$ = {type: 'seq_list', values: [$$[$0-1]]} break; case 242: - this.$ = {values: []} + this.$ = {values: []} break; case 244: - this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) + this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) break; case 245: - this.$ = { type: 'expression_list', values: $$[$0-1].values } + this.$ = { type: 'expression_list', values: $$[$0-1].values } break; case 246: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = { type: 'expression_list', values: [$$[$0]] } break; case 247: - this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) + this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) break; case 249: - this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } + this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } break; case 250: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = { type: 'expression_list', values: [$$[$0]] } break; case 251: - this.$ = { dim: 1, lengths: [null] } + this.$ = { dim: 1, lengths: [null] } break; case 252: - this.$ = { dim: 1, lengths: [$$[$0-1]] } + this.$ = { dim: 1, lengths: [$$[$0-1]] } break; case 253: - this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } + this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } break; case 254: - this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } + this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } break; case 256: - this.$ = {...$$[$0-1], ...$$[$0]} + this.$ = {...$$[$0-1], ...$$[$0]} break; case 257: case 345: case 347: case 351: case 352: - this.$ = { name: $$[$0] } + this.$ = { name: $$[$0] } break; case 258: - this.$ = { name: $$[$0], reference: true } + this.$ = { name: $$[$0], reference: true } break; case 259: - this.$ = { name: $$[$0], template: true } + this.$ = { name: $$[$0], template: true } break; case 260: - this.$ = { name: 'air.'+$$[$0] } + this.$ = { name: 'air.'+$$[$0] } break; case 261: - this.$ = { name: 'air.'+$$[$0], template: true } + this.$ = { name: 'air.'+$$[$0], template: true } break; case 262: - this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } + this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } break; case 263: - this.$ = { items: [$$[$0]] } + this.$ = { items: [$$[$0]] } break; case 264: - this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; + this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; break; case 265: - this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } + this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; case 266: - this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 267: - this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 268: - this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } + this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; case 269: - this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } + this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } break; case 270: - this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } + this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; case 271: - this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } + this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } break; case 272: - this.$ = { type: 'public_declaration', items: $$[$0].items } + this.$ = { type: 'public_declaration', items: $$[$0].items } break; case 273: - this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} + this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} break; case 274: - this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} + this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} break; case 275: - this.$ = { type: 'proof_value_declaration', items: $$[$0].items } + this.$ = { type: 'proof_value_declaration', items: $$[$0].items } break; case 276: - this.$ = { type: 'subproof_value_declaration', aggregateType: $$[$0-2], items: $$[$0].items } + this.$ = { type: 'subproof_value_declaration', aggregateType: $$[$0-2], items: $$[$0].items } break; case 277: - this.$ = { type: 'subproof_definition', aggregate: true, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_definition', aggregate: true, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; case 278: - this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; case 279: - this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } break; case 280: - this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } + this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } break; case 281: - this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } + this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } break; case 282: - this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) break; case 283: - this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) break; case 284: - this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) break; case 285: - this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) break; case 286: - this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) break; case 287: - this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) break; case 288: - this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) break; case 289: - this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $$[$0].type, dim: $$[$0].dim})); + this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({type: 'istype', vtype: $$[$0].type, dim: $$[$0].dim})); break; case 290: - this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; case 291: - this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) + this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) break; case 292: - this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) break; case 293: - this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) break; case 294: - this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) break; case 295: - this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) break; case 296: - this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) break; case 297: - this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; case 298: - this.$ = $$[$0-1].insert('not') + this.$ = $$[$0-1].insert('not') break; case 299: - this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) break; case 300: - this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) break; case 301: - this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) break; case 302: - this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) break; case 303: - this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) break; case 304: - this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) break; case 305: - this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) + this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) break; case 307: - this.$ = $$[$0].insert('neg') + this.$ = $$[$0].insert('neg') break; case 308: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0] }) + this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0] }) break; case 309: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], inc: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0], inc: 'pre'}) break; case 310: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0], dec: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0], dec: 'pre'}) break; case 311: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], inc: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0-1], inc: 'post'}) break; case 312: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$$[$0-1], dec: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0-1], dec: 'post'}) break; case 313: - this.$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($$[$0])}) + this.$ = ExpressionFactory.fromObject({ type: 'number', value: BigInt($$[$0])}) break; case 314: - this.$ = ExpressionFactory.fromObject({...$$[$0], op: 'string'}) + this.$ = ExpressionFactory.fromObject({...$$[$0], type: 'string'}) break; case 316: case 318: - this.$ = ExpressionFactory.fromObject({...$$[$0]}) + this.$ = ExpressionFactory.fromObject({...$$[$0]}) break; case 317: - this.$ = ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) + this.$ = ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'}) break; case 319: - this.$ = { op: 'cast', cast: 'int', value: $$[$0-1]} + this.$ = { type: 'cast', cast: 'int', value: $$[$0-1]} break; case 320: - this.$ = { op: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'fe', value: $$[$0-1] } break; case 321: - this.$ = { op: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'expr', value: $$[$0-1] } break; case 322: - this.$ = { op: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'col', value: $$[$0-1] } break; case 323: - this.$ = { op: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'string', value: $$[$0-1] } break; case 324: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'int', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'int', value: $$[$0-1] } break; case 325: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'fe', value: $$[$0-1] } break; case 326: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'expr', value: $$[$0-1] } break; case 327: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'col', value: $$[$0-1] } break; case 328: - this.$ = { ...$$[$0-3], op: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'string', value: $$[$0-1] } break; case 329: - this.$ = { ...$$[$0-1], next:1 } + this.$ = { ...$$[$0-1], next:1 } break; case 330: - this.$ = { ...$$[$0-2], next:$$[$0] } + this.$ = { ...$$[$0-2], next: Number($$[$0]) } break; case 331: - this.$ = { ...$$[$0-4], next:$$[$0-1] } + this.$ = { ...$$[$0-4], next:$$[$0-1] } break; case 332: - this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], op: 'positional_param'}) } + this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'}) } break; case 333: - this.$ = { ...$$[$0], prior:1 } + this.$ = { ...$$[$0], prior:1 } break; case 334: - this.$ = { ...$$[$0], prior:$$[$0-2] } + this.$ = { ...$$[$0], prior: Number($$[$0-2]) } break; case 335: - this.$ = { ...$$[$0], prior:$$[$0-3] } + this.$ = { ...$$[$0], prior:$$[$0-3] } break; case 336: - this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], op: 'positional_param'}) } + this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], type: 'positional_param'}) } break; case 338: - this.$ = { ...$$[$0], dim: 0 } + this.$ = { ...$$[$0], dim: 0 } break; case 340: - this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } + this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } break; case 341: - this.$ = { dim: 1, indexes: [$$[$0-1]]} + this.$ = { dim: 1, indexes: [$$[$0-1]]} break; case 342: - this.$ = { name: 'air.' + $$[$0].name } + this.$ = { name: 'air.' + $$[$0].name } break; case 343: - this.$ = { name: 'subproof.' + $$[$0].name } + this.$ = { name: 'subproof.' + $$[$0].name } break; case 344: - this.$ = { name: 'proof.' + $$[$0].name } + this.$ = { name: 'proof.' + $$[$0].name } break; case 346: case 348: - this.$ = { name: $$[$0-2] + '.' + $$[$0].name } + this.$ = { name: $$[$0-2] + '.' + $$[$0].name } break; case 349: case 350: - this.$ = { name: $$[$0-2].name + '.' + $$[$0] } + this.$ = { name: $$[$0-2].name + '.' + $$[$0] } break; } }, -table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:18,25:$V1,32:[1,20],52:21,53:$V2,54:$V3,61:$V4,62:[1,19],70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,124:31,137:$Vg,154:$Vh},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),{27:[1,41],153:[1,40]},{29:[1,42]},{47:[1,43]},{32:[1,45],52:44,53:$Vi,54:$V3,62:[1,46]},{138:48,142:$Vj,143:$Vk},o($Vl,$Vm,{139:51,75:$Vn,76:$Vo,140:$Vp}),o($Vl,$Vm,{139:55,140:$Vp}),{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:56,152:57},{153:[1,63]},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:64},{153:[1,66]},{27:[1,67]},o($Vu,[2,169]),{25:$V1,53:$Vv,70:$V5,71:$V6,72:$V7,78:$Vb,124:68},{23:73,27:[1,70],32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:71,126:72},{53:[1,78]},{23:73,27:$VA,32:$Vw,57:[1,81],62:$Vx,68:$Vy,95:$Vz,125:79,126:80},{23:73,27:$VA,32:$Vw,57:[1,85],62:$Vx,68:$Vy,95:$Vz,125:83,126:84},{23:73,27:$VA,32:$Vw,57:[1,88],62:$Vx,68:$Vy,95:$Vz,125:86,126:87},{23:73,27:$VA,32:$Vw,57:[1,91],62:$Vx,68:$Vy,95:$Vz,125:89,126:90},{23:73,27:$VA,32:$Vw,57:$VB,62:$Vx,68:$Vy,95:$Vz,126:92},{27:[1,94]},{29:[1,96],47:[1,95]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:97,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:$V61,53:$V71,55:161,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{47:[1,179]},{52:180,53:$Vi,54:$V3},{52:181,53:$Vi,54:$V3},{27:[1,182]},o($Vl1,[2,213]),o($Vm1,[2,216]),o($Vm1,[2,217]),{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:184,152:183},o($Vl,$Vm,{139:185,140:$Vp}),o($Vl,$Vm,{139:186,140:$Vp}),{47:[1,187]},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:188},o([6,8,25,31,32,53,54,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,137,154],$Vn1,{148:190,57:$Vo1,127:[1,189]}),o($Vl1,[2,272],{64:$Vp1}),o($Vq1,[2,257]),o($Vq1,[2,258]),o($Vq1,[2,259]),{151:[1,193]},o($Vr1,[2,263]),{47:[1,194]},o($Vl1,[2,275],{64:$Vp1}),o($Vr1,$Vn1,{148:190,57:$Vo1}),{47:[1,195]},{57:$Vo1,127:[1,196],148:197},o($Vu,[2,170]),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:71,126:72},o([6,8,25,31,32,53,54,57,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,127,137,154],$Vs1,{47:$Vt1,151:$Vu1}),o($Vu,[2,175],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,200]}),o($Vx1,$Vy1,{128:201,57:$Vz1}),{151:[1,203]},{151:[1,204]},{151:[1,205]},o($VA1,[2,347],{151:[1,206]}),{27:[1,207]},o($Vu,[2,171],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,208]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:209,126:210},o($VA1,$Vs1,{151:$Vu1}),o($Vu,[2,172],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,211]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:212,126:210},o($Vu,[2,173],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,213]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:214,126:210},o($Vu,[2,174],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,215]}),{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:216,126:210},{127:[1,217]},{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,125:218,126:210},{47:[1,219]},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:220,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:229,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,230]},{31:[2,38]},{11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:[2,28],32:$Vw,35:232,37:231,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,31:[2,30],36:233},o($VH1,[2,34],{36:234,8:$VC}),o($VH1,[2,37],{8:$VI1}),o($VJ1,[2,106]),o($VJ1,[2,107]),o($VJ1,[2,108]),o($VJ1,[2,109],{86:[1,236],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VJ1,[2,111]),o($VJ1,[2,112]),o($VJ1,[2,113]),o($VJ1,[2,114]),o($VJ1,[2,115]),o($VJ1,[2,116]),o($VJ1,[2,117]),o($VJ1,[2,118]),o($VJ1,[2,119]),o($V52,[2,48]),{41:261,42:[1,262],43:[1,263],44:[1,264],47:[1,260]},{29:[1,265]},o($V52,[2,52]),o($V52,[2,53]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:266,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,44]),o($VJ1,[2,135]),o($VJ1,[2,136]),o($VJ1,[2,137]),o($VJ1,[2,138]),o($VJ1,[2,139]),o($VJ1,[2,140]),o($Vl,$Vm,{139:51,69:268,47:$V62,57:$V72,75:$Vn,76:$Vo,140:$Vp}),{23:160,27:$VA,32:$Vw,47:$VI,48:270,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:271,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:272,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o([8,31,86,107,108,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$V82,{130:275,121:$V92,123:$Va2,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:280,141:$Vg2,178:$Vh2,180:$V51},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:285,141:$Vg2,178:$Vh2,180:$V51},o($Vm1,[2,313],{180:$Vi2}),o($Vm1,[2,314]),{23:160,27:$VA,32:$Vw,47:$VI,48:287,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vm1,[2,316]),o($Vm1,[2,317],{180:$Vj2}),o($Vm1,[2,318]),{61:[1,290],93:289},{23:291,27:$VA,32:$Vw,57:$VB,62:$Vx,68:$Vy,95:$Vz,126:92},{23:292,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz},{47:[1,293]},{47:[1,294]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:295,35:297,36:298,37:296,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{32:$Vk2,62:$Vl2,94:299,95:$Vm2},{47:[1,303]},{47:[1,304]},{127:[1,305]},o($VJ1,[2,195],{138:137,90:139,179:141,91:153,23:160,122:223,48:306,27:$VA,32:$Vw,47:$VI,57:[1,307],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,$Vo2,{47:$Vp2,180:$Vq2}),{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:310,95:$Vz},{23:73,27:$VA,32:$Vw,47:$Vr2,57:[1,313],62:$Vx,68:$Vy,69:312,95:$Vz,125:79,126:80},{23:73,27:$VA,32:$Vw,47:$Vs2,57:[1,316],62:$Vx,68:$Vy,69:315,95:$Vz,125:83,126:84},{23:73,27:$VA,32:$Vw,47:$Vt2,57:[1,319],62:$Vx,68:$Vy,69:318,95:$Vz,125:86,126:87},{23:73,27:$VA,32:$Vw,47:$Vu2,57:[1,322],62:$Vx,68:$Vy,69:321,95:$Vz,125:89,126:90},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:324,134:323,141:$Vg2,178:$Vh2,180:$V51},o($Vv2,[2,338],{181:325,57:[1,326]}),{49:[1,327]},{49:[2,63],64:[1,328]},{49:[2,65]},o($Vw2,[2,68]),{27:[1,329],68:[1,330]},o($Vx2,[2,73]),o($Vx2,[2,74]),o($Vx2,[2,75]),{70:[1,331],71:[1,332],72:[1,333],78:[1,334]},{75:[1,335],76:[1,336]},o($Vx2,[2,81]),o($Vx2,[2,82]),o($Vx2,[2,84]),o($Vx2,[2,85]),o($Vx2,[2,86]),o($Vx2,[2,87]),o($Vx2,[2,88]),o($Vx2,[2,89]),{49:$V61,53:$V71,55:337,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{47:[1,338]},{47:[1,339]},{47:$Vt1},o($Vu,[2,264],{64:$Vp1}),o($Vr1,$Vn1,{148:190,57:$Vo1,127:[1,340]}),{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:341},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:343,152:342},{141:[1,344]},o($Vl1,[2,270],{64:$Vp1}),{23:160,27:$VA,32:$Vw,47:$VI,48:345,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vr1,[2,256],{57:$Vy2}),{23:160,27:$VA,32:$Vw,47:$VI,48:348,59:[1,347],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:349,150:65},{27:[1,350],143:[1,351]},{27:[1,352]},{27:[1,353]},{23:160,27:$VA,32:$Vw,47:$VI,48:354,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{57:$Vy2,127:[1,355]},{27:$Vz2,143:$VA2,182:356},{23:73,27:$VA,32:$Vw,62:$Vx,68:$Vy,95:$Vz,126:359},{23:160,27:$VA,32:$Vw,47:$VI,48:360,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vx1,[2,192],{57:[1,361]}),{23:160,27:$VA,32:$Vw,47:$VI,48:363,59:[1,362],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{27:$Vz2,143:$VA2,182:364},{27:$Vz2,143:$VA2,182:365},{27:$Vz2,143:$VA2,182:366},{27:$Vz2,143:$VA2,182:367},{47:[2,56]},{23:160,27:$VA,32:$Vw,47:$VI,48:368,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,369],64:$Vv1},o($VB2,$Vw1),{23:160,27:$VA,32:$Vw,47:$VI,48:370,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,371],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:372,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,373],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:374,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,375],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:376,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,377],64:$Vv1},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:378,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,379],64:$VC2},{23:160,27:$VA,32:$Vw,47:$VI,48:381,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VD2,[2,250],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,$V82,{121:$V92,123:$Va2}),{47:$Vr2,57:$V72,69:312},{47:$Vs2,57:$V72,69:315},{47:$Vt2,57:$V72,69:318},{47:$V62,57:$V72,69:268},{47:$Vu2,57:$V72,69:321},{31:[1,382]},o($V0,[2,23]),{8:$VC,31:[2,29],36:383},o($VH1,[2,31],{36:384,8:$VC}),o($VH1,[2,36],{8:$VI1}),o($VH1,[2,35],{8:$VI1}),o($V52,[2,43]),{23:160,27:$VA,32:$Vw,47:$VI,48:385,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:386,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:387,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:388,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:389,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:390,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:391,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:392,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{53:$V71,60:393,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{23:160,27:$VA,32:$Vw,47:$VI,48:395,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:396,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:397,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:398,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:399,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:400,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:401,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:402,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:403,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:404,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:405,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:406,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:407,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:408,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:409,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:410,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:411,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VE2,[2,45]),o($VE2,[2,46]),o($VE2,[2,47]),{27:$VF2,51:413},{31:[1,415]},{23:160,27:$VA,32:$Vw,47:$VI,48:416,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,417],57:$VG2},{59:$VH2},o($Vm1,[2,298]),o($Vm1,[2,306]),o($Vm1,[2,307]),o($Vm1,[2,311]),o($Vm1,[2,312]),{23:160,27:$VA,32:$Vw,47:$VI,48:420,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VI2,[2,198],{136:421,57:$VJ2}),o($VI2,[2,199]),o($VI2,[2,200]),o($VI2,[2,201]),o($Vm1,[2,309]),o($Vn2,$Vo2,{180:$Vq2}),{180:$Vi2},{23:160,27:$VA,32:$Vw,47:$VI,48:423,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{180:$Vj2},o($Vm1,[2,310]),{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:424,95:$Vz},{49:[1,425],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:426,95:$Vz},{32:$Vk2,62:$Vl2,94:427,95:$Vm2},o([32,62,95],[2,130]),o($VJ1,[2,19],{128:201,26:[1,428],29:[1,429],57:$Vz1,127:$Vy1}),o($VJ1,[2,18]),{13:434,20:431,23:160,25:$V1,27:$VA,32:$Vw,47:$Vf2,53:$Vv,62:$Vx,68:$Vy,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,78:$Vb,91:281,95:$Vz,97:432,105:430,122:433,124:31,141:$Vg2,178:$Vh2,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:435,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{108:[1,436]},{8:$VC,36:438,108:[1,437]},o([22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,24],{36:439,8:$VC}),o($V52,[2,26]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:440,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VE2,[2,131]),o($VE2,[2,132]),o($VE2,[2,133]),{23:160,27:$VA,32:$Vw,47:$VI,48:441,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:442,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,57:[1,444],62:$Vx,68:$Vy,90:443,91:445,95:$Vz},o($VJ1,[2,196],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:446,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vn2,[2,329],{47:[1,448],141:[1,447],178:[1,449]}),o($Vw2,$VK2,{138:137,90:139,179:141,91:153,23:160,122:223,92:450,48:452,27:$VA,32:$Vw,47:$VI,57:$VL2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,[2,333]),{23:160,27:$VA,32:$Vw,47:$VI,48:453,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,454],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:209,126:210},{23:160,27:$VA,32:$Vw,47:$VI,48:455,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,456],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:212,126:210},{23:160,27:$VA,32:$Vw,47:$VI,48:457,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,458],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:214,126:210},{23:160,27:$VA,32:$Vw,47:$VI,48:459,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:[1,460],57:$VG2},{23:73,27:$VA,32:$Vw,59:$VH2,62:$Vx,68:$Vy,95:$Vz,125:216,126:210},{59:[1,461],64:[1,462]},o($VB2,[2,204]),o($Vv2,[2,339],{57:[1,463]}),{23:160,27:$VA,32:$Vw,47:$VI,48:464,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{29:[1,466],56:[1,465]},{53:$V71,65:[1,467],66:468,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},o($Vw2,[2,69],{69:469,57:$V72}),o($Vw2,[2,70],{69:470,57:$V72}),o($Vx2,[2,76]),o($Vx2,[2,77]),o($Vx2,[2,78]),o($Vx2,[2,83]),o($Vx2,[2,79]),o($Vx2,[2,80]),{49:[1,471]},{49:$V61,53:$V71,55:472,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{49:$V61,53:$V71,55:473,63:162,65:$V81,66:164,67:165,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{23:160,27:$VA,32:$Vw,47:$VI,48:474,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vu,[2,266],{64:$Vp1}),o($Vu,[2,267],{64:$Vp1}),o($Vr1,$Vn1,{148:190,57:$Vo1,127:[1,475]}),{49:[1,476]},o($Vl1,[2,271],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:478,59:[1,477],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vq1,[2,251]),{59:[1,479],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vr1,[2,262]),o($Vq1,[2,260]),o($Vq1,[2,261]),{64:[1,480]},{49:[1,481]},o($Vl1,[2,280],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{57:$VJ2,136:482},o($VA1,[2,346],{151:$VM2}),o($VN2,[2,351]),o($VN2,[2,352]),o([6,8,25,31,32,53,54,59,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137,154],[2,193]),o($Vl1,[2,180],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:485,59:[1,484],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VO2,[2,187]),{59:[1,486],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VA1,[2,342],{151:$VM2}),o($VA1,[2,343],{151:$VM2}),o($VA1,[2,344],{151:$VM2}),o($VA1,[2,348],{151:$VM2}),o($Vl1,[2,176],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,487]},o($Vl1,[2,177],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,488]},o($Vl1,[2,178],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,489]},o($Vl1,[2,179],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,490]},o($Vl1,[2,181],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,491]},{49:[1,492],64:$VC2},{29:[1,493]},{23:160,27:$VA,32:$Vw,47:$VI,48:495,62:$Vx,65:[1,494],68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VD2,[2,249],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V0,[2,279]),o($VH1,[2,33],{8:$VI1}),o($VH1,[2,32],{8:$VI1}),o($VJ1,[2,110],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,282],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,283],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,284],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,285],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,286],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VP2,[2,287],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,154,161,162,163,164,165,166,167],[2,288],{155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,[2,289]),o($VQ2,[2,94],{69:496,57:$V72}),o($VR2,[2,290],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{56:[1,497],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VR2,[2,292],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,293],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,294],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VS2,[2,295],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,296],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VS2,[2,297],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,299],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,300],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VU2,[2,301],{177:$V42}),o($VU2,[2,302],{177:$V42}),o($VU2,[2,303],{177:$V42}),o($VU2,[2,304],{177:$V42}),o($Vm1,[2,305]),{49:[1,498],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,50]),{8:$VC,36:438},{31:[1,499],64:$VV2},o($VW2,[2,126],{56:[1,501]}),o($V52,[2,54]),{49:[1,502],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:503,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,504]},o($VX2,[2,93]),o([8,31,49,64,108],[2,209],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([8,31,49,64,107,108],[2,210]),{23:160,27:$VA,32:$Vw,47:$VI,48:507,57:$VY2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,144:505,145:506,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,509],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vn2,[2,334]),o($Vm1,[2,315],{180:$VZ2}),o($Vn2,[2,336]),{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:511,95:$Vz},{27:[1,512]},{13:516,14:517,15:518,16:519,17:520,18:521,19:522,20:523,25:$V1,30:513,31:$V_2,40:514,53:$Vv,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:515,124:31,154:$Vh},{8:[1,524],107:[1,525]},o($V$2,[2,165]),o($V$2,[2,166]),o($V$2,[2,167],{130:275,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),o($V$2,[2,168]),{49:[1,526],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{47:[1,527]},{47:[1,528]},o($V52,[2,27]),o($V52,[2,25]),o($V52,[2,148]),{49:[1,529],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{49:[1,530],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VJ1,[2,207]),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:531,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{47:$Vp2},{59:[1,532],64:$VC2},o($Vn2,[2,330]),{23:160,27:$VA,32:$Vw,47:$VI,48:533,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vn2,[2,332]),{49:[1,534],64:$V03},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:536,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vw2,[2,246],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{49:[1,537],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:538,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,539],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:540,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,541],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:542,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[1,543],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:544,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{127:[2,205]},o($VB2,[2,203],{23:160,91:281,122:546,27:$VA,32:$Vw,47:$Vf2,62:$Vx,65:[1,545],68:$Vy,95:$Vz,141:$Vg2,178:$Vh2,180:$V51}),{23:160,27:$VA,32:$Vw,47:$VI,48:547,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,548],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{53:$V71,57:[1,549],60:550,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:551,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{49:[2,64]},o($Vw2,[2,67]),o($Vw2,[2,71],{57:$VG2}),o($Vw2,[2,72],{57:$VG2}),{29:[1,552]},{49:[1,553]},{49:[1,554]},o($Vl1,[2,265],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:555,57:$VJ2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,136:556,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vl,[2,214]),o($Vq1,[2,253]),{59:[1,557],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vq1,[2,252]),{27:[1,558]},{27:$Vq,68:$Vr,95:$Vs,143:$Vt,149:62,150:65,152:559},o($Vl1,[2,281]),{27:[1,560],143:[1,561]},o($VO2,[2,189]),{59:[1,562],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VO2,[2,188]),{57:[1,563]},{57:[1,564]},{57:[1,565]},{57:[1,566]},{57:[1,567]},{29:[1,568]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:569,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:570,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VD2,[2,248],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VQ2,[2,95],{57:$VG2}),{23:160,27:$VA,32:$Vw,47:$VI,48:571,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:572,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,51]),{27:[1,573]},{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:574,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vm1,[2,322]),{49:[1,578],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VX2,[2,92]),{59:[1,579],64:$V33},o($VB2,[2,232],{56:$V43,65:$V53}),o($V63,$V73,{56:[1,583],107:$VK1,118:$V83,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:507,57:$VY2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,144:585,145:506,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{180:$VZ2},{23:160,27:$VA,32:$Vw,62:$Vx,68:$Vy,91:586,95:$Vz},{47:[1,587]},o($VJ1,[2,20],{29:[1,588]}),{31:[1,589]},{8:$VC,31:[2,40],36:590},o($V93,[2,97]),o($V93,[2,98]),o($V93,[2,99]),o($V93,[2,100]),o($V93,[2,101]),o($V93,[2,102]),o($V93,[2,103]),o($V93,[2,104]),o($V93,[2,105]),{23:160,27:$VA,32:$Vw,47:$VI,48:591,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:593,57:[1,594],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,102:592,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:595,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:596,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:597,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{29:[1,599],112:598},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:600,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,601],64:$VC2},o($VJ1,[2,197]),{49:[1,602],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,129]),{23:160,27:$VA,32:$Vw,47:$VI,48:603,57:[1,604],62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,605],64:$VC2},o($Vm1,[2,319]),{49:[1,606],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,320]),{49:[1,607],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,321]),{49:[1,608],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,323]),{49:[1,609],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{59:[1,610]},o($VB2,[2,202]),{59:[1,611],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Va3,[2,341]),{53:$V71,58:612,60:613,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{29:[1,614]},{31:[1,615]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:616,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{29:[1,617]},{29:[1,618]},o($Vl1,[2,268],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vu,[2,269]),o($Vq1,[2,254]),{49:[1,620],64:[1,619]},o($Vl1,[2,276],{64:$Vp1}),o($VN2,[2,349]),o($VN2,[2,350]),o($VO2,[2,190]),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:621,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:622,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:623,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:624,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:625,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:626,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,627]},o($VD2,[2,247],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,25,31,32,49,53,54,56,59,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,154],[2,291],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,49]),o($VW2,[2,124],{56:[1,628]}),o($VW2,[2,125]),o($Vb3,[2,120],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{27:$VF2,51:629},{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:631,89:630,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vm1,[2,327]),o($Vc3,[2,218],{56:[1,633],65:[1,632]}),{23:160,27:$VA,32:$Vw,47:$VI,48:635,57:$VY2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,145:634,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:636,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vd3,[2,239]),{23:160,27:$VA,32:$Vw,47:$VI,48:637,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:638,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,639],64:$V33},o($Vn2,[2,335]),o($Vw2,$VK2,{138:137,90:139,179:141,91:153,23:160,122:223,48:452,92:640,27:$VA,32:$Vw,47:$VI,57:$VL2,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{13:516,14:517,15:518,16:519,17:520,18:521,19:522,20:523,25:$V1,30:641,31:$V_2,40:514,53:$Vv,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:515,124:31,154:$Vh},o($V52,[2,21]),{8:$VI1,13:516,14:517,15:518,16:519,17:520,18:521,19:522,20:523,25:$V1,31:[2,41],53:$Vv,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:642,124:31,154:$Vh},{8:[1,643],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{49:[1,644]},{49:[2,141],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:645,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,145]),{49:[1,646],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{49:[1,647],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,149]),{115:648,119:[1,649]},o([8,22,25,27,29,31,32,46,47,50,53,54,57,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,150],{114:[1,650]}),o($VJ1,[2,208]),o($Vn2,[2,331]),o($Vw2,[2,243],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:651,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vw2,[2,245]),o($Vm1,[2,324]),o($Vm1,[2,325]),o($Vm1,[2,326]),o($Vm1,[2,328]),{127:[2,206]},o($Va3,[2,340]),{59:[1,652],64:[1,653]},o($VB2,[2,91]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:654,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Ve3,[2,59]),{31:[1,655]},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:656,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:657,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:222,62:$Vx,65:$VB1,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,103:658,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{27:[1,659]},{59:[1,660],64:$VC2},{59:[1,661],64:$VC2},{59:[1,662],64:$VC2},{59:[1,663],64:$VC2},{59:[1,664],64:$VC2},{31:[1,665]},o($V0,[2,278]),{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:666,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,667],64:$VV2},{59:[1,668],64:[1,669]},o($VB2,[2,128]),o($Vc3,[2,219]),{23:160,27:$VA,32:$Vw,47:$VI,48:670,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,222],{56:$V43,65:$V53}),o($V63,$V73,{56:[1,671],107:$VK1,118:$V83,146:[1,672],147:[1,673],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vd3,[2,234],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,233],{107:$VK1,118:$Vf3,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V63,[2,235],{56:[1,675],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vd3,[2,240]),{49:[1,676],64:$V03},{31:[1,677]},o($V93,[2,96]),{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,97:680,106:678,120:679,121:$Vg3,122:683,123:$Vh3,141:$Vg2,178:$Vh2,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:684,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,685],64:$VC2},o($V52,[2,146]),o($V52,[2,147]),{31:[1,686],116:[1,687],119:[1,688]},{23:160,27:$VA,32:$Vw,47:$VI,48:690,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,117:689,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:691,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,692],64:$VC2},{29:[1,693]},{53:$V71,60:694,67:394,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{31:[1,695]},o($Ve3,[2,60]),{31:[1,696]},{31:[1,697]},{49:[1,698],64:$VC2},{57:[1,699]},o($Vu,[2,182]),o($Vu,[2,183]),o($Vu,[2,184]),o($Vu,[2,185]),o($Vu,[2,186]),o($V0,[2,277]),o($VW2,[2,123]),o($Vb3,[2,121]),o($Vb3,[2,122]),{23:160,27:$VA,29:$V13,32:$Vw,47:$VI,48:575,57:$V23,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,88:700,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vc3,[2,220],{65:[1,701],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:702,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,228],{138:137,90:139,179:141,91:153,23:160,122:223,48:703,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,229],{138:137,90:139,179:141,91:153,23:160,122:223,48:704,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{23:160,27:$VA,32:$Vw,47:$VI,48:705,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:706,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VJ1,[2,134]),o($V52,[2,22]),{49:[1,707],64:[1,708]},o($Vw2,[2,212]),o($Vw2,[2,160]),{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:709,141:$Vg2,178:$Vh2,180:$V51},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,122:710,141:$Vg2,178:$Vh2,180:$V51},{121:[1,711],123:[1,712],127:$Vb2,130:275,131:$Vc2,132:$Vd2,133:$Ve2},o($V52,[2,144]),{49:[2,142]},o($V52,[2,152]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,35:101,36:102,37:100,38:713,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:690,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,117:714,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{56:[1,715],64:$Vi3},o($Vj3,[2,156],{107:$VK1,118:[1,717],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,151]),o($Vw2,[2,244]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,31:$VG,32:$Vw,33:718,35:101,36:102,37:100,38:98,39:99,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,90]),o($Ve3,[2,58]),o($Ve3,[2,61]),o($Ve3,[2,62]),{27:[1,719]},{23:160,27:$VA,32:$Vw,47:$VI,48:720,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($VB2,[2,127]),o($Vc3,[2,221]),o($VB2,[2,223],{107:$VK1,118:$Vf3,146:[1,721],147:[1,722],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,224],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,225],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V63,[2,237],{56:[1,723],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vd3,[2,236],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,34:724,35:297,36:298,37:412,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$Vf2,62:$Vx,68:$Vy,91:281,95:$Vz,97:680,120:725,121:$Vg3,122:683,123:$Vh3,141:$Vg2,178:$Vh2,180:$V51},o($Vw2,[2,161]),o($Vw2,[2,162]),o($Vw2,[2,163]),o($Vw2,[2,164]),{31:[1,726]},{56:[1,727],64:$Vi3},{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,35:101,36:102,37:729,39:728,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:730,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:731,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{31:[1,732]},{57:[1,733]},{59:[1,734],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,230],{138:137,90:139,179:141,91:153,23:160,122:223,48:735,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,231],{138:137,90:139,179:141,91:153,23:160,122:223,48:736,27:$VA,32:$Vw,47:$VI,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vz,121:$VZ,123:$V_,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{23:160,27:$VA,32:$Vw,47:$VI,48:737,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($V52,[2,143]),o($Vw2,[2,211]),o($V52,[2,153]),{8:$VC,11:119,12:108,13:104,14:105,15:109,16:110,17:111,18:112,19:113,20:123,21:115,22:$VD,23:160,24:114,25:$VE,27:$VA,28:120,29:$VF,32:$Vw,35:101,36:102,37:729,39:738,45:116,46:$VH,47:$VI,48:106,50:$VJ,52:21,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:103,87:107,90:139,91:153,95:$Vz,96:$VQ,97:124,98:125,99:126,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,122:133,123:$V_,124:31,129:$V$,135:151,137:$Vg,138:137,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vk3,[2,159],{52:21,124:31,85:103,13:104,14:105,48:106,87:107,12:108,15:109,16:110,17:111,18:112,19:113,24:114,21:115,45:116,11:119,28:120,20:123,97:124,98:125,99:126,122:133,138:137,90:139,179:141,135:151,91:153,23:160,35:232,37:739,22:$VD,25:$VE,27:$VA,29:$VF,32:$Vw,46:$VH,47:$VI,50:$VJ,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vz,96:$VQ,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,123:$V_,129:$V$,137:$Vg,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VC,36:233},o($Vj3,[2,154],{107:$VK1,118:[1,740],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vj3,[2,157],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,57]),{23:160,27:$VA,32:$Vw,47:$VI,48:741,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{57:[1,742]},{56:[1,743],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{56:[1,744],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vd3,[2,238],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vk3,[2,158],{52:21,124:31,85:103,13:104,14:105,48:106,87:107,12:108,15:109,16:110,17:111,18:112,19:113,24:114,21:115,45:116,11:119,28:120,20:123,97:124,98:125,99:126,122:133,138:137,90:139,179:141,135:151,91:153,23:160,35:232,37:739,22:$VD,25:$VE,27:$VA,29:$VF,32:$Vw,46:$VH,47:$VI,50:$VJ,53:$V2,54:$V3,57:$VK,61:$V4,62:$Vx,68:$Vy,70:$VL,71:$VM,72:$VN,73:$V8,74:$VO,77:$Va,78:$VP,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vz,96:$VQ,100:$VR,101:$VS,104:$VT,108:$VU,109:$VV,110:$VW,111:$VX,113:$VY,121:$VZ,123:$V_,129:$V$,137:$Vg,141:$V01,142:$Vj,143:$Vk,154:$Vh,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VC,36:383},{23:160,27:$VA,32:$Vw,47:$VI,48:745,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{59:[1,746],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{23:160,27:$VA,32:$Vw,47:$VI,48:747,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:748,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},{23:160,27:$VA,32:$Vw,47:$VI,48:749,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vj3,[2,155],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{57:[1,750]},{59:[1,751],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,226],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,227],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{23:160,27:$VA,32:$Vw,47:$VI,48:752,62:$Vx,68:$Vy,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:139,91:153,95:$Vz,121:$VZ,122:223,123:$V_,138:137,141:$V01,142:$Vj,143:$Vk,170:$V11,171:$V21,172:$V31,178:$V41,179:141,180:$V51},o($Vl1,[2,274]),{59:[1,753],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vl1,[2,273])], -defaultActions: {4:[2,1],98:[2,38],163:[2,65],182:[2,55],207:[2,56],461:[2,205],467:[2,64],610:[2,206],685:[2,142]}, +table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,24:$V1,31:[1,19],54:20,55:$V2,56:$V3,61:$V4,62:[1,18],70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,124:29,137:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),{26:[1,39],153:[1,38]},{28:[1,40]},{46:[1,41]},{31:[1,43],54:42,55:$Vh,56:$V3,62:[1,44]},{138:46,142:$Vi,143:$Vj},o($Vk,$Vl,{139:49,75:$Vm,76:$Vn,140:$Vo}),o($Vk,$Vl,{139:53,140:$Vo}),{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:54,152:55},{153:[1,61]},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:62},{153:[1,64]},o($Vt,[2,169]),{24:$V1,55:$Vu,70:$V5,71:$V6,72:$V7,78:$Vb,124:65},{22:70,26:[1,67],31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:68,126:69},{55:[1,75]},{22:70,26:$Vz,31:$Vv,51:[1,78],62:$Vw,68:$Vx,95:$Vy,125:76,126:77},{22:70,26:$Vz,31:$Vv,51:[1,82],62:$Vw,68:$Vx,95:$Vy,125:80,126:81},{22:70,26:$Vz,31:$Vv,51:[1,85],62:$Vw,68:$Vx,95:$Vy,125:83,126:84},{22:70,26:$Vz,31:$Vv,51:[1,88],62:$Vw,68:$Vx,95:$Vy,125:86,126:87},{22:70,26:$Vz,31:$Vv,51:$VA,62:$Vw,68:$Vx,95:$Vy,126:89},{26:[1,91]},{28:[1,93],46:[1,92]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:94,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:$V61,55:$V71,57:159,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{46:[1,177]},{54:178,55:$Vh,56:$V3},{54:179,55:$Vh,56:$V3},{26:[1,180]},o($Vl1,[2,213]),o($Vm1,[2,216]),o($Vm1,[2,217]),{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:182,152:181},o($Vk,$Vl,{139:183,140:$Vo}),o($Vk,$Vl,{139:184,140:$Vo}),{46:[1,185]},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:186},o([6,8,24,30,31,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,137],$Vn1,{148:188,51:$Vo1,127:[1,187]}),o($Vl1,[2,272],{64:$Vp1}),o($Vq1,[2,257]),o($Vq1,[2,258]),o($Vq1,[2,259]),{151:[1,191]},o($Vr1,[2,263]),{46:[1,192]},o($Vl1,[2,275],{64:$Vp1}),o($Vr1,$Vn1,{148:188,51:$Vo1}),{46:[1,193]},o($Vt,[2,170]),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:68,126:69},o([6,8,24,30,31,51,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,127,137],$Vs1,{46:$Vt1,151:$Vu1}),o($Vt,[2,175],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,196]}),o($Vx1,$Vy1,{128:197,51:$Vz1}),{151:[1,199]},{151:[1,200]},{151:[1,201]},o($VA1,[2,347],{151:[1,202]}),{26:[1,203]},o($Vt,[2,171],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,204]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:205,126:206},o($VA1,$Vs1,{151:$Vu1}),o($Vt,[2,172],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,207]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:208,126:206},o($Vt,[2,173],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,209]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:210,126:206},o($Vt,[2,174],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,211]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:212,126:206},{127:[1,213]},{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:214,126:206},{46:[1,215]},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:216,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:225,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,226]},{30:[2,37]},{11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:[2,27],31:$Vv,34:228,36:227,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,30:[2,29],35:229},o($VH1,[2,33],{35:230,8:$VB}),o($VH1,[2,36],{8:$VI1}),o($VJ1,[2,106]),o($VJ1,[2,107]),o($VJ1,[2,108]),o($VJ1,[2,109],{86:[1,232],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VJ1,[2,111]),o($VJ1,[2,112]),o($VJ1,[2,113]),o($VJ1,[2,114]),o($VJ1,[2,115]),o($VJ1,[2,116]),o($VJ1,[2,117]),o($VJ1,[2,118]),o($VJ1,[2,119]),o($V52,[2,47]),{40:257,41:[1,258],42:[1,259],43:[1,260],46:[1,256]},{22:158,26:$Vz,28:[1,261],31:$Vv,46:$VH,47:263,51:[1,262],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,53]),o($V52,[2,54]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:264,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,43]),o($VJ1,[2,135]),o($VJ1,[2,136]),o($VJ1,[2,137]),o($VJ1,[2,138]),o($VJ1,[2,139]),o($VJ1,[2,140]),o($Vk,$Vl,{139:49,69:266,46:$V62,51:$V72,75:$Vm,76:$Vn,140:$Vo}),{22:158,26:$Vz,31:$Vv,46:$VH,47:268,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:269,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:270,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o([8,30,86,107,108,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$V82,{130:273,121:$V92,123:$Va2,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:278,141:$Vg2,178:$Vh2,180:$V51},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:283,141:$Vg2,178:$Vh2,180:$V51},o($Vm1,[2,313],{180:$Vi2}),o($Vm1,[2,314]),{22:158,26:$Vz,31:$Vv,46:$VH,47:285,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vm1,[2,316]),o($Vm1,[2,317],{180:$Vj2}),o($Vm1,[2,318]),{61:[1,288],93:287},{26:[1,289]},{22:290,26:$Vz,31:$Vv,51:$VA,62:$Vw,68:$Vx,95:$Vy,126:89},{22:291,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy},{46:[1,292]},{46:[1,293]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:294,34:296,35:297,36:295,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{31:$Vk2,62:$Vl2,94:298,95:$Vm2},{46:[1,302]},{46:[1,303]},{127:[1,304]},o($VJ1,[2,195],{138:134,90:136,179:138,91:151,22:158,122:219,47:305,26:$Vz,31:$Vv,46:$VH,51:[1,306],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,$Vo2,{46:$Vp2,180:$Vq2}),{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:309,95:$Vy},{22:70,26:$Vz,31:$Vv,46:$Vr2,51:[1,312],62:$Vw,68:$Vx,69:311,95:$Vy,125:76,126:77},{22:70,26:$Vz,31:$Vv,46:$Vs2,51:[1,315],62:$Vw,68:$Vx,69:314,95:$Vy,125:80,126:81},{22:70,26:$Vz,31:$Vv,46:$Vt2,51:[1,318],62:$Vw,68:$Vx,69:317,95:$Vy,125:83,126:84},{22:70,26:$Vz,31:$Vv,46:$Vu2,51:[1,321],62:$Vw,68:$Vx,69:320,95:$Vy,125:86,126:87},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:323,134:322,141:$Vg2,178:$Vh2,180:$V51},o($Vv2,[2,338],{181:324,51:[1,325]}),{48:[1,326]},{48:[2,64],64:[1,327]},{48:[2,66]},o($Vw2,[2,69]),{26:[1,328],68:[1,329]},o($Vx2,[2,74]),o($Vx2,[2,75]),o($Vx2,[2,76]),{70:[1,330],71:[1,331],72:[1,332],78:[1,333]},{75:[1,334],76:[1,335]},o($Vx2,[2,82]),o($Vx2,[2,83]),o($Vx2,[2,85]),o($Vx2,[2,86]),o($Vx2,[2,87]),o($Vx2,[2,88]),o($Vx2,[2,89]),o($Vx2,[2,90]),{48:$V61,55:$V71,57:336,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{46:[1,337]},{46:[1,338]},{46:$Vt1},o($Vt,[2,264],{64:$Vp1}),o($Vr1,$Vn1,{148:188,51:$Vo1,127:[1,339]}),{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:340},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:342,152:341},{141:[1,343]},o($Vl1,[2,270],{64:$Vp1}),{22:158,26:$Vz,31:$Vv,46:$VH,47:344,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vr1,[2,256],{51:$Vy2}),{22:158,26:$Vz,31:$Vv,46:$VH,47:347,53:[1,346],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:348,150:63},{26:[1,349],143:[1,350]},{26:[1,351]},{26:[1,352]},{26:$Vz2,143:$VA2,182:353},{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,126:356},{22:158,26:$Vz,31:$Vv,46:$VH,47:357,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vx1,[2,192],{51:[1,358]}),{22:158,26:$Vz,31:$Vv,46:$VH,47:360,53:[1,359],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{26:$Vz2,143:$VA2,182:361},{26:$Vz2,143:$VA2,182:362},{26:$Vz2,143:$VA2,182:363},{26:$Vz2,143:$VA2,182:364},{46:[2,57]},{22:158,26:$Vz,31:$Vv,46:$VH,47:365,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,366],64:$Vv1},o($VB2,$Vw1),{22:158,26:$Vz,31:$Vv,46:$VH,47:367,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,368],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:369,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,370],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:371,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,372],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:373,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,374],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:375,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,376],64:$VC2},{22:158,26:$Vz,31:$Vv,46:$VH,47:378,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VD2,[2,250],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,$V82,{121:$V92,123:$Va2}),{46:$Vr2,51:$V72,69:311},{46:$Vs2,51:$V72,69:314},{46:$Vt2,51:$V72,69:317},{46:$V62,51:$V72,69:266},{46:$Vu2,51:$V72,69:320},{30:[1,379]},o($V0,[2,22]),{8:$VB,30:[2,28],35:380},o($VH1,[2,30],{35:381,8:$VB}),o($VH1,[2,35],{8:$VI1}),o($VH1,[2,34],{8:$VI1}),o($V52,[2,42]),{22:158,26:$Vz,31:$Vv,46:$VH,47:382,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:383,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:384,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:385,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:386,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:387,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:388,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:389,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{55:$V71,60:390,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{22:158,26:$Vz,31:$Vv,46:$VH,47:392,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:393,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:394,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:395,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:396,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:397,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:398,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:399,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:400,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:401,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:402,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:403,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:404,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:405,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:406,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:407,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:408,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VE2,[2,44]),o($VE2,[2,45]),o($VE2,[2,46]),{26:$VF2,50:410},{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,52:412,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:413,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:[1,417],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{30:[1,418]},{22:158,26:$Vz,31:$Vv,46:$VH,47:419,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,420],51:$VI2},{53:$VJ2},o($Vm1,[2,298]),o($Vm1,[2,306]),o($Vm1,[2,307]),o($Vm1,[2,311]),o($Vm1,[2,312]),{22:158,26:$Vz,31:$Vv,46:$VH,47:423,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VK2,[2,198],{136:424,51:$VL2}),o($VK2,[2,199]),o($VK2,[2,200]),o($VK2,[2,201]),o($Vm1,[2,309]),o($Vn2,$Vo2,{180:$Vq2}),{180:$Vi2},{22:158,26:$Vz,31:$Vv,46:$VH,47:426,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{180:$Vj2},o($Vm1,[2,310]),{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:427,95:$Vy},{48:[1,428],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:429,95:$Vy},{31:$Vk2,62:$Vl2,94:430,95:$Vm2},o([31,62,95],[2,130]),{51:$Vo1,127:[1,431],148:432},o($VJ1,[2,18],{128:197,25:[1,433],28:[1,434],51:$Vz1,127:$Vy1}),o($VJ1,[2,17]),{13:439,19:436,22:158,24:$V1,26:$Vz,31:$Vv,46:$Vf2,55:$Vu,62:$Vw,68:$Vx,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,78:$Vb,91:279,95:$Vy,97:437,105:435,122:438,124:29,141:$Vg2,178:$Vh2,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:440,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{108:[1,441]},{8:$VB,35:443,108:[1,442]},o([21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,23],{35:444,8:$VB}),o($V52,[2,25]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:445,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VE2,[2,131]),o($VE2,[2,132]),o($VE2,[2,133]),{22:158,26:$Vz,31:$Vv,46:$VH,47:446,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:447,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,51:[1,449],62:$Vw,68:$Vx,90:448,91:450,95:$Vy},o($VJ1,[2,196],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:451,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vn2,[2,329],{46:[1,453],141:[1,452],178:[1,454]}),o($Vw2,$VM2,{138:134,90:136,179:138,91:151,22:158,122:219,92:455,47:457,26:$Vz,31:$Vv,46:$VH,51:$VN2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,[2,333]),{22:158,26:$Vz,31:$Vv,46:$VH,47:458,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,459],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:205,126:206},{22:158,26:$Vz,31:$Vv,46:$VH,47:460,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,461],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:208,126:206},{22:158,26:$Vz,31:$Vv,46:$VH,47:462,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,463],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:210,126:206},{22:158,26:$Vz,31:$Vv,46:$VH,47:464,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,465],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:212,126:206},{53:[1,466],64:[1,467]},o($VB2,[2,204]),o($Vv2,[2,339],{51:[1,468]}),{22:158,26:$Vz,31:$Vv,46:$VH,47:469,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{28:[1,471],58:[1,470]},{55:$V71,65:[1,472],66:473,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},o($Vw2,[2,70],{69:474,51:$V72}),o($Vw2,[2,71],{69:475,51:$V72}),o($Vx2,[2,77]),o($Vx2,[2,78]),o($Vx2,[2,79]),o($Vx2,[2,84]),o($Vx2,[2,80]),o($Vx2,[2,81]),{48:[1,476]},{48:$V61,55:$V71,57:477,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{48:$V61,55:$V71,57:478,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{22:158,26:$Vz,31:$Vv,46:$VH,47:479,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vt,[2,266],{64:$Vp1}),o($Vt,[2,267],{64:$Vp1}),o($Vr1,$Vn1,{148:188,51:$Vo1,127:[1,480]}),{48:[1,481]},o($Vl1,[2,271],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:483,53:[1,482],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vq1,[2,251]),{53:[1,484],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vr1,[2,262]),o($Vq1,[2,260]),o($Vq1,[2,261]),{64:[1,485]},{48:[1,486]},o($VA1,[2,346],{151:$VO2}),o($VP2,[2,351]),o($VP2,[2,352]),o([6,8,24,30,31,53,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137],[2,193]),o($Vl1,[2,180],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:489,53:[1,488],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VQ2,[2,187]),{53:[1,490],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VA1,[2,342],{151:$VO2}),o($VA1,[2,343],{151:$VO2}),o($VA1,[2,344],{151:$VO2}),o($VA1,[2,348],{151:$VO2}),o($Vl1,[2,176],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,491]},o($Vl1,[2,177],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,492]},o($Vl1,[2,178],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,493]},o($Vl1,[2,179],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,494]},o($Vl1,[2,181],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,495]},{48:[1,496],64:$VC2},{28:[1,497]},{22:158,26:$Vz,31:$Vv,46:$VH,47:499,62:$Vw,65:[1,498],68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VD2,[2,249],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V0,[2,279]),o($VH1,[2,32],{8:$VI1}),o($VH1,[2,31],{8:$VI1}),o($VJ1,[2,110],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,282],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,283],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,284],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,285],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,286],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,287],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,161,162,163,164,165,166,167],[2,288],{155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,[2,289]),o($VS2,[2,95],{69:500,51:$V72}),o($VT2,[2,290],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{58:[1,501],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VT2,[2,292],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,293],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,294],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VU2,[2,295],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,296],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VU2,[2,297],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VV2,[2,299],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VV2,[2,300],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VW2,[2,301],{177:$V42}),o($VW2,[2,302],{177:$V42}),o($VW2,[2,303],{177:$V42}),o($VW2,[2,304],{177:$V42}),o($Vm1,[2,305]),{48:[1,502],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,49]),{8:$VB,35:443},{30:[1,503],64:$VX2},o($VY2,[2,126],{58:[1,505]}),{53:[1,506],64:$VZ2},o($VB2,[2,128]),o($V_2,[2,120],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{26:$VF2,50:508},{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,52:509,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:413,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,52]),o($V52,[2,55]),{48:[1,510],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:511,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,512]},o($V$2,[2,94]),o([8,30,48,64,108],[2,209],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([8,30,48,64,107,108],[2,210]),{22:158,26:$Vz,31:$Vv,46:$VH,47:515,51:$V03,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,144:513,145:514,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,517],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vn2,[2,334]),o($Vm1,[2,315],{180:$V13}),o($Vn2,[2,336]),{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:519,95:$Vy},{22:158,26:$Vz,31:$Vv,46:$VH,47:520,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{51:$Vy2,127:[1,521]},{26:[1,522]},{13:526,14:527,15:528,16:529,17:530,18:531,19:532,24:$V1,29:523,30:$V23,39:524,55:$Vu,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:525,124:29},{8:[1,533],107:[1,534]},o($V33,[2,165]),o($V33,[2,166]),o($V33,[2,167],{130:273,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),o($V33,[2,168]),{48:[1,535],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{46:[1,536]},{46:[1,537]},o($V52,[2,26]),o($V52,[2,24]),o($V52,[2,148]),{48:[1,538],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{48:[1,539],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VJ1,[2,207]),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:540,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:$Vp2},{53:[1,541],64:$VC2},o($Vn2,[2,330]),{22:158,26:$Vz,31:$Vv,46:$VH,47:542,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vn2,[2,332]),{48:[1,543],64:$V43},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:545,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vw2,[2,246],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{48:[1,546],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:547,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,548],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:549,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,550],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:551,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,552],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:553,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{127:[2,205]},o($VB2,[2,203],{22:158,91:279,122:555,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,65:[1,554],68:$Vx,95:$Vy,141:$Vg2,178:$Vh2,180:$V51}),{22:158,26:$Vz,31:$Vv,46:$VH,47:556,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,557],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{51:[1,558],55:$V71,60:559,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:560,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[2,65]},o($Vw2,[2,68]),o($Vw2,[2,72],{51:$VI2}),o($Vw2,[2,73],{51:$VI2}),{28:[1,561]},{48:[1,562]},{48:[1,563]},o($Vl1,[2,265],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:564,51:$VL2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,136:565,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vk,[2,214]),o($Vq1,[2,253]),{53:[1,566],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vq1,[2,252]),{26:[1,567]},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:568},{26:[1,569],143:[1,570]},o($VQ2,[2,189]),{53:[1,571],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VQ2,[2,188]),{51:[1,572]},{51:[1,573]},{51:[1,574]},{51:[1,575]},{51:[1,576]},{28:[1,577]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:578,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:579,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VD2,[2,248],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VS2,[2,96],{51:$VI2}),{22:158,26:$Vz,31:$Vv,46:$VH,47:580,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:581,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,50]),{26:[1,582]},{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:583,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,51]),{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:584,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,585],64:$VX2},{53:[1,586],64:$VZ2},o($Vm1,[2,322]),{48:[1,587],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V$2,[2,93]),{53:[1,588],64:$V53},o($VB2,[2,232],{58:$V63,65:$V73}),o($V83,$V93,{58:[1,592],107:$VK1,118:$Va3,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:515,51:$V03,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,144:594,145:514,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{180:$V13},{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:595,95:$Vy},{46:[1,596]},o($VJ1,[2,280],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{51:$VL2,136:597},o($VJ1,[2,19],{28:[1,598]}),{30:[1,599]},{8:$VB,30:[2,39],35:600},o($Vb3,[2,98]),o($Vb3,[2,99]),o($Vb3,[2,100]),o($Vb3,[2,101]),o($Vb3,[2,102]),o($Vb3,[2,103]),o($Vb3,[2,104]),o($Vb3,[2,105]),{22:158,26:$Vz,31:$Vv,46:$VH,47:601,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:603,51:[1,604],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,102:602,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:605,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:606,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:607,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{28:[1,609],112:608},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:610,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,611],64:$VC2},o($VJ1,[2,197]),{48:[1,612],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,129]),{22:158,26:$Vz,31:$Vv,46:$VH,47:613,51:[1,614],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,615],64:$VC2},o($Vm1,[2,319]),{48:[1,616],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,320]),{48:[1,617],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,321]),{48:[1,618],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,323]),{48:[1,619],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{53:[1,620]},o($VB2,[2,202]),{53:[1,621],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vc3,[2,341]),{55:$V71,59:622,60:623,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{28:[1,624]},{30:[1,625]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:626,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{28:[1,627]},{28:[1,628]},o($Vl1,[2,268],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vt,[2,269]),o($Vq1,[2,254]),{48:[1,630],64:[1,629]},o($Vl1,[2,276],{64:$Vp1}),o($VP2,[2,349]),o($VP2,[2,350]),o($VQ2,[2,190]),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:631,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:632,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:633,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:634,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:635,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:636,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,637]},o($VD2,[2,247],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147],[2,291],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,48]),o($VY2,[2,124],{58:[1,638]}),o($VY2,[2,125]),o($VB2,[2,127]),o($V_2,[2,121]),o($V_2,[2,122]),o($Vm1,[2,327]),o($Vd3,[2,218],{58:[1,640],65:[1,639]}),{22:158,26:$Vz,31:$Vv,46:$VH,47:642,51:$V03,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,145:641,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:643,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Ve3,[2,239]),{22:158,26:$Vz,31:$Vv,46:$VH,47:644,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:645,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,646],64:$V53},o($Vn2,[2,335]),o($Vw2,$VM2,{138:134,90:136,179:138,91:151,22:158,122:219,47:457,92:647,26:$Vz,31:$Vv,46:$VH,51:$VN2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VJ1,[2,281]),{13:526,14:527,15:528,16:529,17:530,18:531,19:532,24:$V1,29:648,30:$V23,39:524,55:$Vu,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:525,124:29},o($V52,[2,20]),{8:$VI1,13:526,14:527,15:528,16:529,17:530,18:531,19:532,24:$V1,30:[2,40],55:$Vu,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:649,124:29},{8:[1,650],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{48:[1,651]},{48:[2,141],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:652,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,145]),{48:[1,653],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{48:[1,654],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,149]),{115:655,119:[1,656]},o([8,21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,150],{114:[1,657]}),o($VJ1,[2,208]),o($Vn2,[2,331]),o($Vw2,[2,243],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:658,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vw2,[2,245]),o($Vm1,[2,324]),o($Vm1,[2,325]),o($Vm1,[2,326]),o($Vm1,[2,328]),{127:[2,206]},o($Vc3,[2,340]),{53:[1,659],64:[1,660]},o($VB2,[2,92]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:661,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vf3,[2,60]),{30:[1,662]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:663,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:664,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:665,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{26:[1,666]},{53:[1,667],64:$VC2},{53:[1,668],64:$VC2},{53:[1,669],64:$VC2},{53:[1,670],64:$VC2},{53:[1,671],64:$VC2},{30:[1,672]},o($V0,[2,278]),{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:673,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vd3,[2,219]),{22:158,26:$Vz,31:$Vv,46:$VH,47:674,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VB2,[2,222],{58:$V63,65:$V73}),o($V83,$V93,{58:[1,675],107:$VK1,118:$Va3,146:[1,676],147:[1,677],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,234],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,233],{107:$VK1,118:$Vg3,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V83,[2,235],{58:[1,679],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,240]),{48:[1,680],64:$V43},{30:[1,681]},o($Vb3,[2,97]),{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,97:684,106:682,120:683,121:$Vh3,122:687,123:$Vi3,141:$Vg2,178:$Vh2,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:688,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,689],64:$VC2},o($V52,[2,146]),o($V52,[2,147]),{30:[1,690],116:[1,691],119:[1,692]},{22:158,26:$Vz,31:$Vv,46:$VH,47:694,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,117:693,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:695,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,696],64:$VC2},{28:[1,697]},{55:$V71,60:698,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{30:[1,699]},o($Vf3,[2,61]),{30:[1,700]},{30:[1,701]},{48:[1,702],64:$VC2},{51:[1,703]},o($Vt,[2,182]),o($Vt,[2,183]),o($Vt,[2,184]),o($Vt,[2,185]),o($Vt,[2,186]),o($V0,[2,277]),o($VY2,[2,123]),o($Vd3,[2,220],{65:[1,704],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:705,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VB2,[2,228],{138:134,90:136,179:138,91:151,22:158,122:219,47:706,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,229],{138:134,90:136,179:138,91:151,22:158,122:219,47:707,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{22:158,26:$Vz,31:$Vv,46:$VH,47:708,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:709,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VJ1,[2,134]),o($V52,[2,21]),{48:[1,710],64:[1,711]},o($Vw2,[2,212]),o($Vw2,[2,160]),{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:712,141:$Vg2,178:$Vh2,180:$V51},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:713,141:$Vg2,178:$Vh2,180:$V51},{121:[1,714],123:[1,715],127:$Vb2,130:273,131:$Vc2,132:$Vd2,133:$Ve2},o($V52,[2,144]),{48:[2,142]},o($V52,[2,152]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,34:98,35:99,36:97,37:716,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:694,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,117:717,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{58:[1,718],64:$Vj3},o($Vk3,[2,156],{107:$VK1,118:[1,720],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,151]),o($Vw2,[2,244]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:721,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VB2,[2,91]),o($Vf3,[2,59]),o($Vf3,[2,62]),o($Vf3,[2,63]),{26:[1,722]},{22:158,26:$Vz,31:$Vv,46:$VH,47:723,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vd3,[2,221]),o($VB2,[2,223],{107:$VK1,118:$Vg3,146:[1,724],147:[1,725],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,224],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,225],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V83,[2,237],{58:[1,726],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,236],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:727,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,97:684,120:728,121:$Vh3,122:687,123:$Vi3,141:$Vg2,178:$Vh2,180:$V51},o($Vw2,[2,161]),o($Vw2,[2,162]),o($Vw2,[2,163]),o($Vw2,[2,164]),{30:[1,729]},{58:[1,730],64:$Vj3},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,34:98,35:99,36:732,38:731,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:733,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:734,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,735]},{51:[1,736]},{53:[1,737],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,230],{138:134,90:136,179:138,91:151,22:158,122:219,47:738,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,231],{138:134,90:136,179:138,91:151,22:158,122:219,47:739,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{22:158,26:$Vz,31:$Vv,46:$VH,47:740,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,143]),o($Vw2,[2,211]),o($V52,[2,153]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,34:98,35:99,36:732,38:741,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vl3,[2,159],{54:20,124:29,85:100,13:101,14:102,47:103,87:104,12:105,15:106,16:107,17:108,18:109,88:110,23:111,20:112,44:113,11:116,27:117,19:120,97:121,98:122,99:123,122:130,138:134,90:136,179:138,135:149,91:151,22:158,34:228,36:742,21:$VC,24:$VD,26:$Vz,28:$VE,31:$Vv,45:$VG,46:$VH,49:$VI,51:$VJ,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vy,96:$VP,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,123:$VZ,129:$V_,137:$Vg,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VB,35:229},o($Vk3,[2,154],{107:$VK1,118:[1,743],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vk3,[2,157],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vf3,[2,58]),{22:158,26:$Vz,31:$Vv,46:$VH,47:744,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{51:[1,745]},{58:[1,746],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{58:[1,747],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Ve3,[2,238],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vl3,[2,158],{54:20,124:29,85:100,13:101,14:102,47:103,87:104,12:105,15:106,16:107,17:108,18:109,88:110,23:111,20:112,44:113,11:116,27:117,19:120,97:121,98:122,99:123,122:130,138:134,90:136,179:138,135:149,91:151,22:158,34:228,36:742,21:$VC,24:$VD,26:$Vz,28:$VE,31:$Vv,45:$VG,46:$VH,49:$VI,51:$VJ,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vy,96:$VP,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,123:$VZ,129:$V_,137:$Vg,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VB,35:380},{22:158,26:$Vz,31:$Vv,46:$VH,47:748,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,749],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:750,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:751,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:752,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vk3,[2,155],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{51:[1,753]},{53:[1,754],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,226],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,227],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:755,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vl1,[2,274]),{53:[1,756],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vl1,[2,273])], +defaultActions: {4:[2,1],95:[2,37],161:[2,66],180:[2,56],203:[2,57],466:[2,205],472:[2,65],620:[2,206],689:[2,142]}, parseError: function parseError (str, hash) { if (hash.recoverable) { this.trace(str); @@ -1395,211 +1401,211 @@ options: {}, performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { var YYSTATE=YY_START; switch($avoiding_name_collisions) { -case 0: /* skip whitespace */ +case 0: /* skip whitespace */ break; -case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ +case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ break; -case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ +case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ break; -case 3: return 74; +case 3: return 74; break; -case 4: return 75; +case 4: return 75; break; -case 5: return 76; +case 5: return 76; break; -case 6: return 25; +case 6: return 24; break; -case 7: return 'DECLARE'; +case 7: return 'DECLARE'; break; -case 8: return 22; +case 8: return 21; break; -case 9: return 26; +case 9: return 25; break; -case 10: return 137; +case 10: return 137; break; -case 11: return 107; +case 11: return 107; break; -case 12: return 161; +case 12: return 161; break; -case 13: return 83; +case 13: return 83; break; -case 14: return 82; +case 14: return 82; break; -case 15: return 154 +case 15: return 154 break; -case 16: return 73 +case 16: return 73 break; -case 17: return 79 +case 17: return 79 break; -case 18: return 80 +case 18: return 80 break; -case 19: return 62 +case 19: return 62 break; -case 20: return 95 +case 20: return 95 break; -case 21: return 32 +case 21: return 31 break; -case 22: return 70 +case 22: return 70 break; -case 23: return 71 +case 23: return 71 break; -case 24: return 72 +case 24: return 72 break; -case 25: return 78 +case 25: return 78 break; -case 26: return 77 +case 26: return 77 break; -case 27: return 104 +case 27: return 104 break; -case 28: return 108 +case 28: return 108 break; -case 29: return 109 +case 29: return 109 break; -case 30: return 101 +case 30: return 101 break; -case 31: return 100 +case 31: return 100 break; -case 32: return 113 +case 32: return 113 break; -case 33: return 'ELSEIF' +case 33: return 'ELSEIF' break; -case 34: return 114 +case 34: return 114 break; -case 35: return 111 +case 35: return 111 break; -case 36: return 119 +case 36: return 119 break; -case 37: return 116 +case 37: return 116 break; -case 38: return 46 +case 38: return 45 break; -case 39: return 153 +case 39: return 153 break; -case 40: return 140 +case 40: return 140 break; -case 41: return 110 +case 41: return 110 break; -case 42: return 96 +case 42: return 96 break; -case 43: return 54 +case 43: return 56 break; -case 44: return 61 +case 44: return 61 break; -case 45: return 53 +case 45: return 55 break; -case 46: return 129 +case 46: return 129 break; -case 47: return 42 +case 47: return 41 break; -case 48: return 43 +case 48: return 42 break; -case 49: return 44 +case 49: return 43 break; -case 50: return 146 +case 50: return 146 break; -case 51: return 147 +case 51: return 147 break; -case 52: return 65 +case 52: return 65 break; -case 53: return 118 +case 53: return 118 break; -case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; +case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; break; -case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; +case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; break; -case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; +case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; break; -case 57: return 27; +case 57: return 26; break; -case 58: yy_.yytext = yy_.yytext.slice(1); return 68; +case 58: yy_.yytext = yy_.yytext.slice(1); return 68; break; -case 59: yy_.yytext = yy_.yytext.slice(1); return 50; +case 59: yy_.yytext = yy_.yytext.slice(1); return 49; break; -case 60: yy_.yytext = yy_.yytext.slice(1); return 178; +case 60: yy_.yytext = yy_.yytext.slice(1); return 178; break; -case 61: return 177; +case 61: return 177; break; -case 62: return 121; +case 62: return 121; break; -case 63: return 123; +case 63: return 123; break; -case 64: return 131; +case 64: return 131; break; -case 65: return 132; +case 65: return 132; break; -case 66: return 133; +case 66: return 133; break; -case 67: return 171; +case 67: return 171; break; -case 68: return 172; +case 68: return 172; break; -case 69: return 173; +case 69: return 173; break; -case 70: return "'"; +case 70: return "'"; break; -case 71: return "?"; +case 71: return "?"; break; -case 72: return "%"; +case 72: return "%"; break; -case 73: return "\\\\"; +case 73: return "\\\\"; break; -case 74: return "/"; +case 74: return "/"; break; -case 75: return 8; +case 75: return 8; break; -case 76: return 64; +case 76: return 64; break; -case 77: return 151; +case 77: return 151; break; -case 78: return 162; +case 78: return 162; break; -case 79: return 167; +case 79: return 167; break; -case 80: return 164; +case 80: return 164; break; -case 81: return 165; +case 81: return 165; break; -case 82: return 166; +case 82: return 166; break; -case 83: return 168; +case 83: return 168; break; -case 84: return 169; +case 84: return 169; break; -case 85: return 159; +case 85: return 159; break; -case 86: return 160; +case 86: return 160; break; -case 87: return 157; +case 87: return 157; break; -case 88: return 158; +case 88: return 158; break; -case 89: return 87; +case 89: return 86; break; -case 90: return 156; +case 90: return 156; break; -case 91: return 155; +case 91: return 155; break; -case 92: return 127; +case 92: return 127; break; -case 93: return 47; +case 93: return 46; break; -case 94: return 49; +case 94: return 48; break; -case 95: return 57; +case 95: return 51; break; -case 96: return 59; +case 96: return 53; break; -case 97: return 29; +case 97: return 28; break; -case 98: return 31; +case 98: return 30; break; -case 99: return '::'; +case 99: return '::'; break; -case 100: return 56; +case 100: return 58; break; -case 101: return 170; +case 101: return 170; break; -case 102: return 6; +case 102: return 6; break; case 103: console.log("INVALID: " + yy_.yytext); return 'INVALID' break; diff --git a/src/assign.js b/src/assign.js index 5638a74..27173f0 100644 --- a/src/assign.js +++ b/src/assign.js @@ -26,6 +26,7 @@ module.exports = class Assign { return this.assignType(type, name, indexes, value); } assignType(type, name, indexes, value) { + console.log(type); switch (type) { case 'int': return this.assignTypeInt(name, indexes, value, type); case 'expr': return this.assignTypeExpr(name, indexes, value, type); diff --git a/src/builtin/assert.js b/src/builtin/assert.js index 9d826fd..9fa41c0 100644 --- a/src/builtin/assert.js +++ b/src/builtin/assert.js @@ -1,19 +1,24 @@ const Function = require("../function.js"); +const Context = require('../context.js'); module.exports = class Assert extends Function { constructor (parent) { super(parent, {funcname: 'assert'}); } mapArguments(s) { - if (s.arguments.length !== 1) { + console.log('############### ASSERT (prepare) ########################'); + console.log(s.args); + if (s.args.length !== 1) { throw new Error('Invalid number of parameters'); } - const arg0 = this.expressions.e2bool(s.arguments[0]); + const arg0 = s.args[0].asBool(); + console.log(arg0); if (!arg0) { - throw new Error(`Assert fails ${arg0} on ${this.parent.sourceRef}`); + throw new Error(`Assert fails ${arg0} on ${Context.sourceRef}`); } return 0n; } exec(s, mapInfo) { + console.log('############### ASSERT (exec) ########################'); return mapInfo; } } diff --git a/src/builtin/assert_eq.js b/src/builtin/assert_eq.js index f2160f5..de0a0fe 100644 --- a/src/builtin/assert_eq.js +++ b/src/builtin/assert_eq.js @@ -5,13 +5,13 @@ module.exports = class AssertEq extends Function { super(999999, {funcname: 'assert_eq'}); } mapArguments(s) { - if (s.arguments.length !== 2) { + if (s.args.length !== 2) { throw new Error('Invalid number of parameters'); } - assert(s.arguments[0] instanceof Expression); - assert(s.arguments[1] instanceof Expression); - const arg0 = s.arguments[0].e2value(); - const arg1 = s.arguments[1].e2value(); + assert(s.args[0] instanceof Expression); + assert(s.args[1] instanceof Expression); + const arg0 = s.args[0].e2value(); + const arg1 = s.args[1].e2value(); if (arg0 !== arg1) { throw new Error(`Assert fails (${arg0} === ${arg1}) on ${Context.sourceRef}`); } diff --git a/src/builtin/assert_not_eq.js b/src/builtin/assert_not_eq.js index bc492e5..1b3dfb5 100644 --- a/src/builtin/assert_not_eq.js +++ b/src/builtin/assert_not_eq.js @@ -4,11 +4,11 @@ module.exports = class AssertNotEq extends Function { super(parent, {funcname: 'assert_not_eq'}); } mapArguments(s) { - if (s.arguments.length !== 2) { + if (s.args.length !== 2) { throw new Error('Invalid number of parameters'); } - const arg0 = this.expressions.e2value(s.arguments[0]); - const arg1 = this.expressions.e2value(s.arguments[1]); + const arg0 = this.expressions.e2value(s.args[0]); + const arg1 = this.expressions.e2value(s.args[1]); if (arg0 === arg1) { throw new Error(`Assert fails (${arg0} !== ${arg1}) on ${this.parent.sourceRef}`); } diff --git a/src/builtin/cast.js b/src/builtin/cast.js new file mode 100644 index 0000000..fd133f3 --- /dev/null +++ b/src/builtin/cast.js @@ -0,0 +1,37 @@ +const Function = require("../function.js"); +const Context = require('../context.js'); +const Expression = require('../expression.js'); + +module.exports = class Cast extends Function { + constructor (parent) { + super(parent, {funcname: 'cast'}); + } + mapArguments(s) { + console.log('############### CAST (prepare) ########################'); + console.log(s.args); + if (s.args.length !== 2) { + throw new Error('Invalid number of parameters'); + } + if (typeof s.args[0] !== 'string') { + throw new Error('Invalid type of cast'); + } + const cast = s.args[0]; + let arg1 = s.args[1] instanceof Expression ? s.args[1].eval() : s.args[1]; + console.log(arg1, arg1.isBaseType, typeof arg1.asStringItem); + if (arg1 instanceof Expression) { + arg1.dump(); + arg1 = arg1.eval(); + } + switch (cast) { + case 'string': + if (arg1.isBaseType && typeof arg1.asStringItem === 'function') { + return arg1.asStringItem(); + } + } + EXIT_HERE; + } + exec(s, mapInfo) { + console.log('############### CAST (exec) ########################', mapInfo); + return mapInfo; + } +} diff --git a/src/builtin/defined.js b/src/builtin/defined.js index f8489e6..41a7caa 100644 --- a/src/builtin/defined.js +++ b/src/builtin/defined.js @@ -6,10 +6,10 @@ module.exports = class Defined extends Function { super(parent, {funcname: 'defined'}); } mapArguments(s) { - if (s.arguments.length !== 1) { + if (s.args.length !== 1) { throw new Error('Invalid number of parameters'); } - const arg0 = s.arguments[0]; + const arg0 = s.args[0]; if (arg0 && arg0.isReference()) { const ref = arg0.getReference(); // console.log(ref); diff --git a/src/builtin/is_array.js b/src/builtin/is_array.js index bc5be0a..52f0ec8 100644 --- a/src/builtin/is_array.js +++ b/src/builtin/is_array.js @@ -5,10 +5,10 @@ module.exports = class IsArray extends Function { super(parent, {funcname: 'is_array'}); } mapArguments(s) { - if (s.arguments.length !== 1) { + if (s.args.length !== 1) { throw new Error('Invalid number of parameters'); } - const arg0 = s.arguments[0]; + const arg0 = s.args[0]; if (arg0 && arg0.isReference()) { const ref = arg0.getReference(); if (!this.references.isDefined(ref.name, ref.__indexes)) { diff --git a/src/builtin/length.js b/src/builtin/length.js index e206c8b..cdfdac4 100644 --- a/src/builtin/length.js +++ b/src/builtin/length.js @@ -4,16 +4,16 @@ module.exports = class Length extends Function { super(parent, {funcname: 'length'}); } mapArguments(s) { - if (s.arguments.length !== 1) { + if (s.args.length !== 1) { throw new Error('Invalid number of parameters'); } - const arg0 = s.arguments[0]; + const arg0 = s.args[0]; if (arg0 && arg0.isReference()) { const [instance,rinfo] = this.expressions.getReferenceInfo(arg0); const operand = arg0.getAloneOperand(); return rinfo.array ? BigInt(rinfo.array.getLength(operand.dim)) : 0n; } - const value = this.expressions.e2value(s.arguments[0]); + const value = this.expressions.e2value(s.args[0]); if (typeof value === 'string') { return BigInt(value.length); } diff --git a/src/builtin/println.js b/src/builtin/println.js index a600169..605f732 100644 --- a/src/builtin/println.js +++ b/src/builtin/println.js @@ -5,7 +5,7 @@ module.exports = class Println extends Function { } mapArguments(s) { let texts = []; - for (const arg of s.arguments) { + for (const arg of s.args) { if (typeof arg === 'string') { texts.push(arg); continue; diff --git a/src/compiler.js b/src/compiler.js index 4a3d8f3..c95c83d 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -121,7 +121,7 @@ console.log('\x1B[93mSTATE '+state+' SYMBOL '+__symbol_info__+" #"+(yylineno + 1 return result; } - this.$.debug = `${compiler.relativeFileName}:${last.last_line}`; + this.$.debug = `${compiler.relativeFileName}:${last.last_line}:${first.first_column}:${last.last_line}:${last.last_column}`; // this.$.__debug = `${compiler.relativeFileName} (${first.first_line}, ${first.first_column}) (${last.last_line}, ${last.last_column})`; // this.$.__contents = compiler.srcLines[first.first_line - 1].substring(first.first_column + 1, last.last_column); this.$.__yystate = `${yystate} ${yylineno}` diff --git a/src/context.js b/src/context.js index 4ab49f6..a638185 100644 --- a/src/context.js +++ b/src/context.js @@ -1,5 +1,4 @@ const {assert} = require("chai"); - module.exports = class Context { static _instance = null; diff --git a/src/definition_items.js b/src/definition_items.js index ea0bfb3..851c790 100644 --- a/src/definition_items.js +++ b/src/definition_items.js @@ -13,6 +13,7 @@ const Subproofval = require("./definition_items/subproofval.js"); const ValueItem = require("./definition_items/value_item.js"); const WitnessCol = require("./definition_items/witness_col.js"); const FixedCol = require("./definition_items/fixed_col.js"); +const Expression = require("./definition_items/expression.js"); module.exports = { DefinitionItem, @@ -29,5 +30,6 @@ module.exports = { StringValue, Subproofval, ValueItem, - WitnessCol + WitnessCol, + Expression } diff --git a/src/definition_items/definition_item.js b/src/definition_items/definition_item.js index f2f0cc3..5840e2b 100644 --- a/src/definition_items/definition_item.js +++ b/src/definition_items/definition_item.js @@ -54,8 +54,11 @@ module.exports = class DefinitionItem { this.id = id; this.label = properties.label; } + toString(options) { + return `${this.label}()`; + } dump(options) { - return `${this.constructor.name}()`; + return this.toString(options); } get type() { console.log(this); diff --git a/src/definition_items/expression.js b/src/definition_items/expression.js new file mode 100644 index 0000000..22eb761 --- /dev/null +++ b/src/definition_items/expression.js @@ -0,0 +1,17 @@ +const RuntimeItem = require("./runtime_item.js"); +const ExpressionClass = require('../expression.js'); +module.exports = class Expression extends RuntimeItem { + constructor (id, properties = {}) { + super(id, properties); + this.value = new ExpressionClass(); + } + setValue(value) { + super.setValue(value); + if (value instanceof ExpressionClass) { + this.value = value.clone(); + return; + } + this.value._set(value); + this.value.dump('setValue'); + } +} diff --git a/src/definition_items/expression_reference.js b/src/definition_items/expression_reference.js deleted file mode 100644 index 6651b7c..0000000 --- a/src/definition_items/expression_reference.js +++ /dev/null @@ -1,3 +0,0 @@ -const RuntimeItem = require("./runtime_item.js"); -module.exports = class ExpressionReference extends RuntimeItem { -} diff --git a/src/definition_items/int_value.js b/src/definition_items/int_value.js index b14c3eb..7546696 100644 --- a/src/definition_items/int_value.js +++ b/src/definition_items/int_value.js @@ -1,5 +1,6 @@ const {assert, assertLog} = require('../assert.js'); const ValueItem = require("./value_item.js"); +const ExpressionItem = require('../expression_items/int_value.js'); module.exports = class IntValue extends ValueItem { constructor (value = 0n) { @@ -31,6 +32,9 @@ module.exports = class IntValue extends ValueItem { return value.value; } } + getItem() { + return new ExpressionItem(this.value); + } asInt() { return this.value; } diff --git a/src/definition_items/string_value.js b/src/definition_items/string_value.js index 13f493e..7cb9fb4 100644 --- a/src/definition_items/string_value.js +++ b/src/definition_items/string_value.js @@ -1,5 +1,6 @@ const {assert, assertLog} = require("../assert.js"); const RuntimeItem = require("./runtime_item.js"); +const StringValueItem = require("../expression_items/string_value.js"); module.exports = class StringValue extends RuntimeItem { constructor (id, properties) { @@ -12,7 +13,10 @@ module.exports = class StringValue extends RuntimeItem { return this.value; } setValue(value) { - assert(typeof value === 'string') + if (typeof value.asString === 'function') { + value = value.asString(); + } + assertLog(typeof value === 'string', value); this.value = value; return this.value; } @@ -24,4 +28,7 @@ module.exports = class StringValue extends RuntimeItem { super.cloneProperties(cloned); cloned.value = this.value; } + getItem() { + return new StringValueItem(this.value); + } } diff --git a/src/expression.js b/src/expression.js index 48d4df2..85ea3fe 100644 --- a/src/expression.js +++ b/src/expression.js @@ -1,22 +1,11 @@ const util = require('util'); const {cloneDeep} = require('lodash'); const {assert} = require("chai"); +const ExpressionOperationsInfo = require('./expression_operations_info.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); -const PilItem = require('./pil_item.js'); -const ReferenceItem = require("./expression_items/reference_item.js"); -const StackItem = require("./expression_items/stack_item.js"); -const ExpressionItem = require("./expression_items/expression_item.js"); -const ValueItem = require("./expression_items/value_item.js"); -const IntValue = require("./expression_items/int_value.js"); -const FeValue = require("./expression_items/fe_value.js"); -const ProofItem = require("./expression_items/proof_item.js"); -const Subproofval = require("./expression_items/subproofval.js"); -const Proofval = require("./expression_items/proofval.js"); -const WitnessCol = require("./expression_items/witness_col.js"); -const RuntimeItem = require("./expression_items/runtime_item.js"); -const FixedCol = require("./expression_items/fixed_col.js"); -const Public = require("./expression_items/public.js"); -const Challenge = require("./expression_items/challenge.js"); +const ExpressionItems = require("./expression_items.js"); +const ExpressionItem = ExpressionItems.ExpressionItem; +const ExpressionOperatorMethods = require('./expression_operator_methods.js'); const Context = require('./context.js'); const OP_VALUE = 'value'; const OP_ID_REF = 'idref'; @@ -39,44 +28,16 @@ module.exports = class Expression extends ExpressionItem { // value (bingint) // offset (number) - static parent; + static operatorsToMethodCache = {}; + static operators = ExpressionOperatorMethods; static context; - // TODO: add all operations as if, - static operations = { - mul: { type: 'arith', label: '*', prec: 96, args: 2, handle: (a, b) => a * b, handleFr: (Fr, a, b) => Fr.mul(a, b)}, - add: { type: 'arith', label: '+', prec: 10, args: 2, handle: (a, b) => a + b, handleFr: (Fr, a, b) => Fr.add(a, b)}, - sub: { type: 'arith', label: '-', prec: 11, args: 2, handle: (a, b) => a - b, handleFr: (Fr, a, b) => Fr.sub(a, b)}, - pow: { type: 'arith', label: '**', prec: 98, args: 2, handle: (a, b) => a ** b, handleFr: (Fr, a, b) => Fr.pow(a, b)}, - neg: { type: 'arith', label: '-', prec: 102, args: 1, handle: (a) => -a, handleFr: (Fr, a) => Fr.neg(a, b)}, - div: { type: 'arith', label: '/', prec: 94, args: 2, handle: (a, b) => a / b}, - mod: { type: 'arith', label: '%', prec: 92, args: 1, handle: (a, b) => a % b}, - gt: { type: 'cmp', label: '>', prec: 76, args: 2, handle: (a, b) => (a > b ? 1n : 0n)}, - ge: { type: 'cmp', label: '>=', prec: 72, args: 2, handle: (a, b) => (a >= b ? 1n : 0n)}, - lt: { type: 'cmp', label: '<', prec: 78, args: 2, handle: (a, b) => (a < b ? 1n : 0n)}, - le: { type: 'cmp', label: '<=', prec: 74, args: 2, handle: (a, b) => (a <= b ? 1n : 0n)}, - eq: { type: 'cmp', label: '==', prec: 66, args: 2, handle: (a, b) => (a == b ? 1n : 0n)}, - ne: { type: 'cmp', label: '!=', prec: 64, args: 2, handle: (a, b) => (a != b ? 1n : 0n)}, - and: { type: 'logical', label: '&&', prec: 46, args: 2, handle: (a, b) => (a && b ? 1n : 0n)}, - or: { type: 'logical', label: '||', prec: 44, args: 2, handle: (a, b) => (a || b ? 1n : 0n)}, - shl: { type: 'bit', label: '<<', prec: 86, args: 2, handle: (a, b) => (a << b ? 1n : 0n)}, - shr: { type: 'bit', label: '>>', prec: 84, args: 2, handle: (a, b) => (a >> b ? 1n : 0n)}, - band: { type: 'bit', label: '&', prec: 58, args: 2, handle: (a, b) => (a & b ? 1n : 0n)}, - bor: { type: 'bit', label: '|', prec: 56, args: 2, handle: (a, b) => (a | b ? 1n : 0n)}, - bxor: { type: 'bit', label: '^', prec: 54, args: 2, handle: (a, b) => (a ^ b ? 1n : 0n)}, - not: { type: 'logical', label: '!', prec: 100, args: 1, handle: (a) => (a ? 0n : 1n)}, - } constructor () { - super(); this.stack = []; this.fixedRowAccess = false; } - static setParent (parent) { - Expression.parent = parent; - } - get isExpression() { return true; } @@ -86,6 +47,9 @@ module.exports = class Expression extends ExpressionItem { cloned.pushStack(this); return cloned; } + emptyClone() { + return new Expression(); + } pushStack(e) { if (!(e instanceof Expression)) { @@ -179,7 +143,7 @@ module.exports = class Expression extends ExpressionItem { // TODO: review if best place? // TODO: review if next/prior // return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference' ); - return (this.isAlone() && this.stack[0].operands[0] instanceof ReferenceItem); + return (this.isAlone() && this.stack[0].operands[0] instanceof ExpressionItems.ReferenceItem); } // OP_VALUE (value) @@ -217,7 +181,7 @@ module.exports = class Expression extends ExpressionItem { return this.stack.some(st => this.isRuntimeStackPos(st)); } isRuntimeStackPos(st) { - return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(operand => operand instanceof RuntimeItem)); + return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(operand => operand instanceof ExpressionItems.RuntimeItem)); } /* isRuntimeOperand(ope) { return (ope.type === OP_RUNTIME); @@ -240,7 +204,7 @@ module.exports = class Expression extends ExpressionItem { } // let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; // this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); - let operandA = aIsEmpty ? [] : [new StackItem(1)]; + let operandA = aIsEmpty ? [] : [new ExpressionItems.StackItem(1)]; this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); return this; } @@ -248,10 +212,10 @@ module.exports = class Expression extends ExpressionItem { // !aIsAlone (aIsEmpty?) && !bIsAlone const count = this.pushStack(b); if (aIsEmpty) { - this.stack.push({op, operands: [new StackItem(1)]}); + this.stack.push({op, operands: [new ExpressionItems.StackItem(1)]}); return this; } - this.stack.push({op, operands: [new StackItem(count + 1), new StackItem(1)]}); + this.stack.push({op, operands: [new ExpressionItems.StackItem(count + 1), new ExpressionItems.StackItem(1)]}); return this; } @@ -357,7 +321,7 @@ module.exports = class Expression extends ExpressionItem { } } evaluateRuntime(op, deeply = false) { - let res = Expression.parent.evalRuntime(op, this, deeply); + let res = Context.expressions.evalRuntime(op, this, deeply); return res; } instanceValues() { @@ -449,7 +413,7 @@ module.exports = class Expression extends ExpressionItem { let stackResults = this.evaluateOperands(options); // this.instanceExpressions(options); this.evaluateFullStack(stackResults, options); - console.log('====[ RESULT ]====> ', stackResults[0][0]); + console.log('====[ RESULT ]====> ', stackResults[0][0], this.stack.length); return stackResults[this.stack.length-1][0]; } evaluateFullStack(stackResults, options) { @@ -502,30 +466,78 @@ module.exports = class Expression extends ExpressionItem { value = null; } else if (st.op === false) { value = values[0]; - } else if (values.some(value => value instanceof ProofItem)) { + } else if (values.some(value => value instanceof ExpressionItems.ProofItem)) { value = null; } else { + console.log(st.op); + console.log(values); value = this.applyOperation(st.op, values); + console.log(value); } results[0] = value; return value; } + /** + * get method name used to calculate an operation between types. + * @param {string} operation - operation to apply on operators + * @param {string[]|false} types - types of operators + * */ + operatorToMethod(operation, types) { + const key = 'operator_' + operation + (types === false ? '' : '_' +types.slice(1).join('_')); + let method = Expression.operatorsToMethodCache[key]; + if (!method) { + method = key.replace(/(\_\w)/g, x => x[1].toUpperCase()); + Expression.operatorsToMethodCache[key] = method; + } + return method; + } + /** + * apply operation over operands values + * @param {string} operation - operation to apply on operators + * @param {string[]|false} values - array of ExpressionItems + * */ applyOperation(operation, values) { - const opfunc = Expression.operations[operation] ?? false; - if (opfunc === false) { - throw new Error(`NOT FOUND OPERATION (${operation})`); + const operationInfo = ExpressionOperationsInfo.get(operation); + + if (operationInfo === false) { + throw new Error(`Operation ${operation} not was defined`); } - let value; - try { - console.log(values); - const intvalues = values.map(x => x.getValue()); - console.log(intvalues); - value = opfunc.handle.apply(this, intvalues); - } catch (e) { - console.log([{op: operation},...values]); - throw e; + + if (operationInfo.args !== values.length) { + throw new Error(`Invalid number of arguments on operation ${operation}, received ${values.length} values but was expected ${operationInfo.args}`); } - return new IntValue(value); + + // assert all values must be an ExpressionItem + values.map(value => assert(value instanceof ExpressionItem)); + + let types = values.map(x => x.constructor.name); + + // if number of values was less than 2 (means 1, always was equals) + const equals = values.length < 2 ? true : types.every(x => x === types[0]); + let reversed = false; + let methods = []; + + while (true) { + const method = this.operatorToMethod(operation, (equals ? false : types)); + methods.push(method); + console.log(`########### (${values[0].constructor.name}) METHOD ${method} ###########`); + console.log(values[0].__prototype__); + if (typeof values[0][method] === 'function') { + // instance call, first value (operand) is "this", arguments rest of values (operands) + return values[0][method](...values.slice(1)); + } else if (values[0].constructor.operators && typeof values[0].constructor.operators[method] === 'function') { + // static call with all values (operands) + return values[0].constructor.operators[method](...values); + } + if (equals || !operationInfo.commutative || operationInfo.args != 2 || reversed) { + break; + } + values = values.reverse(); + types = types.reverse(); + reversed = true; + } + + throw new Error(`Operation ${operation} not was defined by types ${types.join(',')} [${methods.join(', ')}]`); } evaluateValue(value, options) { console.log(value); @@ -538,15 +550,22 @@ module.exports = class Expression extends ExpressionItem { if (value instanceof Expression) { value.dump(); } - assert(value instanceof ExpressionItem); - if (value instanceof StackItem) { + assert(value instanceof ExpressionItems.ExpressionItem); + if (value instanceof ExpressionItems.StackItem) { return null; - } else if (value instanceof ValueItem) { + } else if (value instanceof ExpressionItems.ValueItem) { return value; - } else if (value instanceof ProofItem) { + } else if (value instanceof ExpressionItems.ProofItem) { return null; - } else if (value instanceof ReferenceItem) { - let res = Context.runtime.eval(value, {}); + } else if (value instanceof ExpressionItems.ReferenceItem) { + const res = Context.runtime.eval(value, {}); + console.log(value); + console.log(res); + return res; + } else if (value instanceof ExpressionItems.FunctionCall) { + console.log(util.inspect(value, false, 10, true)); + const res = value.eval(); + console.log(res); return res; } else { console.log(value); @@ -646,7 +665,7 @@ module.exports = class Expression extends ExpressionItem { return stackResults[pos][0]; } - if (stackResults[pos][1].some(x => !(x instanceof IntValue))) { + if (stackResults[pos][1].some(x => !(x instanceof ExprecloneDeepssionItems.IntValue))) { return null; } @@ -733,18 +752,15 @@ module.exports = class Expression extends ExpressionItem { } // this.simplifyRuntimeToValue(st); - const firstValue = st.operands[0] instanceof ValueItem ? st.operands[0].getValue() : false; - const secondValue = (st.operands.length > 1 && st.operands[1] instanceof ValueItem) ? st.operands[1].getValue() : false; + const firstValue = st.operands[0] instanceof ExpressionItems.ValueItem ? st.operands[0].getValue() : false; + const secondValue = (st.operands.length > 1 && st.operands[1] instanceof ExpressionItems.ValueItem) ? st.operands[1].getValue() : false; // [op,v1,v2] ==> [v1 op v2] if (firstValue !== false && secondValue !== false) { assert(!firstValue || (!firstValue.next && !firstValue.__next)); assert(!secondValue || (!secondValue.next && !secondValue.__next)); - const res = this.calculate(st); - if (res === null) return false; - // TODO: operations with FE ? - console.log(res); - st.operands = new IntValue(res); + const res = this.applyOperation(st.op, st.operands); + st.operands = [res]; st.op = false; return true; } @@ -823,7 +839,7 @@ module.exports = class Expression extends ExpressionItem { const ope = st.operands[0]; // two situations, for alone stack reference, use its reference and it must // be purged - translate[istack] = ope instanceof StackItem ? [true, translate[ope.getAbsolutePos(istack)][1]] : [true, istack]; + translate[istack] = ope instanceof ExpressionItems.StackItem ? [true, translate[ope.getAbsolutePos(istack)][1]] : [true, istack]; continue; } @@ -832,7 +848,7 @@ module.exports = class Expression extends ExpressionItem { // foreach operand if it's a stack reference, must be replaced by // new reference or by copy of reference if it was alone (no operation) for (let iope = 0; iope < st.operands.length; ++iope) { - if ((st.operands[iope] instanceof StackItem) === false) continue; + if ((st.operands[iope] instanceof ExpressionItems.StackItem) === false) continue; const absolutePos = st.operands[iope].getAbsolutePos(istack); const [purge, newAbsolutePos] = translate[absolutePos]; assert(absolutePos < istack); @@ -905,7 +921,7 @@ module.exports = class Expression extends ExpressionItem { return Expression.parent.evaluateReference(e); } /* evaluateRuntime(e) { - // function_call op:'call' function: arguments: + // function_call op:'call' function: args: // positional_param op:'positional_param' position: // casting op:'cast' cast: value: dim: ?? }*/ @@ -985,34 +1001,35 @@ module.exports = class Expression extends ExpressionItem { } return this.stackPosToString(top ,0, {...options, dumpToString: true}); } - stackPosToString(pos, pprec, options) { + stackPosToString(pos, parentPrecedence, options) { const st = this.stack[pos]; if (typeof st === 'undefined') { console.log(pos); console.log(this.stack); } if (st.op === false) { - return this.operandToString(st.operands[0], pos, pprec, options); + return this.operandToString(st.operands[0], pos, parentPrecedence, options); } - const opinfo = Expression.operations[st.op]; + const operationInfo = ExpressionOperationsInfo.get(st.op); + const operationLabel = operationInfo.label; let res; if (st.operands.length === 1) { - res = Expression.operations[st.op].label + this.operandToString(st.operands[0], pos, opinfo.prec, options); + res = operationLabel + this.operandToString(st.operands[0], pos, operationInfo.precedence, options); } else if (st.operands.length === 2) { - res = this.operandToString(st.operands[0], pos, opinfo.prec, options) + ' ' + Expression.operations[st.op].label + ' ' + - this.operandToString(st.operands[1], pos, opinfo.prec, options); + res = this.operandToString(st.operands[0], pos, operationInfo.precedence, options) + ' ' + operationLabel + ' ' + + this.operandToString(st.operands[1], pos, operationInfo.precedence, options); } else { TODO_EXIT } - if (pprec > opinfo.prec) { + if (parentPrecedence > operationInfo.precedence) { res = '(' + res + ')'; } return res; } - operandToString(ope, pos, pprec, options) { - if (ope instanceof StackItem) { - return this.stackPosToString(pos-ope.offset, pprec, options); + operandToString(ope, pos, parentPrecedence, options) { + if (ope instanceof ExpressionItems.StackItem) { + return this.stackPosToString(pos-ope.offset, parentPrecedence, options); } return ope.dump(options); /* @@ -1080,11 +1097,11 @@ module.exports = class Expression extends ExpressionItem { } operandPack(container, ope, pos, options) { - if (ope instanceof ValueItem) { + if (ope instanceof ExpressionItems.ValueItem) { container.pushConstant(ope.value); - } else if (ope instanceof ProofItem) { + } else if (ope instanceof ExpressionItems.ProofItem) { this.referencePack(container, ope, options); - } else if (ope instanceof StackItem) { + } else if (ope instanceof ExpressionItems.StackItem) { const eid = this.stackPosPack(container, pos-ope.getOffset(), options); if (eid !== false) { // eid === false => alone operand container.pushExpression(eid); @@ -1102,30 +1119,30 @@ module.exports = class Expression extends ExpressionItem { const id = ope.getId(); const def = Context.references.getDefinitionByItem(ope); assert(def !== false); - if (ope instanceof WitnessCol) { + if (ope instanceof ExpressionItems.WitnessCol) { // container.pushWitnessCol(id, next ?? 0, stage ?? 1) console.log(ope); // CURRENT ERROR: in this scope definition not available. console.log(def); container.pushWitnessCol(id, ope.getNext(), def.stage); - } else if (ope instanceof FixedCol) { + } else if (ope instanceof ExpressionItems.FixedCol) { // container.pushFixedCol(id, next ?? 0); container.pushFixedCol(id, ope.getNext()); - } else if (ope instanceof Public) { + } else if (ope instanceof ExpressionItems.Public) { // container.pushPublicValue(id) container.pushPublicValue(id); - } else if (ope instanceof Challenge) { + } else if (ope instanceof ExpressionItems.Challenge) { // container.pushChallenge(id, stage ?? 1); container.pushChallenge(id, ope.getStage()); - } else if (ope instanceof Proofval) { + } else if (ope instanceof ExpressionItems.Proofval) { // container.pushProofValue(id) container.pushProofValue(id); - } else if (ope instanceof Subproofval) { + } else if (ope instanceof ExpressionItems.Subproofval) { // container.pushSubproofValue(id) container.pushSubproofValue(id); } else { @@ -1139,4 +1156,45 @@ module.exports = class Expression extends ExpressionItem { } return res; } + asBool() { + this.dump(); + let res = this.eval(); + res.dump(); + if (res instanceof Expression) { + res = res.getAloneOperand(); + } + assert((res instanceof Expression) === false); + if (typeof res.asBool === 'function') { + return res.asBool(); + } + console.log(res); + EXIT_HERE; + } + asIntItem() { + return new ExpressionItems.IntValue(this.asInt()); + } + asInt() { + let res = this.eval(); + assert((res instanceof Expression) === false); + if (typeof res.asInt === 'function') { + return res.asInt(); + } + console.log(res); + EXIT_HERE; + } + asString() { + return this.toString(); + } + asStringItem() { + return new ExpressionItems.StringValue(this.asString()); + } + getValue() { + return this.eval(); + } + operatorAddExpressionIntValue(valueA, valueB) { + EXIT_HERE; + } + operatorAdd(valueA, valueB) { + EXIT_HERE; + } } diff --git a/src/expression_factory.js b/src/expression_factory.js index 4b1d5c7..54c0cf1 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -1,28 +1,29 @@ const util = require('util'); const {cloneDeep} = require('lodash'); const Expression = require("./expression.js"); -const {ReferenceItem, IntValue} = require("./expression_items.js"); +const {ReferenceItem, IntValue, StringValue, + FunctionCall} = require("./expression_items.js"); const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); module.exports = class ExpressionFactory { // pre function to delete property op only used by routing - static router = new Router(this, 'op', {defaultPrefix: 'from', pre: (method, obj) => delete obj.op}); + static router = new Router(this, 'type', {defaultPrefix: 'from', pre: (method, obj) => delete obj.type}); static fromObject(obj) { if (obj instanceof Expression) { return obj; } console.log(obj); - assert(typeof obj === 'object'); - assert(obj.type == 'expr'); + assertLog(typeof obj === 'object', obj); + assertLog(typeof obj.op === 'undefined', obj); obj = {...obj}; - delete obj.type; - assert(obj.op !== 'object' && obj.op !== 'objects'); + assert(obj.type !== 'object' && obj.type !== 'objects'); if (obj.dim === 0) delete obj.dim; if (obj.next === 0 || obj.next === false) delete obj.next; + console.log(obj); let item = ExpressionFactory.router.go(obj); let unknownProperties = []; @@ -61,12 +62,29 @@ module.exports = class ExpressionFactory { delete obj.value; return res; } + static fromString(obj) { + let res = new StringValue(obj.value); + delete obj.value; + return res; + } static fromCall(obj) { - let res = new FunctionCall(obj.name, obj.arguments ?? [], obj.indexes ?? []); - delete obj.name; + console.log('CALL'); + console.log(util.inspect(obj, false, 10, true)); + let res = new FunctionCall(obj.function.name, obj.args ?? [], obj.indexes ?? [], { + name: obj.function.name.debug}); + console.log(res); + delete obj.function; delete obj.indexes; delete obj.dim; - delete obj.arguments; + delete obj.args; + return res; + } + static fromCast(obj) { + let res = new FunctionCall('cast', [obj.cast, obj.value], []); + delete obj.name; + delete obj.cast; + delete obj.value; + console.log(res); return res; } // TODO: positionalParams diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index f135ba2..4a23808 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -56,9 +56,18 @@ module.exports = class ExpressionItem { static _classToManager = {}; - dump(options) { + constructor(debug = {}) { + this.debug = debug; + } + static registerClass(name, cls) { + ExpressionItem[name] = cls; + } + toString(options) { return `${this.constructor.name}()`; } + dump(options) { + return this.toString(options); + } get type() { console.log(this); throw new Error(`FATAL: use type obsolete-property`) diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index b305c49..fb7549a 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -1,21 +1,31 @@ +const util = require('util'); const RuntimeItem = require("./runtime_item.js"); +const Context = require('../context.js'); module.exports = class FunctionCall extends RuntimeItem { - constructor (name, args = [], indexes = []) { - super(); + constructor (name, args = [], indexes = [], debug = {}) { + super(debug); this.name = name; this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); this.indexes = indexes.map(x => (typeof x.clone === 'function') ? x.clone() : x); + console.log(`############## ARGS(${name},${this.args.length}) ######################`); + console.log(util.inspect(args, false, 10, true)); } setFunction(funcdef) { this.funcdef = funcdef; } dump(options) { - const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; - const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; - return `Function(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + const indexes = this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''; + const args = '(' + this.args.map(x => x.toString()).join(',') +')'; + return this.name + args + indexes; } clone() { let cloned = new FunctionCall(this.name, this.args, this.indexes); cloned.funcdef = this.funcdef; } + eval(options) { + const definition = Context.references.get(this.name, options); + const res = Context.processor.executeFunctionCall(this.name, this); + console.log(res); + return res; + } } diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index d138b54..8c2f7bb 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -1,7 +1,7 @@ const {assert, assertLog} = require('../assert.js'); const ValueItem = require("./value_item.js"); -module.exports = class IntValue extends ValueItem { +class IntValue extends ValueItem { constructor (value = 0n) { if (value instanceof IntValue) { value = value.value; @@ -38,4 +38,79 @@ module.exports = class IntValue extends ValueItem { asNumber() { return Number(this.value); } + asBool() { + return Number(this.value) != 0; + } + asStringItem() { + return new ValueItem.StringValue(this.asString()); + } + asString() { + return this.value.toString(); + } + operatorAdd(valueB) { + return new IntValue(this.asInt() + valueB.asInt()); + } + operatorSub(valueB) { + return new IntValue(this.asInt() - valueB.asInt()); + } + operatorMul(valueB) { + return new IntValue(this.asInt() * valueB.asInt()); + } + operatorDiv(valueB) { + return new IntValue(this.asInt() / valueB.asInt()); + } + operatorMod(valueB) { + return new IntValue(this.asInt() % valueB.asInt()); + } + operatorNeg() { + return new IntValue(-this.asInt()); + } + operatorShl(valueB) { + return new IntValue(this.asInt() << valueB.asInt()); + } + operatorShr(valueB) { + return new IntValue(this.asInt() >> valueB.asInt()); + } + operatorBand(valueB) { + return new IntValue(this.asInt() & valueB.asInt()); + } + operatorBor(valueB) { + return new IntValue(this.asInt() | valueB.asInt()); + } + operatorBxor(valueB) { + return new IntValue(this.asInt() ^ valueB.asInt()); + } + operatorNot() { + return new IntValue(this.asInt() ? 0n : 1n); + } + operatorGt(valueB) { + return new IntValue(this.asInt() > valueB.asInt() ? 1n : 0n); + } + operatorGe(valueB) { + return new IntValue(this.asInt() >= valueB.asInt() ? 1n : 0n); + } + operatorLt(valueB) { + return new IntValue(this.asInt() < valueB.asInt() ? 1n : 0n); + } + operatorLe(valueB) { + return new IntValue(this.asInt() <= valueB.asInt() ? 1n : 0n); + } + operatorNe(valueB) { + return new IntValue(this.asInt() == valueB.asInt() ? 0n : 1n); + } + operatorAnd(valueB) { + return new IntValue((this.asInt() && valueB.asInt()) ? 1n : 0n); + } + operatorOr(valueB) { + return new IntValue((this.asInt() || valueB.asInt()) ? 1n : 0n); + } + operatorPow(valueB) { + return new IntValue(this.asInt()**valueB.asInt()); + } + operatorEq(valueB) { + return new IntValue(this.asInt() == valueB.asInt() ? 1:0); + } } + +ValueItem.registerClass('IntValue', IntValue); +module.exports = IntValue; \ No newline at end of file diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index 1b1a97f..af02ed4 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -8,7 +8,7 @@ module.exports = class ReferenceItem extends RuntimeItem { } dump(options) { const [pre,post] = this.getNextStrings(); - return `ReferenceItem(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; + return `${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post}`; } clone() { return new ReferenceItem(this.name, this.indexes, this.next); diff --git a/src/expression_items/runtime_item.js b/src/expression_items/runtime_item.js index a15a42a..78878b2 100644 --- a/src/expression_items/runtime_item.js +++ b/src/expression_items/runtime_item.js @@ -1,5 +1,8 @@ const LabelRanges = require("../label_ranges.js"); const ExpressionItem = require("./expression_item.js"); module.exports = class RuntimeItem extends ExpressionItem { + constructor(debug = {}) { + super(debug); + } } diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index d225ed4..f34fd28 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -1,21 +1,39 @@ const {assert, assertLog} = require("../assert.js"); const RuntimeItem = require("./runtime_item.js"); - -module.exports = class StringValue extends RuntimeItem { +class StringValue extends RuntimeItem { constructor (value = '') { super(); assertLog(typeof value === 'string', value); this.value = value; } + get isBaseType () { + return true; + } + toString(options) { + return '"'+this.value+'"'; + } getValue() { return this.value; } setValue(value) { - assert(typeof value === 'string') + assertLog(typeof value === 'string', value); this.value = value; return this.value; } + asString() { + return this.value; + } + asStringItem() { + return this.clone(); + } clone() { return new StringValue(this.value); } + operatorEq(valueB) { + return new RuntimeItem.IntValue(this.asString() === valueB.asString() ? 1:0); + } + } + +RuntimeItem.registerClass('StringValue', StringValue); +module.exports = StringValue; diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index 50ffc0e..5319aaf 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -1,11 +1,13 @@ const ExpressionItem = require("./expression_item.js"); - module.exports = class ValueItem extends ExpressionItem { static directValue = true; constructor (value) { super(); this.value = value; } + get isBaseType () { + return true; + } getValue() { return this.value; } @@ -18,4 +20,10 @@ module.exports = class ValueItem extends ExpressionItem { clone() { return new ValueItem(this.value); } + asString() { + return this.value.toString(); + } + asStringType() { + return new ExpressionItem.StringValue(this.asString()); + } } diff --git a/src/expression_operations_info.js b/src/expression_operations_info.js new file mode 100644 index 0000000..ebe89fb --- /dev/null +++ b/src/expression_operations_info.js @@ -0,0 +1,29 @@ +module.exports = class ExpressionOperationsInfo { + static #operations = { + mul: { type: 'arith', label: '*', precedence: 96, args: 2, commutative: true }, + add: { type: 'arith', label: '+', precedence: 10, args: 2, commutative: true }, + sub: { type: 'arith', label: '-', precedence: 11, args: 2, commutative: false }, + pow: { type: 'arith', label: '**', precedence: 98, args: 2, commutative: false }, + neg: { type: 'arith', label: '-', precedence: 102, args: 1, commutative: false }, + div: { type: 'arith', label: '/', precedence: 94, args: 2, commutative: false }, + mod: { type: 'arith', label: '%', precedence: 92, args: 1, commutative: false }, + gt: { type: 'cmp', label: '>', precedence: 76, args: 2, commutative: false }, + ge: { type: 'cmp', label: '>=', precedence: 72, args: 2, commutative: false }, + lt: { type: 'cmp', label: '<', precedence: 78, args: 2, commutative: false }, + le: { type: 'cmp', label: '<=', precedence: 74, args: 2, commutative: false }, + eq: { type: 'cmp', label: '==', precedence: 66, args: 2, commutative: true }, + ne: { type: 'cmp', label: '!=', precedence: 64, args: 2, commutative: true }, + and: { type: 'logical', label: '&&', precedence: 46, args: 2, commutative: true }, + or: { type: 'logical', label: '||', precedence: 44, args: 2, commutative: true }, + shl: { type: 'bit', label: '<<', precedence: 86, args: 2, commutative: false }, + shr: { type: 'bit', label: '>>', precedence: 84, args: 2, commutative: false }, + band: { type: 'bit', label: '&', precedence: 58, args: 2, commutative: true }, + bor: { type: 'bit', label: '|', precedence: 56, args: 2, commutative: true }, + bxor: { type: 'bit', label: '^', precedence: 54, args: 2, commutative: true }, + not: { type: 'logical', label: '!', precedence: 100, args: 1, commutative: false } + }; + + static get(operation) { + return ExpressionOperationsInfo.#operations[operation] ?? false; + } +}; diff --git a/src/expression_operator_methods.js b/src/expression_operator_methods.js new file mode 100644 index 0000000..37da14e --- /dev/null +++ b/src/expression_operator_methods.js @@ -0,0 +1,23 @@ +const util = require('util'); +const {assert} = require("chai"); +const ExpressionItem = require('./expression_items/expression_item.js'); +module.exports = class ExpressionOperatorMethods { + static operatorAddIntValue(valueA, valueB) { + let res = valueA.clone(); + let expressionB = valueA.emptyClone(); + expressionB._set(valueB); + res.insert('add', expressionB); + res.simplify(); + return res; + } + static operatorAdd(valueA, valueB) { + let res = valueA.clone(); + res.insert('add', valueB); + res.simplify(); + return res; + } + static operatorEqIntValue(valueA, valueB) { + let res = valueA.eval(); + return new ExpressionItem.IntValue(res.asInt() === valueB.asInt() ? 1n : 0n); + } +} diff --git a/src/expressions.js b/src/expressions.js index fc90f40..b8db840 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -9,7 +9,6 @@ module.exports = class Expressions { this.expressions = []; this.packedIds = []; this.labelRanges = new LabelRanges(); - Expression.setParent(this); } clone() { let cloned = Object.assign(Object.create(Object.getPrototypeOf(this)), this); diff --git a/src/function.js b/src/function.js index b1b289b..8d518c6 100644 --- a/src/function.js +++ b/src/function.js @@ -45,10 +45,11 @@ module.exports = class Function { } } mapArguments(s) { + console.log('##### MAP ARGUMENTS #######'); // TODO: class o class-by-type to convert, cast, copy... between types /* - for (const arg of s.arguments) { + for (const arg of s.args) { console.log(arg); if (arg.stack && arg.stack[0]) { console.log(arg.stack[0].operands); @@ -56,7 +57,7 @@ module.exports = class Function { } */ // mapArgument was called before enter on function visibility scope because - // inside function arguments "values" aren't visible. + // inside function args "values" aren't visible. let iarg = 0; for (const name in this.args) { // console.log(`MAP-ARGUMENTS ${this.name} (arg[${iarg}]: ${name})`); @@ -66,7 +67,7 @@ module.exports = class Function { const argDim = arg.dim ? arg.dim : 0; if (arg.reference) { // console.log(`${this.name}.MAP-REFERENCE`); - const ref = s.arguments[iarg].getReference(); + const ref = s.args[iarg].getReference(); // special case of col, could be witness, fixed or im if (type === 'col') { @@ -77,15 +78,15 @@ module.exports = class Function { console.log(type); console.log(ref); console.log(argDim); - console.log(s.arguments[iarg].getAloneOperand()); + console.log(s.args[iarg].getAloneOperand()); throw new Error(`Invalid array on ${Context.sourceRef}`); } Context.processor.declareReference(name, type, ref.array ? ref.array.lengths : []); Context.references.setReference(name, ref); } else if (arg.type === 'int' || arg.type === 'fe') { if (argDim) { - s.arguments[iarg].eval(); - const ref = s.arguments[iarg].getReference(); + s.args[iarg].eval(); + const ref = s.args[iarg].getReference(); console.log(ref); console.log(ref.name); const def = Context.references.getDefinition(ref.name); @@ -98,32 +99,32 @@ module.exports = class Function { Context.processor.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); } else { - const value = Context.processor.expressions.eval(s.arguments[iarg]); + const value = Context.processor.expressions.eval(s.args[iarg]); // TODO: review? no referece? Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } } else { // console.log(`MAP-${arg.type}`); // TODO: type conversion, mapping in other class - if (s.arguments[iarg].type === 'expression_list') { + if (s.args[iarg].type === 'expression_list') { // check (argDim === 1 && arg.type === 'expr') - const list = new List(this, s.arguments[iarg], false); - const values = s.arguments[iarg].values; + const list = new List(this, s.args[iarg], false); + const values = s.args[iarg].values; Context.processor.declareReference(name, type, [values.length], {}); let index = 0; for (const value of list.values) { // console.log(value); Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); } - } else if (!(s.arguments[iarg] instanceof Expression)) { + } else if (!(s.args[iarg] instanceof Expression)) { console.log(arg); - console.log(s.arguments[iarg]); + console.log(s.args[iarg]); EXIT_HERE; } else { - // const value = s.arguments[iarg].instance().getAloneOperand(); - // const value = s.arguments[iarg].getAloneOperand(); - // const value = s.arguments[iarg].getReference(); - const value = s.arguments[iarg].evaluateAloneReference(); + // const value = s.args[iarg].instance().getAloneOperand(); + // const value = s.args[iarg].getAloneOperand(); + // const value = s.args[iarg].getReference(); + const value = s.args[iarg].evaluateAloneReference(); const dim = value.array ? value.array.dim : 0; if (dim !== argDim) { throw new Error(`Invalid array on ${Context.sourceRef}`); diff --git a/src/indexable.js b/src/indexable.js index ad369a3..4e9e6a1 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -78,7 +78,14 @@ module.exports = class Indexable { // get expression item to add in a expression getItem(id, properties) { let res = this.values[id]; + if (typeof res.getItem === 'function') { + return res.getItem(); + } if (this.expressionItemClass && (res instanceof this.expressionItemClass) === false) { + if (typeof res.value !== 'undefined' && res.value instanceof this.expressionItemClass) { + return res.value.clone(); + } + // REVIEW, empty properties properties = properties ?? {}; res = new this.expressionItemClass(id); for (const property in properties) { @@ -109,10 +116,9 @@ module.exports = class Indexable { return this.values.length; } set(id, value) { - console.log(this.values[id]); - console.log(value); - if (this.values[id] && this.values[id].constructor) console.log(this.values[id].constructor.name) - this.values[id].setValue(value); + const item = this.get(id); + assertLog(item !== null && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, item: item}); + item.setValue(value); /* if (typeof this.cls === 'function') { if ((value instanceof this.cls) === false) { diff --git a/src/list.js b/src/list.js index 3512d9f..dd02876 100644 --- a/src/list.js +++ b/src/list.js @@ -1,3 +1,4 @@ +const Context = require('./context.js'); const Router = require("./router.js"); const Expression = require("./expression.js"); @@ -61,7 +62,7 @@ module.exports = class List { _extendAppendReferences(e) { console.log("================= appendReferences =================="); let values = []; - const info = Expression.parent.getReferenceInfo(e.value); + const info = Context.expressions.getReferenceInfo(e.value); let element = e.value.instance().getAloneOperand(); if (!element.array || element.array.dim < 1) { throw new Error(`Could not extend and append a non array element`) diff --git a/src/pil_parser.jison b/src/pil_parser.jison index ba36fa3..019011e 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -633,13 +633,13 @@ data_object { $$ = $1; $$.data[$3] = $5 } | data_object ',' IDENTIFIER - { $$ = $1; $$.data[$3] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $3 }) } + { $$ = $1; $$.data[$3] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $3 }) } | IDENTIFIER ':' data_value { $$ = { type: 'object', data: {}}; $$.data[$1] = $3 } | IDENTIFIER - { $$ = {data: {}}; $$.data[$1] = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, name: $1 }) } + { $$ = {data: {}}; $$.data[$1] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $1 }) } ; data_array @@ -652,7 +652,7 @@ data_array function_call : name_optional_index '(' multiple_expression_list ')' - { $$ = { op: 'call', function: $1, arguments: $3.values } } + { $$ = { type: 'call', function: $1, args: $3.values } } ; delayed_function_event @@ -675,7 +675,7 @@ defined_scopes delayed_function_call : ON delayed_function_event defined_scopes name_optional_index '(' multiple_expression_list ')' - { $$ = { type: 'delayed_function_call', event: $2, scope: $3, function: $4, arguments: $6.values } } + { $$ = { type: 'delayed_function_call', event: $2, scope: $3, function: $4, args: $6.values } } ; @@ -1245,7 +1245,7 @@ expression { $$ = $1.insert('in', ExpressionFactory.fromObject($3)) } | expression IS return_type %prec IS - { $$ = $1.insert('is', ExpressionFactory.fromObject({op: 'type', vtype: $3.type, dim: $3.dim})); } + { $$ = $1.insert('is', ExpressionFactory.fromObject({type: 'istype', vtype: $3.type, dim: $3.dim})); } | expression AND expression %prec AND { $$ = $1.insert('and', ExpressionFactory.fromObject($3)) } @@ -1302,25 +1302,25 @@ expression { $$ = $2.insert('neg') } | name_id - { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$1 }) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$1 }) } | INC name_id - { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$2, inc: 'pre'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$2, inc: 'pre'}) } | DEC name_id - { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$2, dec: 'pre'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$2, dec: 'pre'}) } | name_id INC %prec INC_LEFT - { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$1, inc: 'post'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$1, inc: 'post'}) } | name_id DEC %prec DEC_LEFT - { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'reference', next: false, ...$1, dec: 'post'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$1, dec: 'post'}) } | NUMBER %prec EMPTY - { $$ = ExpressionFactory.fromObject({ type: 'expr', op: 'number', value: BigInt($1)}) } + { $$ = ExpressionFactory.fromObject({ type: 'number', value: BigInt($1)}) } | flexible_string %prec EMPTY - { $$ = ExpressionFactory.fromObject({...$1, op: 'string'}) } + { $$ = ExpressionFactory.fromObject({...$1, type: 'string'}) } | '(' expression ')' { $$ = $2 } @@ -1329,7 +1329,7 @@ expression { $$ = ExpressionFactory.fromObject({...$1}) } | POSITIONAL_PARAM - { $$ = ExpressionFactory.fromObject({position: $1, op: 'positional_param'}) } + { $$ = ExpressionFactory.fromObject({position: $1, type: 'positional_param'}) } | casting { $$ = ExpressionFactory.fromObject({...$1}) } @@ -1340,34 +1340,34 @@ expression casting : INT '(' expression ')' - { $$ = { op: 'cast', cast: 'int', value: $3} } + { $$ = { type: 'cast', cast: 'int', value: $3} } | FE '(' expression ')' - { $$ = { op: 'cast', cast: 'fe', value: $3 } } + { $$ = { type: 'cast', cast: 'fe', value: $3 } } | EXPR '(' expression ')' - { $$ = { op: 'cast', cast: 'expr', value: $3 } } + { $$ = { type: 'cast', cast: 'expr', value: $3 } } | COL '(' expression ')' - { $$ = { op: 'cast', cast: 'col', value: $3 } } + { $$ = { type: 'cast', cast: 'col', value: $3 } } | T_STRING '(' expression ')' - { $$ = { op: 'cast', cast: 'string', value: $3 } } + { $$ = { type: 'cast', cast: 'string', value: $3 } } | INT type_array '(' expression ')' - { $$ = { ...$2, op: 'cast', cast: 'int', value: $4 } } + { $$ = { ...$2, type: 'cast', cast: 'int', value: $4 } } | FE type_array '(' expression ')' - { $$ = { ...$2, op: 'cast', cast: 'fe', value: $4 } } + { $$ = { ...$2, type: 'cast', cast: 'fe', value: $4 } } | EXPR type_array '(' expression ')' - { $$ = { ...$2, op: 'cast', cast: 'expr', value: $4 } } + { $$ = { ...$2, type: 'cast', cast: 'expr', value: $4 } } | COL type_array '(' expression ')' - { $$ = { ...$2, op: 'cast', cast: 'col', value: $4 } } + { $$ = { ...$2, type: 'cast', cast: 'col', value: $4 } } | T_STRING type_array '(' expression ')' - { $$ = { ...$2, op: 'cast', cast: 'string', value: $4 } } + { $$ = { ...$2, type: 'cast', cast: 'string', value: $4 } } ; name_id @@ -1381,7 +1381,7 @@ name_id { $$ = { ...$1, next:$4 } } | name_optional_index "'" POSITIONAL_PARAM - { $$ = { ...$1, next: ExpressionFactory.fromObject({position: $3, op: 'positional_param'}) } } + { $$ = { ...$1, next: ExpressionFactory.fromObject({position: $3, type: 'positional_param'}) } } | "'" name_optional_index %prec LOWER_PREC { $$ = { ...$2, prior:1 } } @@ -1393,7 +1393,7 @@ name_id { $$ = { ...$5, prior:$2 } } | POSITIONAL_PARAM "'" name_optional_index - { $$ = { ...$3, prior: ExpressionFactory.fromObject({position: $1, op: 'positional_param'}) } } + { $$ = { ...$3, prior: ExpressionFactory.fromObject({position: $1, type: 'positional_param'}) } } | name_optional_index %prec EMPTY { $$ = $1 } diff --git a/src/processor.js b/src/processor.js index e6a6dea..f0a69c1 100644 --- a/src/processor.js +++ b/src/processor.js @@ -58,7 +58,7 @@ module.exports = class Processor { this.fes = new Variables('fe', DefinitionItems.FeValue, ExpressionItems.FeValue); this.references.register('fe', this.fes); - this.strings = new Variables('string', DefinitionItems.StringValue, ExpressionItems.FeValue); + this.strings = new Variables('string', DefinitionItems.StringValue, ExpressionItems.StringValue); this.references.register('string', this.strings); this.exprs = new Variables('expr', DefinitionItems.Expression, Expression); @@ -136,6 +136,7 @@ module.exports = class Processor { const builtInCls = require(__dirname + '/builtin/'+ filename); const builtInObj = new builtInCls(this); this.builtIn[builtInObj.name] = builtInObj; + this.references.declare(builtInObj.name, 'function', [], [], builtInObj); } } insideFunction() { @@ -259,8 +260,8 @@ module.exports = class Processor { console.log(st); this.error(st, `Invalid statement (without type)`); } - // console.log(`## DEBUG ## ${this.executeCounter}.${this.executeStatementCounter} ${st.debug}` ); const method = ('exec_'+st.type).replace(/[-_][a-z]/g, (group) => group.slice(-1).toUpperCase()); + console.log(`## DEBUG ## ${this.executeCounter}.${this.executeStatementCounter} ${method} ${st.debug}` ); if (!(method in this)) { console.log('==== ERROR ===='); this.error(st, `Invalid statement type: ${st.type}`); @@ -283,6 +284,26 @@ module.exports = class Processor { this.execute(st.statements); this.scope.popInstanceType(); } + executeFunctionCall(name, callinfo) { + const func = this.builtIn[name] ?? this.references.get(name); + console.log(callinfo); + + if (func) { + this.callstack.push(name); + ++this.functionDeep; + this.scope.push(); + console.log(func.constructor.name); + const mapInfo = func.mapArguments(callinfo); + this.references.pushVisibilityScope(); + const res = func.exec(callinfo, mapInfo); + this.references.popVisibilityScope(); + this.scope.pop(); + --this.functionDeep; + this.callstack.pop(); + return res; + } + this.error({}, `Undefined function ${name}`); + } execCall(st) { const name = st.function.name; const func = this.builtIn[name] ?? this.references.get(name); @@ -689,7 +710,7 @@ module.exports = class Processor { return false; } for (const fname in this.delayedCalls[scope][event]) { - this.execCall({ op: 'call', function: {name: fname}, arguments: [] }); + this.execCall({ op: 'call', function: {name: fname}, args: [] }); } } execWitnessColDeclaration(s) { @@ -761,7 +782,7 @@ module.exports = class Processor { const scope = s.scope; const fname = s.function.name; const event = s.event; - if (s.arguments.length > 0) { + if (s.args.length > 0) { throw new Error('delayed function call arguments are not yet supported'); } if (event !== 'final') { @@ -782,6 +803,7 @@ module.exports = class Processor { this.delayedCalls[scope][event][fname].sourceRefs.push(this.context.sourceRef); } execExpr(s) { + console.log(s.expr); this.expressions.eval(s.expr); } decodeNameAndLengths(s) { @@ -892,15 +914,21 @@ module.exports = class Processor { let initValue = null; if (init) { console.log(s.vtype); - if (s.vtype === 'expr') { - // s.init[index].expr.dump('INIT1 '+name); - console.log(s.init[index]); - initValue = s.init[index].eval(); - console.log(initValue); - // initValue.dump('INIT2 '+name); - } - else { - initValue = new ExpressionItems.IntValue(this.expressions.e2value(s.init[index])); + switch (s.vtype) { + case 'expr': + // s.init[index].expr.dump('INIT1 '+name); + console.log(s.init[index]); + initValue = s.init[index].eval(); + console.log(initValue); + // initValue.dump('INIT2 '+name); + break; + case 'int': + console.log(s); + initValue = new ExpressionItems.IntValue(this.expressions.e2value(s.init[index])); + break; + case 'string': + initValue = new ExpressionItems.StringValue(this.expressions.e2value(s.init[index])); + break; } } console.log(initValue); diff --git a/src/reference.js b/src/reference.js index 671f44f..79ccdff 100644 --- a/src/reference.js +++ b/src/reference.js @@ -48,10 +48,11 @@ module.exports = class Reference { } getItem(indexes, options = {}) { if (Array.isArray(indexes) && indexes.length === 0) { - console.log(this.instance); - return this.instance.getItem(this.locator); + const res = this.instance.getItem(this.locator); + console.log(res); + return res; } - console.log(indexes, indexes === [], this); + console.log(indexes, this); console.log(indexes, options); EXIT_HERE_TODO; } diff --git a/src/references.js b/src/references.js index cf6587a..230b1b6 100644 --- a/src/references.js +++ b/src/references.js @@ -396,7 +396,7 @@ module.exports = class References { isVisible(def) { return !def.scopeId || def.type === 'constant' || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } - getReference(name, defaultValue) { + getReference(name, defaultValue, debug = {}) { // if more than one name is sent, use the first one (mainName). Always first name it's directly // name defined on source code, second optionally could be name with subproof, because as symbol is // stored with full name. diff --git a/src/runtime.js b/src/runtime.js index 72a15fe..e89a75f 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -2,17 +2,16 @@ const util = require('util'); const Expression = require('./expression.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const {assert, assertLog} = require('./assert.js'); -const {ReferenceItem, StackItem, ExpressionItem, ValueItem, IntValue, ProofItem} = require("./expression_items.js"); +const ExpressionItems = require("./expression_items.js"); const Context = require('./context.js'); module.exports = class Runtime { eval(operand, options) { - if (operand instanceof ReferenceItem) { + if (operand instanceof ExpressionItems.ReferenceItem || operand instanceof ExpressionItems.FunctionCall) { return this.resolveReference(operand, options); } - EXIT_HERE; // TODO: if not runtime evaluable return null or const op = operand.op; switch (op) { diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil new file mode 100644 index 0000000..d48254d --- /dev/null +++ b/test/pil2/collection/expressions.pil @@ -0,0 +1,14 @@ +subproof ExpressionTest(2**16) { + int k = 10; + expr a = 1; + string s = "1"; + + + assert(k == 10); + assert(a == 1); + assert(string(1) == "1"); + assert(string(a) == "1"); + assert(string(a) == s); + + a = a + 1; +} \ No newline at end of file From 33b5b32f408c3e8f678e65d830a203c5720cfedd Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Wed, 20 Sep 2023 00:31:16 +0200 Subject: [PATCH 10/33] WIP operators and casting --- src/assign.js | 25 +++++----- src/builtin/dump.js | 16 +++++++ src/expression.js | 68 +++++++++++++++++++++++----- src/expression_items/int_value.js | 5 ++ src/expression_operator_methods.js | 11 ++++- src/reference.js | 9 +++- src/references.js | 23 +++++++++- test/pil2/collection/expressions.pil | 3 ++ 8 files changed, 132 insertions(+), 28 deletions(-) create mode 100644 src/builtin/dump.js diff --git a/src/assign.js b/src/assign.js index 27173f0..9170df4 100644 --- a/src/assign.js +++ b/src/assign.js @@ -7,23 +7,26 @@ module.exports = class Assign { } assign (name, indexes, value) { - // console.log(value.stack[0].operands[0]); + value = this.getValue(value); + assert(value !== null); + return this.#assign(name, indexes, value); + } + getValue(value) { const _value = value.eval(); if (typeof _value !== 'undefined' && _value !== null) { - value = _value; + return _value; } - assert(value !== null); - return this.__assign(name, indexes, value); + return value; } - __assign(name, indexes, value) { - const [type, reference, array] = Context.references.getTypeR(name, indexes); - console.log([type, reference, array]); - const dim = (array && array.dim) ? array.dim : 0; + #assign (name, indexes, value) { + const array = Context.references.getArray(name, indexes); + const dim = array.dim ?? 0; if (dim > 0) { + // array asignation as array or subarray copy return this.assignArray(name, indexes, value, array); } - // console.log([name, type, reference, array]); - return this.assignType(type, name, indexes, value); + + return Context.references.set(name, indexes, value); } assignType(type, name, indexes, value) { console.log(type); @@ -51,7 +54,7 @@ module.exports = class Assign { _indexes.push(index); value.pushAloneIndex(index); if (level + 1 === leftArray.dim) { - this.__assign(name, _indexes, value.evaluateAloneReference()); + this.#assign(name, _indexes, value.evaluateAloneReference()); } else { this.assignArrayLevel(level+1, name, _indexes, value, leftArray, rightArray); } diff --git a/src/builtin/dump.js b/src/builtin/dump.js new file mode 100644 index 0000000..958f3c8 --- /dev/null +++ b/src/builtin/dump.js @@ -0,0 +1,16 @@ +const Function = require("../function.js"); +const Context = require('../context.js'); +module.exports = class Dump extends Function { + constructor (parent) { + super(parent, {funcname: 'dump'}); + } + mapArguments(s) { + if (s.args.length !== 1) { + throw new Error('Invalid number of parameters'); + } + return s.args[0].eval(); + } + exec(s, mapInfo) { + mapInfo.dump(); + } +} diff --git a/src/expression.js b/src/expression.js index 85ea3fe..93450e2 100644 --- a/src/expression.js +++ b/src/expression.js @@ -17,7 +17,7 @@ const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; class ExpressionStackEvaluating {}; class InstanceArray extends Error {}; -module.exports = class Expression extends ExpressionItem { +class Expression extends ExpressionItem { // op (string) // operands (array) @@ -482,7 +482,7 @@ module.exports = class Expression extends ExpressionItem { * @param {string} operation - operation to apply on operators * @param {string[]|false} types - types of operators * */ - operatorToMethod(operation, types) { + operatorToMethod(operation, types = false) { const key = 'operator_' + operation + (types === false ? '' : '_' +types.slice(1).join('_')); let method = Expression.operatorsToMethodCache[key]; if (!method) { @@ -516,29 +516,70 @@ module.exports = class Expression extends ExpressionItem { const equals = values.length < 2 ? true : types.every(x => x === types[0]); let reversed = false; let methods = []; + const onlyOneLoop = equals || !operationInfo.commutative || operationInfo.args != 2; + + // In this block try to found and operator method using types without transformations. + // First search on class of first operand, if not found search on class of second operand (*) + // (*) only if two operands and operation is commutative while (true) { const method = this.operatorToMethod(operation, (equals ? false : types)); methods.push(method); - console.log(`########### (${values[0].constructor.name}) METHOD ${method} ###########`); - console.log(values[0].__prototype__); - if (typeof values[0][method] === 'function') { - // instance call, first value (operand) is "this", arguments rest of values (operands) - return values[0][method](...values.slice(1)); - } else if (values[0].constructor.operators && typeof values[0].constructor.operators[method] === 'function') { - // static call with all values (operands) - return values[0].constructor.operators[method](...values); + const [executed, result] = this.applyOperatorMethod(method, values); + if (executed) { + return result; + } + if (onlyOneLoop) { + break; } - if (equals || !operationInfo.commutative || operationInfo.args != 2 || reversed) { + // onlyOneLoop === false => two loops, on second loop applies reverse again to + // restore original values and types, also restore value of reversed + values = values.reverse(); + types = types.reverse(); + reversed = !reversed; + if (reversed == false) { break; } + } + + // If not equals, in this block try to cast second operand to class of first operand, after that + // First search on class of first operand, if not found, try to cast first operand to class of second + // operand and search on class of second operand (*) + // (*) only if two operands and operation is commutative + while (!equals && operationInfo.args == 2) { + const casting = 'as'+types[0]+'Item'; + if (typeof values[1][casting] === 'function') { + const method = this.operatorToMethod(operation); + methods.push(method); + const [executed, result] = this.applyOperatorMethod(method, [values[0], values[1][casting]()]); + if (executed) { + return result; + } + if (onlyOneLoop) { + break; + } + } values = values.reverse(); types = types.reverse(); - reversed = true; + reversed = !reversed; + if (reversed == false) { + break; + } } throw new Error(`Operation ${operation} not was defined by types ${types.join(',')} [${methods.join(', ')}]`); } + applyOperatorMethod (method, values) { + console.log(`########### (${values[0].constructor.name}) METHOD ${method} ###########`); + if (typeof values[0][method] === 'function') { + // instance call, first value (operand) is "this", arguments rest of values (operands) + return [true, values[0][method](...values.slice(1))]; + } else if (values[0].constructor.operators && typeof values[0].constructor.operators[method] === 'function') { + // static call with all values (operands) + return [true, values[0].constructor.operators[method](...values)]; + } + return [false, false]; + } evaluateValue(value, options) { console.log(value); if (typeof value === 'undefined') { @@ -1198,3 +1239,6 @@ module.exports = class Expression extends ExpressionItem { EXIT_HERE; } } + +ExpressionItem.registerClass('Expression', Expression); +module.exports = Expression; \ No newline at end of file diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index 8c2f7bb..528cbc0 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -47,6 +47,11 @@ class IntValue extends ValueItem { asString() { return this.value.toString(); } + asExpressionItem() { + let res = new ValueItem.Expression(); + res._set(this); + return res; + } operatorAdd(valueB) { return new IntValue(this.asInt() + valueB.asInt()); } diff --git a/src/expression_operator_methods.js b/src/expression_operator_methods.js index 37da14e..f6d299e 100644 --- a/src/expression_operator_methods.js +++ b/src/expression_operator_methods.js @@ -10,12 +10,19 @@ module.exports = class ExpressionOperatorMethods { res.simplify(); return res; } - static operatorAdd(valueA, valueB) { + static #do(operation, valueA, valueB) { let res = valueA.clone(); - res.insert('add', valueB); + res.insert(operation, valueB); res.simplify(); return res; } + + static operatorAdd(valueA, valueB) { + return this.#do('add', valueA, valueB); + } + static operatorMul(valueA, valueB) { + return this.#do('mul', valueA, valueB); + } static operatorEqIntValue(valueA, valueB) { let res = valueA.eval(); return new ExpressionItem.IntValue(res.asInt() === valueB.asInt() ? 1n : 0n); diff --git a/src/reference.js b/src/reference.js index 79ccdff..a1f1c0f 100644 --- a/src/reference.js +++ b/src/reference.js @@ -1,6 +1,11 @@ const {assert, assertLog} = require('./assert.js'); const {MultiArray} = require("./multi_array.js"); -module.exports = class Reference { + +/** + * @property {MultiArray} array + */ + +class Reference { constructor (name, type, isReference, array, id, instance, scopeId, properties) { this.name = name; @@ -57,3 +62,5 @@ module.exports = class Reference { EXIT_HERE_TODO; } } + +module.exports = Reference; \ No newline at end of file diff --git a/src/references.js b/src/references.js index 230b1b6..de9a5d6 100644 --- a/src/references.js +++ b/src/references.js @@ -24,6 +24,17 @@ module.exports = class References { console.log(instance.constructor.name); return instance.get ? instance.get(instance.id): false; } +/* getDefinition(name, indexes) { + const reference = this.getReference(name); + const id = reference.getId(indexes); + }*/ + getArray(name, indexes) { + const reference = this.getReference(name); + if (!reference.array) { + return false; + } + return reference.array.applyIndexes(indexes); + } getNameScope(name) { const nameInfo = this.decodeName(name); return nameInfo.scope; @@ -219,8 +230,9 @@ module.exports = class References { return this.getTypeDefinition(type).instance.getLabel(id, {type, ...options}); } getTypeR(name, indexes, options) { - const [instance, info] = this._getInstanceAndLocator(name, indexes); - return [instance.getType(info.locator + info.offset), info.reference, info.array ?? false]; + const reference = this.getReference(name); + const item = reference.getItem(indexes); + return [item, reference.isReference]; } getItem(name, indexes, options) { @@ -396,6 +408,13 @@ module.exports = class References { isVisible(def) { return !def.scopeId || def.type === 'constant' || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } + /** + * + * @param {string|string[]} name + * @param {*} defaultValue + * @param {Object} debug + * @returns {Reference} + */ getReference(name, defaultValue, debug = {}) { // if more than one name is sent, use the first one (mainName). Always first name it's directly // name defined on source code, second optionally could be name with subproof, because as symbol is diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil index d48254d..1be95b9 100644 --- a/test/pil2/collection/expressions.pil +++ b/test/pil2/collection/expressions.pil @@ -11,4 +11,7 @@ subproof ExpressionTest(2**16) { assert(string(a) == s); a = a + 1; + dump(a); + a = a * 10; + dump(a); } \ No newline at end of file From db2a833ba8d1d7babf6eb2279ecb0dba7cf80507 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Wed, 20 Sep 2023 06:41:15 +0200 Subject: [PATCH 11/33] adding more Exceptions and cast conversions --- src/definition_items/string_value.js | 4 ++- src/exceptions.js | 5 ++++ src/exceptions/cannot_be_cast_to_type.js | 6 ++++ src/expression.js | 38 +++++++++++++++++------- src/expression_items/string_value.js | 4 ++- test/pil2/collection/expressions.pil | 3 ++ 6 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 src/exceptions.js create mode 100644 src/exceptions/cannot_be_cast_to_type.js diff --git a/src/definition_items/string_value.js b/src/definition_items/string_value.js index 7cb9fb4..3a5c592 100644 --- a/src/definition_items/string_value.js +++ b/src/definition_items/string_value.js @@ -2,7 +2,7 @@ const {assert, assertLog} = require("../assert.js"); const RuntimeItem = require("./runtime_item.js"); const StringValueItem = require("../expression_items/string_value.js"); -module.exports = class StringValue extends RuntimeItem { +class StringValue extends RuntimeItem { constructor (id, properties) { super(id, properties); const value = properties.value ?? ''; @@ -32,3 +32,5 @@ module.exports = class StringValue extends RuntimeItem { return new StringValueItem(this.value); } } + +module.exports = StringValue; \ No newline at end of file diff --git a/src/exceptions.js b/src/exceptions.js new file mode 100644 index 0000000..b3e9833 --- /dev/null +++ b/src/exceptions.js @@ -0,0 +1,5 @@ +const CannotBeCastToType = require('./exceptions/cannot_be_cast_to_type.js'); +const Exceptions = { + CannotBeCastToType +} +module.exports = Exceptions; diff --git a/src/exceptions/cannot_be_cast_to_type.js b/src/exceptions/cannot_be_cast_to_type.js new file mode 100644 index 0000000..0cf72bb --- /dev/null +++ b/src/exceptions/cannot_be_cast_to_type.js @@ -0,0 +1,6 @@ +module.exports = class CannotBeCastToType extends Error { + constructor (castingType = false) { + super('Error casting type '+ (castingType === false ? '':' to '+castingType)); + } + +} \ No newline at end of file diff --git a/src/expression.js b/src/expression.js index 93450e2..4468421 100644 --- a/src/expression.js +++ b/src/expression.js @@ -14,9 +14,8 @@ const OP_RUNTIME = 'runtime'; const NATIVE_REFS = ['witness', 'fixed', 'public', 'challenge', 'subproofvalue', 'proofvalue', 'publictable']; const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; +const Exceptions = require('./exceptions.js'); -class ExpressionStackEvaluating {}; -class InstanceArray extends Error {}; class Expression extends ExpressionItem { // op (string) @@ -524,7 +523,7 @@ class Expression extends ExpressionItem { while (true) { const method = this.operatorToMethod(operation, (equals ? false : types)); - methods.push(method); + methods.push(`${types[0]}.${method}`); const [executed, result] = this.applyOperatorMethod(method, values); if (executed) { return result; @@ -547,10 +546,10 @@ class Expression extends ExpressionItem { // operand and search on class of second operand (*) // (*) only if two operands and operation is commutative while (!equals && operationInfo.args == 2) { - const casting = 'as'+types[0]+'Item'; + const casting = this.castingItemMethod(types[0]); if (typeof values[1][casting] === 'function') { const method = this.operatorToMethod(operation); - methods.push(method); + methods.push(`${types[0]}.${method}`); const [executed, result] = this.applyOperatorMethod(method, [values[0], values[1][casting]()]); if (executed) { return result; @@ -569,6 +568,12 @@ class Expression extends ExpressionItem { throw new Error(`Operation ${operation} not was defined by types ${types.join(',')} [${methods.join(', ')}]`); } + castingItemMethod(type) { + if (type === 'StringValue' || type === 'IntValue') { + type = type.slice(0, -5); + } + return 'as'+type+'Item'; + } applyOperatorMethod (method, values) { console.log(`########### (${values[0].constructor.name}) METHOD ${method} ###########`); if (typeof values[0][method] === 'function') { @@ -1038,9 +1043,9 @@ class Expression extends ExpressionItem { toString(options) { let top = this.stack.length-1; if (top < 0) { - return '(empty expression)'; + return '(Expression => String)'; } - return this.stackPosToString(top ,0, {...options, dumpToString: true}); + return '(Expression => String)'+this.stackPosToString(top ,0, {...options, dumpToString: true}); } stackPosToString(pos, parentPrecedence, options) { const st = this.stack[pos]; @@ -1215,16 +1220,29 @@ class Expression extends ExpressionItem { return new ExpressionItems.IntValue(this.asInt()); } asInt() { + const res = this.asIntDefault(); + if (res === false) { + throw new Exceptions.CannotBeCastToType('int'); + } + return res; + } + asIntItemDefault(defaultValue = false) { + return new ExpressionItems.IntValue(this.asIntDefault(defaultValue)); + } + asIntDefault(defaultValue = false) { let res = this.eval(); assert((res instanceof Expression) === false); if (typeof res.asInt === 'function') { return res.asInt(); } - console.log(res); - EXIT_HERE; + return defaultValue; } asString() { - return this.toString(); + const value = this.eval(); + if (typeof value.asString === 'function') { + return value.asString(); + } + throw new Exceptions.CannotBeCastToType('string'); } asStringItem() { return new ExpressionItems.StringValue(this.asString()); diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index f34fd28..ea81094 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -32,7 +32,9 @@ class StringValue extends RuntimeItem { operatorEq(valueB) { return new RuntimeItem.IntValue(this.asString() === valueB.asString() ? 1:0); } - + operatorAdd(valueB) { + return new StringValue(this.asString() + valueB.asString()); + } } RuntimeItem.registerClass('StringValue', StringValue); diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil index 1be95b9..2a2e6b0 100644 --- a/test/pil2/collection/expressions.pil +++ b/test/pil2/collection/expressions.pil @@ -14,4 +14,7 @@ subproof ExpressionTest(2**16) { dump(a); a = a * 10; dump(a); + s = s + "hello"; + s = s + k; + s = s + a; } \ No newline at end of file From 752ca0792b68480a51ed939a5701558aaaa30977 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 21 Sep 2023 23:52:15 +0200 Subject: [PATCH 12/33] WIP expressions --- src/expression.js | 378 ++++++++---------------- src/expression_items/expression_item.js | 36 +++ src/expression_items/reference_item.js | 8 + src/expression_items/stack_item.js | 3 + src/expression_items/string_value.js | 3 + src/expression_items/value_item.js | 3 + src/expression_pack.js | 99 +++++++ src/expressions.js | 6 +- src/multi_array.js | 12 +- src/processor.js | 2 +- src/reference.js | 15 +- test/pil2/collection/expressions.pil | 6 + 12 files changed, 305 insertions(+), 266 deletions(-) create mode 100644 src/expression_pack.js diff --git a/src/expression.js b/src/expression.js index 4468421..c28a8a5 100644 --- a/src/expression.js +++ b/src/expression.js @@ -1,6 +1,6 @@ const util = require('util'); const {cloneDeep} = require('lodash'); -const {assert} = require("chai"); +const {assert, assertLog} = require('./assert.js'); const ExpressionOperationsInfo = require('./expression_operations_info.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const ExpressionItems = require("./expression_items.js"); @@ -56,47 +56,40 @@ class Expression extends ExpressionItem { } const count = e.stack.length; for (let index = 0; index < count; ++index) { - this.stack.push(this.cloneDeep(e.stack[index], 'pushStack')); + this.stack.push(this.cloneStackPos(e.stack[index])); } return count; } - + cloneStackPos(stackPos) { + console.log(stackPos); + return { op: stackPos.op, + operands: stackPos.operands.map(operand => operand.clone())}; + } +/* cloneDeep(e, label = '') { const res = cloneDeep(e); return res; } - - next(dnext) { - for (let stack of this.stack) { - for (let ope of stack.operands) { - switch (ope.type) { - case OP_VALUE: - case OP_STACK: - break; - case OP_ID_REF: - const pnext = Number(ope.next); - ope.next = ope.next ? pnext + Number(dnext) : Number(dnext); - break; - case OP_RUNTIME: - throw new Error(`Instance first do next operation`); - } - } - } - } - insertStack(e, pos) { - const delta = e.stack.length; - for (let index = pos; index < this.stack.length; ++index) { - for (const ope of this.stack[index].operands) { - if (ope.type === OP_STACK && (index - ope.offset) < pos) { - ope.offset += delta; +*/ + applyNext(value) { + this.stack.map(stack => stack.operands.map(operand => operand.applyNext(value))); + } + insertStack(expressionToInsert, stackIndex) { + const delta = expressionToInsert.stack.length; + for (let index = stackIndex; index < this.stack.length; ++index) { + for (const operand of this.stack[index].operands) { + if (operand instanceof ExpressionItems.StackItem === false) continue; + const offset = operand.getOffset(); + if ((index - offset) < stackIndex) { + operand.setOffset(offset + delta); } } } - for (let index = this.stack.length - 1; index >= pos; --index) { + for (let index = this.stack.length - 1; index >= stackIndex; --index) { this.stack[index + delta] = this.stack[index]; } for (let index = 0; index < delta; ++index) { - this.stack[index + pos] = this.cloneDeep(e.stack[index]); + this.stack[index + stackIndex] = expressionToInsert.stack[index].clone(); } this.fixedRowAccess = this.fixedRowAccess || e.fixedRowAccess; return 1; @@ -114,28 +107,17 @@ class Expression extends ExpressionItem { } pushAloneIndex(index) { assert(this.isAlone()); - let operand = this.getAloneOperand(); - if (typeof operand.indexes === 'undefined') { - operand.indexes = []; - operand.__indexes = []; - operand.dim = 0; - } - operand.indexes.push(index); - operand.__indexes.push(index); - ++operand.dim; + let operand = this.getAloneOperand().pushArrayIndex(index); } popAloneIndex() { assert(this.isAlone()); - let operand = this.getAloneOperand(); - --operand.dim; - operand.indexes.pop(); - return operand.__indexes.pop(); + return this.getAloneOperand().popArrayIndex(index); } getAloneOperand () { return this.stack[0].operands[0]; } cloneAloneOperand () { - return cloneDeep(this.getAloneOperand()); + return this.getAloneOperand().clone(); } isReference () { @@ -389,16 +371,20 @@ class Expression extends ExpressionItem { // stackResults[pos][0] contains result of this stack position, // in stackResults[pos][1] contains a results array of this stack position operands instance() { - this.dump(); + console.log(Context.sourceRef); + if (Context.sourceRef === 'expressions.pil:5:4:5:12') { +// EXIT_HERE; + } + this.dump("#############"); let cloned = this.clone(); const options = {instance: true} let stackResults = cloned.evaluateOperands(options); - // dup.extendExpressions(options); + // cloned.extendExpressions(options); cloned.evaluateFullStack(stackResults, options); cloned.dump(); console.log('SIMPLIFY'); cloned.simplify(); - cloned.dump(); + cloned.dump("#############"); // console.log(stackResults); // cloned.dumpStackResults(stackResults, ''); return cloned; @@ -408,7 +394,6 @@ class Expression extends ExpressionItem { return this; } let options = {}; - this.dump(); let stackResults = this.evaluateOperands(options); // this.instanceExpressions(options); this.evaluateFullStack(stackResults, options); @@ -418,49 +403,36 @@ class Expression extends ExpressionItem { evaluateFullStack(stackResults, options) { this.evaluateStackPos(stackResults, this.stack.length - 1, options); } - evaluateStackPos(stackResults, pos, options) { - const st = this.stack[pos]; - const results = stackResults[pos]; - console.log(st); - console.log(stackResults[pos]); + evaluateStackPos(stackResults, stackIndex, options = {}) { + const st = this.stack[stackIndex]; + const results = stackResults[stackIndex]; + // if stackResult is evaluated return value; if (results[0] !== null) { - console.log(['RETURN', results[0]]) return results[0]; } - /* if (st.op === false) { - if (st.operands[0].type === OP_VALUE) { - } - return stackResults[pos]; - }*/ - let value; + console.log([results, st.operands.length, st]); let values = results[1]; - console.log(values); for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { const operand = st.operands[operandIndex]; - if (values[operandIndex] !== null) { - console.log(value); + assert(operand instanceof ExpressionItem); + if ((values[operandIndex] ?? null) != null) { continue; } - value = null; - console.log(operand); - switch (typeof operand) { - case 'IntValue': - value = operand.getValue(); - console.log(value); - break; - case 'StackItem': - value = this.evaluateStackPos(stackResults, pos - operand.getOffset()); - console.log(value); - break; - default: - console.log(['DEFAULT', value]); + if (operand instanceof ExpressionItems.StackItem) { + values[operandIndex] = this.evaluateStackPos(stackResults, stackIndex - operand.getOffset()); + } else { + values[operandIndex] = operand.eval(options); + } + if (options.instance) { + } - values[operandIndex] = value; } + console.log(values); + console.log([st.op, ...values]); - value = null; + let value = null; if (values.some(value => value === null)) { value = null; } else if (st.op === false) { @@ -468,13 +440,9 @@ class Expression extends ExpressionItem { } else if (values.some(value => value instanceof ExpressionItems.ProofItem)) { value = null; } else { - console.log(st.op); - console.log(values); value = this.applyOperation(st.op, values); - console.log(value); } - results[0] = value; - return value; + return (results[0] = value); } /** * get method name used to calculate an operation between types. @@ -496,6 +464,7 @@ class Expression extends ExpressionItem { * @param {string[]|false} values - array of ExpressionItems * */ applyOperation(operation, values) { + console.log([operation, ...values]); const operationInfo = ExpressionOperationsInfo.get(operation); if (operationInfo === false) { @@ -507,7 +476,7 @@ class Expression extends ExpressionItem { } // assert all values must be an ExpressionItem - values.map(value => assert(value instanceof ExpressionItem)); + values.map(value => assertLog(value instanceof ExpressionItem, value)); let types = values.map(x => x.constructor.name); @@ -638,13 +607,14 @@ class Expression extends ExpressionItem { return IntValue.castTo(this.eval()); }*/ evaluateValueAsNumber(value, options) { + console.log(value); let evaluated = false; while (true) { if (typeof value === 'number' || typeof value === 'bigint' || typeof value === 'boolean') { return Number(value); } if (value instanceof ExpressionItem) { - return value.asNumber(); + return value.asInt(); } if (evaluated) break; value = this.evaluateValue(value, options); @@ -656,7 +626,8 @@ class Expression extends ExpressionItem { if (typeof values === 'undefined') { return (options ? options.default ?? [] : []); } - return values.map(value => this.evaluateValuesAsNumbers(value, options)); + console.log(values); + return values.map(value => this.evaluateValueAsNumber(value, options)); } getArrayResult(results, indexes, options) { // this method take one of results using indexes @@ -681,24 +652,24 @@ class Expression extends ExpressionItem { const operand = st.operands[operandIndex]; let next = 0; // if no prior defined priorValue was 0 - let priorValue = this.evaluateValueAsNumber(operand.prior, options); + let priorValue = operand.prior ? this.evaluateValueAsNumber(operand.prior, options) : 0n; let result = this.evaluateValue(operand, options); console.log(['RESULT', result]); - let indexes = this.evaluateValuesAsNumbers(operand.indexes, options); + let indexes = operand.indexes ? this.evaluateValuesAsNumbers(operand.indexes, options) : []; if (indexes.length) { // TODO: fixed access result = this.getArrayResult(result, indexes, options); } // if no prior defined nextValue was 0 - let nextValue = this.evaluateValueAsNumber(operand.next, options); + console.log(operand.next); + let nextValue = operand.next ? this.evaluateValueAsNumber(operand.next, options) : 0n; // prior and next are excl if (priorValue && nextValue) { throw new Error(`prior and next for same operand it's ambiguous`); } next = nextValue - priorValue; - operandResults.push(result); if (options.instance && result !== null) { st.operands[operandIndex] = result; } @@ -730,7 +701,7 @@ class Expression extends ExpressionItem { // this method instance the expression references to include them inside // TODO: view how these affects to optimization. instanceExpressions(options) { - let pos = 0; +/* let pos = 0; while (pos < this.stack.length) { let nextPos = true; for (let ope of this.stack[pos].operands) { @@ -766,8 +737,42 @@ class Expression extends ExpressionItem { } } if (nextPos) ++pos; - } + }*/ + } + // this method instance the expression references to include them inside + // TODO: view how these affects to optimization. + instanceExpressions(options) { + + // assert(ope.__value instanceof Expression === false); + /* + if (ope.__value instanceof Expression) { + ope.type = OP_STACK; + const exprToInsert = ope.__value.instance(); + const next = typeof ope.next === 'number' ? ope.next : ope.__next; + if (next) exprToInsert.next(next); + ope.offset = this.insertStack(exprToInsert, pos); + nextPos = false; + break; + } + if (typeof ope.__value !== 'undefined' && !(ope.__value instanceof NonRuntimeEvaluable)) continue; + + // TODO: twice evaluations, be carefull double increment evaluations,etc.. + const res = this.evaluateRuntime(ope); + if (res.value && res.value.type === OP_ID_REF) { + ope.type = OP_ID_REF; + ope.refType = res.refType; + ope.id = res.id; + } else if (res instanceof Expression) { + ope.type = OP_STACK; + const exprToInsert = res.instance(); + const next = typeof ope.next === 'number' ? ope.next : ope.__next; + if (next) exprToInsert.next(next); + ope.offset = this.insertStack(exprToInsert, pos); + nextPos = false; + break; + }*/ } + simplify() { let loop = 0; while (this.stack.length > 0) { @@ -779,14 +784,6 @@ class Expression extends ExpressionItem { if (!updated) break; } } - /* simplifyRuntimeToValue(st) { - for (let index = 0; index < st.operands.length; ++index) { - const value = st.operands[index].__value; - if (['string', 'number', 'bigint'].includes(value)) { - st.operands[index] = {type: OP_VALUE, value}; - } - } - }*/ // this method simplify trivial operations as 0 + x or 1 * x, also // simplify operations between values, not only direct values also @@ -877,7 +874,7 @@ class Expression extends ExpressionItem { // was false, replace reference of this stack operation by directly value compactStack() { let translate = []; - let stackPos = 0; + let stackIndex = 0; let stackLen = this.stack.length; for (let istack = 0; istack < stackLen; ++istack) { const st = this.stack[istack]; @@ -889,7 +886,7 @@ class Expression extends ExpressionItem { continue; } - translate[istack] = [false, stackPos++]; + translate[istack] = [false, stackIndex++]; // foreach operand if it's a stack reference, must be replaced by // new reference or by copy of reference if it was alone (no operation) @@ -902,9 +899,9 @@ class Expression extends ExpressionItem { // if purge and referenced position was alone, it is copied (duplicated) this.stack[istack].operands[iope] = this.stack[newAbsolutePos].operands[0].clone(); } else { - // stackPos - 1 is new really istack after clear simplified stack positions + // stackIndex - 1 is new really istack after clear simplified stack positions // calculate relative position (offset) - const newOffset = (stackPos - 1) - newAbsolutePos; + const newOffset = (stackIndex - 1) - newAbsolutePos; assert(newOffset > 0); this.stack[istack].operands[iope].setOffset(newOffset); } @@ -934,43 +931,6 @@ class Expression extends ExpressionItem { // return if expression was updated return stackLen > this.stack.length; } - evaluateNext(ope) { - if (typeof ope.next === 'undefined') { - return 0; - } - const nextValue = this.evaluateContent(ope.next); - if (nextValue && ope.__next !== 0) { - // it isn't possible by grammar - throw new Error(`next and prior are incompatible between them`); - } - if (nextValue) { - ope.__next = nextValue; - } - return ope.__next; - } - - evaluateContent(e) { - if (typeof e === 'bigint' || typeof e === 'number' || typeof e == 'string' || typeof e == 'boolean') { - return e; - } - if (e.op == 'reference') { - return this.evaluateReference(e); - } - if (e instanceof Expression) { - return e.eval(); - } - console.log(e); - EXIT_HERE; - } - - evaluateReference(e) { - return Expression.parent.evaluateReference(e); - } -/* evaluateRuntime(e) { - // function_call op:'call' function: args: - // positional_param op:'positional_param' position: - // casting op:'cast' cast: value: dim: ?? - }*/ getCaller(stackLevels = 4) { let caller = ''; try { @@ -1045,7 +1005,8 @@ class Expression extends ExpressionItem { if (top < 0) { return '(Expression => String)'; } - return '(Expression => String)'+this.stackPosToString(top ,0, {...options, dumpToString: true}); + const res = this.stackPosToString(top ,0, {...options, dumpToString: true}); + return res; } stackPosToString(pos, parentPrecedence, options) { const st = this.stack[pos]; @@ -1077,7 +1038,7 @@ class Expression extends ExpressionItem { if (ope instanceof ExpressionItems.StackItem) { return this.stackPosToString(pos-ope.offset, parentPrecedence, options); } - return ope.dump(options); + return ope.toString(options); /* switch (ope.type) { @@ -1107,94 +1068,6 @@ class Expression extends ExpressionItem { }*/ } - packAlone(container, options) { - this.operandPack(container, this.getAloneOperand(), 0, options); - return container.pop(1)[0]; - } - pack(container, options) { - let top = this.stack.length-1; - return this.stackPosPack(container, top, options); - } - stackPosPack(container, pos, options) { - const st = this.stack[pos]; - if (st.op === false) { - this.operandPack(container, st.operands[0], pos, options); - return false; - } - for (const ope of st.operands) { - this.operandPack(container, ope, pos, options); - } - switch (st.op) { - case 'mul': - return container.mul(); - - case 'add': - return container.add(); - - case 'sub': - return container.sub(); - - case 'neg': - return container.neg(); - - default: - throw new Error(`Invalid operation ${st.op} on packed expression`); - } - } - - operandPack(container, ope, pos, options) { - if (ope instanceof ExpressionItems.ValueItem) { - container.pushConstant(ope.value); - } else if (ope instanceof ExpressionItems.ProofItem) { - this.referencePack(container, ope, options); - } else if (ope instanceof ExpressionItems.StackItem) { - const eid = this.stackPosPack(container, pos-ope.getOffset(), options); - if (eid !== false) { // eid === false => alone operand - container.pushExpression(eid); - } - } else { - const opeType = ope instanceof Object ? ope.constructor.name : typeof ope; - throw new Error(`Invalid reference ${opeType} on packed expression`); - } - - } - referencePack(container, ope, options) { - // TODO stage expression - // container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); - // break; - const id = ope.getId(); - const def = Context.references.getDefinitionByItem(ope); - assert(def !== false); - if (ope instanceof ExpressionItems.WitnessCol) { - // container.pushWitnessCol(id, next ?? 0, stage ?? 1) - console.log(ope); - // CURRENT ERROR: in this scope definition not available. - console.log(def); - container.pushWitnessCol(id, ope.getNext(), def.stage); - - } else if (ope instanceof ExpressionItems.FixedCol) { - // container.pushFixedCol(id, next ?? 0); - container.pushFixedCol(id, ope.getNext()); - - } else if (ope instanceof ExpressionItems.Public) { - // container.pushPublicValue(id) - container.pushPublicValue(id); - - } else if (ope instanceof ExpressionItems.Challenge) { - // container.pushChallenge(id, stage ?? 1); - container.pushChallenge(id, ope.getStage()); - - } else if (ope instanceof ExpressionItems.Proofval) { - // container.pushProofValue(id) - container.pushProofValue(id); - - } else if (ope instanceof ExpressionItems.Subproofval) { - // container.pushSubproofValue(id) - container.pushSubproofValue(id); - } else { - throw new Error(`Invalid reference class ${ope.constructor.name} to pack`); - } - } resolve() { const res = this.eval(); if (res instanceof Expression) { @@ -1203,42 +1076,28 @@ class Expression extends ExpressionItem { return res; } asBool() { - this.dump(); - let res = this.eval(); - res.dump(); - if (res instanceof Expression) { - res = res.getAloneOperand(); - } - assert((res instanceof Expression) === false); - if (typeof res.asBool === 'function') { - return res.asBool(); - } - console.log(res); - EXIT_HERE; + return this.asInt() ? true : false; } asIntItem() { return new ExpressionItems.IntValue(this.asInt()); } asInt() { - const res = this.asIntDefault(); - if (res === false) { - throw new Exceptions.CannotBeCastToType('int'); + let value = this.eval(); + assert((value instanceof Expression) === false); + if (typeof value.asInt === 'function') { + return value.asInt(); } - return res; - } - asIntItemDefault(defaultValue = false) { - return new ExpressionItems.IntValue(this.asIntDefault(defaultValue)); + throw new Exceptions.CannotBeCastToType('int'); } asIntDefault(defaultValue = false) { - let res = this.eval(); - assert((res instanceof Expression) === false); - if (typeof res.asInt === 'function') { - return res.asInt(); - } - return defaultValue; + return this._asDefault(this.asInt, defaultValue); + } + asIntItemDefault(defaultValue = false) { + return this._asDefault(this.asIntItem, defaultValue); } asString() { const value = this.eval(); + assert((value instanceof Expression) === false); if (typeof value.asString === 'function') { return value.asString(); } @@ -1247,6 +1106,12 @@ class Expression extends ExpressionItem { asStringItem() { return new ExpressionItems.StringValue(this.asString()); } + asStringDefault(defaultValue = false) { + return this._asDefault(this.asString, defaultValue); + } + asStringItemDefault(defaultValue = false) { + return this._asDefault(this.asStringItem, defaultValue); + } getValue() { return this.eval(); } @@ -1256,6 +1121,9 @@ class Expression extends ExpressionItem { operatorAdd(valueA, valueB) { EXIT_HERE; } + hasRuntimes() { + return this.stack.some(stackPos => stackPos.operands.some(operand => operand.isRuntime())); + } } ExpressionItem.registerClass('Expression', Expression); diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 4a23808..c3ebbef 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -53,15 +53,38 @@ ArrayOf (multiarray, [ExpressionItem]) = List */ +const Exceptions = require('../exceptions.js'); module.exports = class ExpressionItem { static _classToManager = {}; constructor(debug = {}) { this.debug = debug; + this.indexes = false; } static registerClass(name, cls) { ExpressionItem[name] = cls; } + get dim () { + return Array.isArray(this.indexes) ? this.indexes.length : 0; + } + popArrayIndex () { + if (this.indexes === false) { + throw new Error(`try to add index to non-indexable element`); + } + if (typeof this.indexes === 'undefined') { + this.indexes = []; + } + this.indexes.push(ExpressionItem.IntValue(index)); + } + pushArrayIndex () { + if (this.indexes === false) { + throw new Error(`try to add an index to non-indexable element`); + } + if (this.dim < 1) { + throw new Error(`try to remove an index from element without indexes`); + } + return this.indexes.pop(); + } toString(options) { return `${this.constructor.name}()`; } @@ -89,4 +112,17 @@ module.exports = class ExpressionItem { console.log(['GET_MANAGER', this.constructor.name]); return ExpressionItem._classToManager[this.constructor.name]; } + _asDefault(method, defaultValue = false) { + try { + return method.apply(this, [defaultValue]); + } catch (e) { + if (e instanceof Exceptions.CannotBeCastToType) { + return defaultValue; + } + throw e; + } + } + eval(options = {}) { + throw new Error(`eval not defined for class ${this.constructor.name}`); + } } diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index af02ed4..3eb0d19 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -1,4 +1,5 @@ const RuntimeItem = require("./runtime_item.js"); +const Context = require('../context.js'); module.exports = class ReferenceItem extends RuntimeItem { constructor (name, indexes = [], next = 0) { super(); @@ -13,4 +14,11 @@ module.exports = class ReferenceItem extends RuntimeItem { clone() { return new ReferenceItem(this.name, this.indexes, this.next); } + eval(options = {}) { + console.log(this); + const item = Context.references.getItem(this.name, this.indexes); + // TODO: next + console.log(item); + return item; + } } diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js index fa600e4..93a0b66 100644 --- a/src/expression_items/stack_item.js +++ b/src/expression_items/stack_item.js @@ -21,4 +21,7 @@ module.exports = class StackItem extends ExpressionItem { dump(options) { return `StackItem(${this.offset})`; } + eval(options = {}) { + + } } diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index ea81094..8828b6a 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -35,6 +35,9 @@ class StringValue extends RuntimeItem { operatorAdd(valueB) { return new StringValue(this.asString() + valueB.asString()); } + eval(options = {}) { + return this.clone(); + } } RuntimeItem.registerClass('StringValue', StringValue); diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index 5319aaf..d8dcb7c 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -26,4 +26,7 @@ module.exports = class ValueItem extends ExpressionItem { asStringType() { return new ExpressionItem.StringValue(this.asString()); } + eval(options = {}) { + return this.clone(); + } } diff --git a/src/expression_pack.js b/src/expression_pack.js new file mode 100644 index 0000000..adee3fe --- /dev/null +++ b/src/expression_pack.js @@ -0,0 +1,99 @@ +const {assert, assertLog} = require('./assert.js'); +const Exceptions = require('./exceptions.js'); + +module.exports = class ExpressionPack { + constructor() { + this.expression = false; + } + set(expression) { + this.expression = expression; + } + packAlone(container, options) { + this.operandPack(container, this.expression.getAloneOperand(), 0, options); + return container.pop(1)[0]; + } + pack(container, options) { + let top = this.expression.stack.length-1; + return this.stackPosPack(container, top, options); + } + stackPosPack(container, pos, options) { + const st = this.expression.stack[pos]; + if (st.op === false) { + this.operandPack(container, st.operands[0], pos, options); + return false; + } + for (const ope of st.operands) { + this.operandPack(container, ope, pos, options); + } + switch (st.op) { + case 'mul': + return container.mul(); + + case 'add': + return container.add(); + + case 'sub': + return container.sub(); + + case 'neg': + return container.neg(); + + default: + throw new Error(`Invalid operation ${st.op} on packed expression`); + } + } + + operandPack(container, ope, pos, options) { + if (ope instanceof ExpressionItems.ValueItem) { + container.pushConstant(ope.value); + } else if (ope instanceof ExpressionItems.ProofItem) { + this.referencePack(container, ope, options); + } else if (ope instanceof ExpressionItems.StackItem) { + const eid = this.stackPosPack(container, pos-ope.getOffset(), options); + if (eid !== false) { // eid === false => alone operand + container.pushExpression(eid); + } + } else { + const opeType = ope instanceof Object ? ope.constructor.name : typeof ope; + throw new Error(`Invalid reference ${opeType} on packed expression`); + } + + } + referencePack(container, ope, options) { + // TODO stage expression + // container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); + // break; + const id = ope.getId(); + const def = Context.references.getDefinitionByItem(ope); + assert(def !== false); + if (ope instanceof ExpressionItems.WitnessCol) { + // container.pushWitnessCol(id, next ?? 0, stage ?? 1) + console.log(ope); + // CURRENT ERROR: in this scope definition not available. + console.log(def); + container.pushWitnessCol(id, ope.getNext(), def.stage); + + } else if (ope instanceof ExpressionItems.FixedCol) { + // container.pushFixedCol(id, next ?? 0); + container.pushFixedCol(id, ope.getNext()); + + } else if (ope instanceof ExpressionItems.Public) { + // container.pushPublicValue(id) + container.pushPublicValue(id); + + } else if (ope instanceof ExpressionItems.Challenge) { + // container.pushChallenge(id, stage ?? 1); + container.pushChallenge(id, ope.getStage()); + + } else if (ope instanceof ExpressionItems.Proofval) { + // container.pushProofValue(id) + container.pushProofValue(id); + + } else if (ope instanceof ExpressionItems.Subproofval) { + // container.pushSubproofValue(id) + container.pushSubproofValue(id); + } else { + throw new Error(`Invalid reference class ${ope.constructor.name} to pack`); + } + } +} diff --git a/src/expressions.js b/src/expressions.js index b8db840..39e8d37 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -3,12 +3,14 @@ const LabelRanges = require('./label_ranges.js'); const Expression = require('./expression.js'); const WitnessCol = require('./expression_items/witness_col.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); +const ExpressionPack = require('./expression_pack.js'); module.exports = class Expressions { constructor () { this.expressions = []; this.packedIds = []; this.labelRanges = new LabelRanges(); + this.expressionPack = new ExpressionPack(); } clone() { let cloned = Object.assign(Object.create(Object.getPrototypeOf(this)), this); @@ -339,14 +341,14 @@ module.exports = class Expressions { this.packedIds = []; for (let id = 0; id < this.expressions.length; ++id) { if (typeof this.packedIds[id] !== 'undefined') continue; // already packed - const packedId = this.expressions[id].pack(container, options); + const packedId = this.expressionPack.set(this.expressions[id]).pack(container, options); // packedId === false, means directly was a alone term. this.packedIds[id] = packedId; } } getPackedExpressionId(id, container, options) { if (container && typeof this.packedIds[id] === 'undefined') { - const packedId = this.expressions[id].pack(container, options); + const packedId = this.expressionPack.set(this.expressions[id]).pack(container, options); this.packedIds[id] = packedId; } return this.packedIds[id]; diff --git a/src/multi_array.js b/src/multi_array.js index 2c5b637..980ad7c 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -20,7 +20,8 @@ class MultiArray { } } } - getIndexesOffset(indexes) { + // review + __getIndexesOffset(indexes) { return this.getIndexesTypedOffset(indexes).offset; } offsetToIndexesString(offset) { @@ -51,6 +52,15 @@ class MultiArray { } return dup; } + locatorIndexesApply(locatorId, indexes) { + console.log([locatorId, indexes, this.dim, this.lengths]); + const [offset, dims] = this.getIndexesOffset(indexes); + console.log([offset, dims]); + if ((this.dim - dims) > 0) { + throw new Error(''); + } + return locatorId + offset; + } getIndexesOffset(indexes) { if (indexes === null || typeof indexes === 'undefined') { // TODO: review diff --git a/src/processor.js b/src/processor.js index f0a69c1..fa1d8aa 100644 --- a/src/processor.js +++ b/src/processor.js @@ -913,7 +913,7 @@ module.exports = class Processor { const scope = s.scope ?? false; let initValue = null; if (init) { - console.log(s.vtype); + console.log([name, s.vtype, Context.sourceRef]); switch (s.vtype) { case 'expr': // s.init[index].expr.dump('INIT1 '+name); diff --git a/src/reference.js b/src/reference.js index a1f1c0f..0a2942a 100644 --- a/src/reference.js +++ b/src/reference.js @@ -52,14 +52,15 @@ class Reference { return this.instance.get(this.getId(indexes)); } getItem(indexes, options = {}) { - if (Array.isArray(indexes) && indexes.length === 0) { - const res = this.instance.getItem(this.locator); - console.log(res); - return res; + console.log(indexes); + let locator = this.locator; + if (Array.isArray(indexes) && indexes.length > 0) { + const evaluatedIndexes = indexes.map(x => x.asInt()); + locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } - console.log(indexes, this); - console.log(indexes, options); - EXIT_HERE_TODO; + const res = this.instance.getItem(this.locator); + console.log(res); + return res; } } diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil index 2a2e6b0..c8ac9a6 100644 --- a/test/pil2/collection/expressions.pil +++ b/test/pil2/collection/expressions.pil @@ -1,9 +1,15 @@ subproof ExpressionTest(2**16) { + + col fixed x[4]; + expr ex = x[0] + 2 * x[1] + 4 * x[2] + 2 ** 3 * x[3]; + ex === 0; + int k = 10; expr a = 1; string s = "1"; + ex === 0; assert(k == 10); assert(a == 1); assert(string(1) == "1"); From d4626f7b7707083388e8783bfbda7ec52cac9466 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Sun, 24 Sep 2023 11:30:44 +0200 Subject: [PATCH 13/33] WIP --- src/assert.js | 8 ++- src/builtin/assert.js | 3 +- src/builtin/dump.js | 2 + src/expression.js | 67 ++++++++++++------- src/expression_items.js | 4 +- src/expression_items/expression_item.js | 5 +- src/expression_items/fixed_col.js | 3 + src/expression_items/function_call.js | 1 + src/expression_items/no_evaluated_item.js | 26 +++++++ .../non_runtime_evaluable_item.js | 25 +++++++ src/expression_items/proof_item.js | 6 ++ src/expression_items/reference_item.js | 1 + src/expression_items/runtime_item.js | 3 + src/expression_items/value_item.js | 3 + src/expression_items/witness_col.js | 9 ++- src/processor.js | 1 + src/reference.js | 4 +- src/references.js | 3 + test/pil2/collection/expressions.pil | 3 +- 19 files changed, 143 insertions(+), 34 deletions(-) create mode 100644 src/expression_items/no_evaluated_item.js create mode 100644 src/expression_items/non_runtime_evaluable_item.js diff --git a/src/assert.js b/src/assert.js index be91e6d..936a56b 100644 --- a/src/assert.js +++ b/src/assert.js @@ -7,7 +7,13 @@ function assertLog(condition, info) { _assert(condition); } +function assertReturnInstanceOf(value, cls, info) { + console.log([value, info]); + _assert(value instanceof cls); + return value; +} module.exports = { assert: _assert, - assertLog + assertLog, + assertReturnInstanceOf } \ No newline at end of file diff --git a/src/builtin/assert.js b/src/builtin/assert.js index 9fa41c0..da82405 100644 --- a/src/builtin/assert.js +++ b/src/builtin/assert.js @@ -1,5 +1,6 @@ const Function = require("../function.js"); const Context = require('../context.js'); +const ExpressionItems = require('../expression_items.js') module.exports = class Assert extends Function { constructor (parent) { super(parent, {funcname: 'assert'}); @@ -15,7 +16,7 @@ module.exports = class Assert extends Function { if (!arg0) { throw new Error(`Assert fails ${arg0} on ${Context.sourceRef}`); } - return 0n; + return new ExpressionItems.IntValue(0n); } exec(s, mapInfo) { console.log('############### ASSERT (exec) ########################'); diff --git a/src/builtin/dump.js b/src/builtin/dump.js index 958f3c8..c817006 100644 --- a/src/builtin/dump.js +++ b/src/builtin/dump.js @@ -1,5 +1,6 @@ const Function = require("../function.js"); const Context = require('../context.js'); +const ExpressionItems = require('../expression_items.js') module.exports = class Dump extends Function { constructor (parent) { super(parent, {funcname: 'dump'}); @@ -12,5 +13,6 @@ module.exports = class Dump extends Function { } exec(s, mapInfo) { mapInfo.dump(); + return new ExpressionItems.IntValue(0n); } } diff --git a/src/expression.js b/src/expression.js index c28a8a5..15b585c 100644 --- a/src/expression.js +++ b/src/expression.js @@ -1,6 +1,6 @@ const util = require('util'); const {cloneDeep} = require('lodash'); -const {assert, assertLog} = require('./assert.js'); +const {assert, assertLog, assertReturnInstanceOf} = require('./assert.js'); const ExpressionOperationsInfo = require('./expression_operations_info.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const ExpressionItems = require("./expression_items.js"); @@ -16,6 +16,9 @@ const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; const Exceptions = require('./exceptions.js'); +function assertExpressionItem(value, info) { + return assertReturnInstanceOf(value, ExpressionItem, info); +} class Expression extends ExpressionItem { // op (string) @@ -63,7 +66,7 @@ class Expression extends ExpressionItem { cloneStackPos(stackPos) { console.log(stackPos); return { op: stackPos.op, - operands: stackPos.operands.map(operand => operand.clone())}; + operands: stackPos.operands.map(operand => assertExpressionItem(operand.clone()))}; } /* cloneDeep(e, label = '') { @@ -72,7 +75,7 @@ class Expression extends ExpressionItem { } */ applyNext(value) { - this.stack.map(stack => stack.operands.map(operand => operand.applyNext(value))); + this.stack.map(stack => stack.operands.map(operand => assertExpressionItem(operand.applyNext(value)))); } insertStack(expressionToInsert, stackIndex) { const delta = expressionToInsert.stack.length; @@ -94,12 +97,8 @@ class Expression extends ExpressionItem { this.fixedRowAccess = this.fixedRowAccess || e.fixedRowAccess; return 1; } - cloneOperand(operator) { - return cloneDeep(operator); - } - cloneAlone() { - return this.cloneOperand(this.stack[0].operands[0]); + return assertExpressionItem(this.stack[0].operands[0].clone()); } isAlone () { @@ -136,7 +135,7 @@ class Expression extends ExpressionItem { if (this.stack.length) { throw new Error(`Set only could be used with empty stack`); } - this.stack.push({op: false, operands: [cloneDeep(operand)]}); + this.stack.push({op: false, operands: [assertExpressionItem(operand.clone())]}); } /* setIdReference (id, refType, next) { @@ -241,11 +240,11 @@ class Expression extends ExpressionItem { } if (!aIsEmpty) { - elem = {op, operands: [{type: OP_STACK, offset: counts[0]}]}; + elem = {op, operands: [new ExpressionItems.StackItem(counts[0])]}; } let index = 0; for (const b of bs) { - elem.operands.push(b.isAlone() ? b.cloneAlone() : {type: OP_STACK, offset: counts[++index]}); + elem.operands.push(b.isAlone() ? b.cloneAlone() : new ExpressionItems.StackItem(counts[++index])); } this.stack.push(elem); return this; @@ -262,6 +261,7 @@ class Expression extends ExpressionItem { return operand.__value; } assertInstanced() { + assert(false); try { for (let ist = 0; ist < this.stack.length; ++ist) { const st = this.stack[ist]; @@ -306,6 +306,7 @@ class Expression extends ExpressionItem { return res; } instanceValues() { + assert(false); for (let se of this.stack) { for (let index = 0; index < se.operands.length; ++index) { if (se.operands[index].type !== OP_RUNTIME) continue; @@ -416,13 +417,14 @@ class Expression extends ExpressionItem { let values = results[1]; for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { const operand = st.operands[operandIndex]; - assert(operand instanceof ExpressionItem); + assertLog(operand instanceof ExpressionItem, [st.op, st.operands.length, operand]); if ((values[operandIndex] ?? null) != null) { continue; } if (operand instanceof ExpressionItems.StackItem) { values[operandIndex] = this.evaluateStackPos(stackResults, stackIndex - operand.getOffset()); } else { + console.log(operand); values[operandIndex] = operand.eval(options); } if (options.instance) { @@ -433,12 +435,15 @@ class Expression extends ExpressionItem { console.log([st.op, ...values]); let value = null; - if (values.some(value => value === null)) { + if (values.some(value => value instanceof ExpressionItems.NonRuntimeEvaluableItem)) { + value = ExpressionItems.NonRuntimeEvaluableItem.get(); + } else if (values.some(value => value === null)) { value = null; + EXIT_HERE; } else if (st.op === false) { value = values[0]; } else if (values.some(value => value instanceof ExpressionItems.ProofItem)) { - value = null; + value = ExpressionItems.NonRuntimeEvaluableItem.get(); } else { value = this.applyOperation(st.op, values); } @@ -567,15 +572,16 @@ class Expression extends ExpressionItem { } assert(value instanceof ExpressionItems.ExpressionItem); if (value instanceof ExpressionItems.StackItem) { - return null; + return value; } else if (value instanceof ExpressionItems.ValueItem) { return value; } else if (value instanceof ExpressionItems.ProofItem) { - return null; + return ExpressionItems.NonRuntimeEvaluableItem.get(); } else if (value instanceof ExpressionItems.ReferenceItem) { const res = Context.runtime.eval(value, {}); - console.log(value); + console.log(util.inspect(value, false, 10, true)); console.log(res); + console.log(res.eval()); return res; } else if (value instanceof ExpressionItems.FunctionCall) { console.log(util.inspect(value, false, 10, true)); @@ -630,6 +636,10 @@ class Expression extends ExpressionItem { return values.map(value => this.evaluateValueAsNumber(value, options)); } getArrayResult(results, indexes, options) { + console.log(results); + console.log(indexes); + // TODO + return results; // this method take one of results using indexes } evaluateOperands(options) { @@ -649,17 +659,22 @@ class Expression extends ExpressionItem { let operandResults = results[1]; console.log(st.operands); for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { - const operand = st.operands[operandIndex]; + const operand = assertExpressionItem(st.operands[operandIndex]); + + // when evaluates single operands, StackItem is a reference to stack position + // and it could be evaluated when all operands are left-to-right evaluated + if (operand instanceof ExpressionItems.StackItem) continue; + let next = 0; // if no prior defined priorValue was 0 let priorValue = operand.prior ? this.evaluateValueAsNumber(operand.prior, options) : 0n; - let result = this.evaluateValue(operand, options); + let result = assertExpressionItem(this.evaluateValue(operand, options), operand); console.log(['RESULT', result]); let indexes = operand.indexes ? this.evaluateValuesAsNumbers(operand.indexes, options) : []; if (indexes.length) { // TODO: fixed access - result = this.getArrayResult(result, indexes, options); + result = assertExpressionItem(this.getArrayResult(result, indexes, options)); } // if no prior defined nextValue was 0 console.log(operand.next); @@ -671,7 +686,8 @@ class Expression extends ExpressionItem { } next = nextValue - priorValue; if (options.instance && result !== null) { - st.operands[operandIndex] = result; + console.log (result); + st.operands[operandIndex] = assertExpressionItem(result); } } } @@ -682,8 +698,8 @@ class Expression extends ExpressionItem { return stackResults[pos][0]; } - if (stackResults[pos][1].some(x => !(x instanceof ExprecloneDeepssionItems.IntValue))) { - return null; + if (stackResults[pos][1].some(x => !(x instanceof ExpressionItems.IntValue))) { + return ExpressionItem.NonRuntimeEvaluableItem.get(); } stackResults[pos][0] = this.applyOperation(st.op, stackResults[pos][1]); @@ -803,7 +819,7 @@ class Expression extends ExpressionItem { assert(!firstValue || (!firstValue.next && !firstValue.__next)); assert(!secondValue || (!secondValue.next && !secondValue.__next)); const res = this.applyOperation(st.op, st.operands); - st.operands = [res]; + st.operands = [assertExpressionItem(res)]; st.op = false; return true; } @@ -813,6 +829,7 @@ class Expression extends ExpressionItem { assert(!firstValue.next && !firstValue.__next); st.op = false; st.operands[0].setValue(-st.operands[0].getValue()); + assert(st.operands[0] instanceof ExpressionItem); return true; } @@ -897,7 +914,7 @@ class Expression extends ExpressionItem { assert(absolutePos < istack); if (purge && this.stack[newAbsolutePos].op === false) { // if purge and referenced position was alone, it is copied (duplicated) - this.stack[istack].operands[iope] = this.stack[newAbsolutePos].operands[0].clone(); + this.stack[istack].operands[iope] = assertExpressionItem(this.stack[newAbsolutePos].operands[0].clone()); } else { // stackIndex - 1 is new really istack after clear simplified stack positions // calculate relative position (offset) diff --git a/src/expression_items.js b/src/expression_items.js index f9ee15b..9edc576 100644 --- a/src/expression_items.js +++ b/src/expression_items.js @@ -18,6 +18,7 @@ const ArrayOf = require("./expression_items/array_of.js"); const FixedCol = require("./expression_items/fixed_col.js"); const FunctionCall = require("./expression_items/function_call.js"); const ParamItem = require("./expression_items/param_item.js"); +const NonRuntimeEvaluableItem = require('./expression_items/non_runtime_evaluable_item.js'); module.exports = { ExpressionItem, @@ -39,5 +40,6 @@ module.exports = { WitnessCol, ArrayOf, FunctionCall, - ParamItem + ParamItem, + NonRuntimeEvaluableItem } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index c3ebbef..fb99e6d 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -54,12 +54,13 @@ */ const Exceptions = require('../exceptions.js'); -module.exports = class ExpressionItem { +class ExpressionItem { static _classToManager = {}; constructor(debug = {}) { this.debug = debug; this.indexes = false; + this._ns_ = 'ExpressionItem'; } static registerClass(name, cls) { ExpressionItem[name] = cls; @@ -126,3 +127,5 @@ module.exports = class ExpressionItem { throw new Error(`eval not defined for class ${this.constructor.name}`); } } + +module.exports = ExpressionItem; \ No newline at end of file diff --git a/src/expression_items/fixed_col.js b/src/expression_items/fixed_col.js index 669424f..93e5bbc 100644 --- a/src/expression_items/fixed_col.js +++ b/src/expression_items/fixed_col.js @@ -47,4 +47,7 @@ module.exports = class FixedCol extends ProofItem { } return cloned; } + toString() { + return `FixedCol@${this.id}`; + } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index fb7549a..28535a1 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -21,6 +21,7 @@ module.exports = class FunctionCall extends RuntimeItem { clone() { let cloned = new FunctionCall(this.name, this.args, this.indexes); cloned.funcdef = this.funcdef; + return cloned; } eval(options) { const definition = Context.references.get(this.name, options); diff --git a/src/expression_items/no_evaluated_item.js b/src/expression_items/no_evaluated_item.js new file mode 100644 index 0000000..cc7663b --- /dev/null +++ b/src/expression_items/no_evaluated_item.js @@ -0,0 +1,26 @@ +const ExpressionItem = require("./expression_item.js"); + + +class NonEvaluatedItem extends ExpressionItem { + + static _singletonInstance = new NonEvaluatedItem(); + constructor () { + super(); + } + static get () { + return NonEvaluatedItem._singletonInstance; + } + clone() { + return NonEvaluatedItem._singletonInstance; + } + eval(options) { + return NonEvaluatedItem._singletonInstance;; + } + runtimeEvaluable() { + // not evaluated, but perhaps could be evaluated + return true; + } +} +Object.freeze(NonEvaluatedItem._singletonInstance); + +module.exports = NonEvaluatedItem; \ No newline at end of file diff --git a/src/expression_items/non_runtime_evaluable_item.js b/src/expression_items/non_runtime_evaluable_item.js new file mode 100644 index 0000000..84d2cef --- /dev/null +++ b/src/expression_items/non_runtime_evaluable_item.js @@ -0,0 +1,25 @@ +const ExpressionItem = require("./expression_item.js"); + + +class NonRuntimeEvaluableItem extends ExpressionItem { + + static _singletonInstance = new NonRuntimeEvaluableItem(); + constructor () { + super(); + } + static get () { + return NonRuntimeEvaluableItem._singletonInstance; + } + clone() { + return NonRuntimeEvaluableItem._singletonInstance; + } + eval(options) { + return NonRuntimeEvaluableItem._singletonInstance;; + } + runtimeEvaluable() { + return false; + } +} +Object.freeze(NonRuntimeEvaluableItem._singletonInstance); + +module.exports = NonRuntimeEvaluableItem; \ No newline at end of file diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index dd11aec..68d8ab8 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -22,5 +22,11 @@ module.exports = class ProofItem extends ExpressionItem { const label = options.label ? options.label : `${defaultType}@${this.id}`; return `${pre}${label}${post}`; } + eval(options) { + return this.clone(); + } + runtimeEvaluable() { + return false; + } } diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index 3eb0d19..7c87ac9 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -18,6 +18,7 @@ module.exports = class ReferenceItem extends RuntimeItem { console.log(this); const item = Context.references.getItem(this.name, this.indexes); // TODO: next + console.log(`REFERENCE ${this.name} [${this.indexes.join('][')}]`) console.log(item); return item; } diff --git a/src/expression_items/runtime_item.js b/src/expression_items/runtime_item.js index 78878b2..a37fa3b 100644 --- a/src/expression_items/runtime_item.js +++ b/src/expression_items/runtime_item.js @@ -4,5 +4,8 @@ module.exports = class RuntimeItem extends ExpressionItem { constructor(debug = {}) { super(debug); } + runtimeEvaluable() { + return true; + } } diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index d8dcb7c..556b9ef 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -29,4 +29,7 @@ module.exports = class ValueItem extends ExpressionItem { eval(options = {}) { return this.clone(); } + toString() { + return `${this.value}`; + } } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index ea59f45..4a5d7e6 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,14 +1,17 @@ const ProofItem = require("./proof_item.js"); const {assert, assertLog} = require('../assert.js'); module.exports = class WitnessCol extends ProofItem { - constructor (id, stage = 1) { + constructor (id) { assertLog(typeof id !== 'undefined', id); - super(id, stage); + super(id); console.log('CONSTRUCTOR_WITNESS', id, this.id); } clone() { - let cloned = new WitnessCol(this.id, this.stage); + let cloned = new WitnessCol(this.id); console.log('CLONE_WITNESS:', this, cloned); return cloned; } + toString() { + return `WitnessCol@${this.id}`; + } } diff --git a/src/processor.js b/src/processor.js index fa1d8aa..62c2d8b 100644 --- a/src/processor.js +++ b/src/processor.js @@ -887,6 +887,7 @@ module.exports = class Processor { } console.log(`\x1B[1;36;44m${prefix}CONSTRAINT > ${expr.toString({hideClass:true, hideLabel:false})} === 0 (${this.sourceRef})\x1B[0m`); console.log(`\x1B[1;36;44m${prefix}CONSTRAINT (RAW)> ${expr.toString({hideClass:true, hideLabel:true})} === 0 (${this.sourceRef})\x1B[0m`); + EXIT_HERE; } execVariableIncrement(s) { // REVIEW used only inside loop (increment) in other cases was an expression diff --git a/src/reference.js b/src/reference.js index 0a2942a..e1290e5 100644 --- a/src/reference.js +++ b/src/reference.js @@ -56,9 +56,11 @@ class Reference { let locator = this.locator; if (Array.isArray(indexes) && indexes.length > 0) { const evaluatedIndexes = indexes.map(x => x.asInt()); + console.log(evaluatedIndexes); locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } - const res = this.instance.getItem(this.locator); + console.log(locator); + const res = this.instance.getItem(locator); console.log(res); return res; } diff --git a/src/references.js b/src/references.js index de9a5d6..f079f10 100644 --- a/src/references.js +++ b/src/references.js @@ -238,11 +238,14 @@ module.exports = class References { assert(typeof name === 'string' || (Array.isArray(name) && name.length > 0)); + console.log(indexes); indexes = indexes ?? []; options = options ?? {}; console.log(name); const reference = this.getReference(name); + console.log(reference); + console.log(indexes); const item = reference.getItem(indexes); console.log(item); diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil index c8ac9a6..6dcb137 100644 --- a/test/pil2/collection/expressions.pil +++ b/test/pil2/collection/expressions.pil @@ -1,7 +1,8 @@ subproof ExpressionTest(2**16) { - col fixed x[4]; + col witness x[4],y; expr ex = x[0] + 2 * x[1] + 4 * x[2] + 2 ** 3 * x[3]; + x[0] + 2 * x[1] + 3 * x[2] + 5 * y === 0; ex === 0; int k = 10; From 03356c01ce83d9e0f0d2feb8ba481c18a06ba7f0 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Sun, 1 Oct 2023 23:58:19 +0200 Subject: [PATCH 14/33] WIP refactoring and testing --- build/pil_parser.js | 741 +++++++++--------- docs/expression.md | 21 +- src/constraints.js | 3 +- src/definition_items.js | 22 +- src/definition_items/definition_item.js | 1 + .../{expression.js => expression_variable.js} | 5 +- .../{fe_value.js => fe_variable.js} | 6 +- .../{int_value.js => int_variable.js} | 9 +- src/definition_items/reference_item.js | 20 - .../{string_value.js => string_variable.js} | 6 +- .../{value_item.js => variable.js} | 5 +- src/expression.js | 128 +-- src/expression_factory.js | 29 +- src/expression_items/array_of.js | 2 +- src/expression_items/challenge.js | 2 +- src/expression_items/expression_item.js | 57 +- src/expression_items/fe_value.js | 2 +- src/expression_items/fixed_col.js | 24 +- src/expression_items/function_call.js | 12 +- src/expression_items/int_value.js | 2 +- .../non_runtime_evaluable_item.js | 2 +- src/expression_items/param_item.js | 2 +- src/expression_items/proof_item.js | 18 +- src/expression_items/proofval.js | 2 +- src/expression_items/public.js | 2 +- src/expression_items/publictable.js | 2 +- src/expression_items/reference_item.js | 38 +- src/expression_items/row_offset.js | 58 ++ src/expression_items/stack_item.js | 2 +- src/expression_items/string_value.js | 2 +- src/expression_items/subproofval.js | 2 +- src/expression_items/value_item.js | 6 +- src/expression_items/witness_col.js | 10 +- src/indexable.js | 2 +- src/pil_parser.jison | 38 +- src/processor.js | 26 +- src/reference.js | 12 +- src/references.js | 5 +- test/pil2/collection/expressions.pil | 13 +- 39 files changed, 734 insertions(+), 605 deletions(-) rename src/definition_items/{expression.js => expression_variable.js} (76%) rename src/definition_items/{fe_value.js => fe_variable.js} (63%) rename src/definition_items/{int_value.js => int_variable.js} (81%) delete mode 100644 src/definition_items/reference_item.js rename src/definition_items/{string_value.js => string_variable.js} (88%) rename src/definition_items/{value_item.js => variable.js} (75%) create mode 100644 src/expression_items/row_offset.js diff --git a/build/pil_parser.js b/build/pil_parser.js index 38ebb9c..87ca8c1 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -72,14 +72,14 @@ } */ var pil_parser = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,24,31,55,56,61,62,70,71,72,73,74,77,78,79,80,82,83,137],$V1=[1,37],$V2=[1,31],$V3=[1,32],$V4=[1,21],$V5=[1,33],$V6=[1,34],$V7=[1,35],$V8=[1,30],$V9=[1,23],$Va=[1,24],$Vb=[1,36],$Vc=[1,27],$Vd=[1,28],$Ve=[1,25],$Vf=[1,26],$Vg=[1,22],$Vh=[1,45],$Vi=[1,47],$Vj=[1,48],$Vk=[26,68,95,143],$Vl=[2,215],$Vm=[1,50],$Vn=[1,51],$Vo=[1,52],$Vp=[1,56],$Vq=[1,57],$Vr=[1,59],$Vs=[1,58],$Vt=[6,8,24,30,31,55,56,61,62,70,71,72,73,74,77,78,79,80,82,83,107,108,137],$Vu=[1,66],$Vv=[1,73],$Vw=[1,72],$Vx=[1,74],$Vy=[1,71],$Vz=[1,79],$VA=[1,90],$VB=[1,119],$VC=[1,142],$VD=[1,141],$VE=[1,118],$VF=[2,38],$VG=[1,114],$VH=[1,135],$VI=[1,115],$VJ=[1,157],$VK=[1,153],$VL=[1,154],$VM=[1,155],$VN=[1,126],$VO=[1,156],$VP=[1,139],$VQ=[1,124],$VR=[1,125],$VS=[1,143],$VT=[1,144],$VU=[1,145],$VV=[1,146],$VW=[1,147],$VX=[1,148],$VY=[1,131],$VZ=[1,132],$V_=[1,150],$V$=[1,133],$V01=[1,140],$V11=[1,127],$V21=[1,128],$V31=[1,129],$V41=[1,137],$V51=[1,152],$V61=[2,67],$V71=[1,176],$V81=[1,161],$V91=[1,164],$Va1=[1,165],$Vb1=[1,166],$Vc1=[1,167],$Vd1=[1,168],$Ve1=[1,169],$Vf1=[1,170],$Vg1=[1,171],$Vh1=[1,172],$Vi1=[1,173],$Vj1=[1,174],$Vk1=[1,175],$Vl1=[6,8,24,30,31,55,56,61,62,70,71,72,73,74,77,78,79,80,82,83,108,137],$Vm1=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vn1=[2,255],$Vo1=[1,189],$Vp1=[1,190],$Vq1=[6,8,24,30,31,51,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137],$Vr1=[6,8,24,30,31,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137],$Vs1=[2,345],$Vt1=[2,56],$Vu1=[1,194],$Vv1=[1,195],$Vw1=[2,194],$Vx1=[6,8,24,30,31,53,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137],$Vy1=[2,191],$Vz1=[1,198],$VA1=[6,8,24,25,28,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VB1=[1,217],$VC1=[1,220],$VD1=[1,221],$VE1=[1,222],$VF1=[1,223],$VG1=[1,224],$VH1=[21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$VI1=[1,231],$VJ1=[8,30,108],$VK1=[1,239],$VL1=[1,233],$VM1=[1,234],$VN1=[1,235],$VO1=[1,236],$VP1=[1,237],$VQ1=[1,238],$VR1=[1,240],$VS1=[1,241],$VT1=[1,242],$VU1=[1,243],$VV1=[1,244],$VW1=[1,245],$VX1=[1,246],$VY1=[1,247],$VZ1=[1,248],$V_1=[1,249],$V$1=[1,250],$V02=[1,251],$V12=[1,252],$V22=[1,253],$V32=[1,254],$V42=[1,255],$V52=[8,21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$V62=[1,265],$V72=[1,267],$V82=[2,308],$V92=[1,271],$Va2=[1,272],$Vb2=[1,274],$Vc2=[1,275],$Vd2=[1,276],$Ve2=[1,277],$Vf2=[1,281],$Vg2=[1,280],$Vh2=[1,282],$Vi2=[1,284],$Vj2=[1,286],$Vk2=[1,300],$Vl2=[1,301],$Vm2=[1,299],$Vn2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vo2=[2,337],$Vp2=[1,308],$Vq2=[1,307],$Vr2=[1,310],$Vs2=[1,313],$Vt2=[1,316],$Vu2=[1,319],$Vv2=[6,8,24,30,31,46,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vw2=[48,64],$Vx2=[6,8,24,26,28,30,31,48,51,53,55,56,58,61,62,64,65,68,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$Vy2=[1,345],$Vz2=[1,354],$VA2=[1,355],$VB2=[53,64],$VC2=[1,377],$VD2=[48,53,64],$VE2=[8,21,24,26,28,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,121,123,129,137,141,142,143,154,170,171,172,178,180],$VF2=[1,411],$VG2=[1,415],$VH2=[1,416],$VI2=[1,421],$VJ2=[1,422],$VK2=[26,31,46,62,68,70,71,72,74,78,95,121,123,141,142,143,170,171,172,178,180],$VL2=[1,425],$VM2=[2,242],$VN2=[1,456],$VO2=[1,487],$VP2=[6,8,24,25,28,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,151,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$VQ2=[6,8,24,30,31,51,53,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,127,137],$VR2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167],$VS2=[6,8,24,28,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$VT2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,162,163,167],$VU2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147,163,167],$VV2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172],$VW2=[6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176],$VX2=[1,504],$VY2=[30,64],$VZ2=[1,507],$V_2=[30,53,64],$V$2=[6,8,24,28,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$V03=[1,516],$V13=[1,518],$V23=[2,41],$V33=[8,107],$V43=[1,544],$V53=[1,589],$V63=[1,590],$V73=[1,591],$V83=[53,64,65],$V93=[2,241],$Va3=[1,593],$Vb3=[8,30],$Vc3=[6,8,24,30,31,46,48,51,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,121,123,127,131,132,133,137,146,147,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,180],$Vd3=[6,8,24,30,31,48,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137],$Ve3=[53,58,64,65],$Vf3=[6,8,21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],$Vg3=[1,678],$Vh3=[1,685],$Vi3=[1,686],$Vj3=[1,719],$Vk3=[58,64],$Vl3=[30,116,119]; +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,20,25,32,56,57,62,63,71,72,73,74,75,78,79,80,81,83,84,138],$V1=[1,38],$V2=[1,32],$V3=[1,33],$V4=[1,22],$V5=[1,34],$V6=[1,35],$V7=[1,36],$V8=[1,31],$V9=[1,24],$Va=[1,25],$Vb=[1,37],$Vc=[1,28],$Vd=[1,29],$Ve=[1,26],$Vf=[1,27],$Vg=[1,23],$Vh=[1,46],$Vi=[1,48],$Vj=[1,49],$Vk=[27,69,96,144],$Vl=[2,217],$Vm=[1,51],$Vn=[1,52],$Vo=[1,53],$Vp=[1,57],$Vq=[1,58],$Vr=[1,60],$Vs=[1,59],$Vt=[6,8,20,25,31,32,56,57,62,63,71,72,73,74,75,78,79,80,81,83,84,108,109,138],$Vu=[1,67],$Vv=[1,74],$Vw=[1,73],$Vx=[1,75],$Vy=[1,72],$Vz=[1,80],$VA=[1,91],$VB=[1,120],$VC=[1,150],$VD=[1,143],$VE=[1,142],$VF=[1,119],$VG=[2,39],$VH=[1,115],$VI=[1,136],$VJ=[1,116],$VK=[1,159],$VL=[1,155],$VM=[1,156],$VN=[1,157],$VO=[1,127],$VP=[1,158],$VQ=[1,140],$VR=[1,125],$VS=[1,126],$VT=[1,144],$VU=[1,145],$VV=[1,146],$VW=[1,147],$VX=[1,148],$VY=[1,149],$VZ=[1,132],$V_=[1,133],$V$=[1,152],$V01=[1,134],$V11=[1,141],$V21=[1,128],$V31=[1,129],$V41=[1,130],$V51=[1,138],$V61=[1,154],$V71=[2,68],$V81=[1,178],$V91=[1,163],$Va1=[1,166],$Vb1=[1,167],$Vc1=[1,168],$Vd1=[1,169],$Ve1=[1,170],$Vf1=[1,171],$Vg1=[1,172],$Vh1=[1,173],$Vi1=[1,174],$Vj1=[1,175],$Vk1=[1,176],$Vl1=[1,177],$Vm1=[6,8,20,25,31,32,56,57,62,63,71,72,73,74,75,78,79,80,81,83,84,109,138],$Vn1=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$Vo1=[2,257],$Vp1=[1,191],$Vq1=[1,192],$Vr1=[6,8,20,25,31,32,52,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,128,138],$Vs1=[6,8,20,25,31,32,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,138],$Vt1=[2,347],$Vu1=[2,57],$Vv1=[1,196],$Vw1=[1,197],$Vx1=[2,196],$Vy1=[6,8,20,25,31,32,54,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,128,138],$Vz1=[2,193],$VA1=[1,200],$VB1=[6,8,20,25,26,29,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$VC1=[1,219],$VD1=[1,222],$VE1=[1,223],$VF1=[1,224],$VG1=[1,225],$VH1=[1,226],$VI1=[20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],$VJ1=[1,233],$VK1=[8,31,109],$VL1=[1,241],$VM1=[1,235],$VN1=[1,236],$VO1=[1,237],$VP1=[1,238],$VQ1=[1,239],$VR1=[1,240],$VS1=[1,242],$VT1=[1,243],$VU1=[1,244],$VV1=[1,245],$VW1=[1,246],$VX1=[1,247],$VY1=[1,248],$VZ1=[1,249],$V_1=[1,250],$V$1=[1,251],$V02=[1,252],$V12=[1,253],$V22=[1,254],$V32=[1,255],$V42=[1,256],$V52=[1,257],$V62=[8,20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,115,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],$V72=[1,267],$V82=[1,269],$V92=[2,310],$Va2=[1,273],$Vb2=[1,274],$Vc2=[1,276],$Vd2=[1,277],$Ve2=[1,278],$Vf2=[1,279],$Vg2=[1,283],$Vh2=[1,282],$Vi2=[1,284],$Vj2=[1,286],$Vk2=[1,288],$Vl2=[1,302],$Vm2=[1,303],$Vn2=[1,301],$Vo2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$Vp2=[2,339],$Vq2=[1,310],$Vr2=[1,309],$Vs2=[1,312],$Vt2=[1,315],$Vu2=[1,318],$Vv2=[1,321],$Vw2=[6,8,20,25,31,32,47,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$Vx2=[49,65],$Vy2=[6,8,20,25,27,29,31,32,49,52,54,56,57,59,62,63,65,66,69,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$Vz2=[1,347],$VA2=[1,356],$VB2=[1,357],$VC2=[54,65],$VD2=[1,379],$VE2=[49,54,65],$VF2=[8,20,22,25,27,29,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,122,124,130,138,142,143,144,155,171,172,173,179,181],$VG2=[1,413],$VH2=[1,417],$VI2=[1,418],$VJ2=[1,423],$VK2=[1,424],$VL2=[27,32,47,63,69,71,72,73,75,79,96,122,124,142,143,144,171,172,173,179,181],$VM2=[1,427],$VN2=[2,244],$VO2=[1,458],$VP2=[1,489],$VQ2=[6,8,20,25,26,29,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,152,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$VR2=[6,8,20,25,31,32,52,54,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,128,138],$VS2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168],$VT2=[6,8,20,25,29,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$VU2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,109,119,138,147,148,163,164,168],$VV2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,109,119,138,147,148,164,168],$VW2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173],$VX2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177],$VY2=[1,506],$VZ2=[31,65],$V_2=[1,509],$V$2=[31,54,65],$V03=[6,8,20,25,29,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$V13=[1,518],$V23=[1,520],$V33=[2,42],$V43=[8,108],$V53=[1,546],$V63=[1,591],$V73=[1,592],$V83=[1,593],$V93=[54,65,66],$Va3=[2,243],$Vb3=[1,595],$Vc3=[8,31],$Vd3=[6,8,20,25,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$Ve3=[6,8,20,25,31,32,49,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,138],$Vf3=[54,59,65,66],$Vg3=[6,8,20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,115,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],$Vh3=[1,680],$Vi3=[1,687],$Vj3=[1,688],$Vk3=[1,721],$Vl3=[59,65],$Vm3=[31,117,120]; var parser = {trace: function trace () { Jison.print.apply(null, arguments); }, yy: {}, -symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"variable_declaration":19,"use_directive":20,"USE":21,"name_reference":22,"no_closed_container_definition":23,"CONTAINER":24,"ALIAS":25,"IDENTIFIER":26,"closed_container_definition":27,"{":28,"declare_block":29,"}":30,"PROOF":31,"statement_block":32,"non_delimited_statement":33,"statement_closed":34,"lcs":35,"statement_no_closed":36,"statement_list":37,"statement_list_closed":38,"declare_list":39,"when_boundary":40,"FIRST":41,"LAST":42,"FRAME":43,"codeblock_closed":44,"WHEN":45,"(":46,"expression":47,")":48,"HINT":49,"data_object":50,"[":51,"data_array":52,"]":53,"function":54,"FUNCTION":55,"PRIVATE":56,"arguments":57,":":58,"return_type_list":59,"return_type":60,"FINAL":61,"SUBPROOF":62,"arguments_list":63,",":64,"DOTS_FILL":65,"argument":66,"basic_type":67,"REFERENCE":68,"type_array":69,"INT":70,"FE":71,"EXPR":72,"CONST":73,"COL":74,"WITNESS":75,"FIXED":76,"CHALLENGE":77,"T_STRING":78,"PROOF_VALUE":79,"SUBPROOF_VALUE":80,"AIR_VALUE":81,"PUBLIC":82,"PUBLIC_TABLE":83,"declare_item":84,"codeblock_no_closed":85,"===":86,"delayed_function_call":87,"constant_definition":88,"data_value":89,"function_call":90,"name_optional_index":91,"multiple_expression_list":92,"delayed_function_event":93,"defined_scopes":94,"AIR":95,"ON":96,"variable_assignment":97,"variable_multiple_assignment":98,"return_statement":99,"CONTINUE":100,"BREAK":101,"in_expression":102,"expression_list":103,"FOR":104,"for_init":105,"variable_assignment_list":106,"IN":107,"WHILE":108,"DO":109,"ONCE":110,"SWITCH":111,"case_body":112,"IF":113,"ELSE":114,"case_list":115,"DEFAULT":116,"case_value":117,"DOTS_RANGE":118,"CASE":119,"for_assignation":120,"INC":121,"name_id":122,"DEC":123,"variable_type_declaration":124,"variable_declaration_list":125,"variable_declaration_item":126,"=":127,"variable_declaration_array":128,"RETURN":129,"assign_operation":130,"+=":131,"-=":132,"*=":133,"left_variable_multiple_assignment_list":134,"left_variable_multiple_assignment":135,"sequence_definition":136,"INCLUDE":137,"flexible_string":138,"stage_definition":139,"STAGE":140,"NUMBER":141,"STRING":142,"TEMPLATE_STRING":143,"sequence_list":144,"sequence":145,"DOTS_ARITH_SEQ":146,"DOTS_GEOM_SEQ":147,"declaration_array":148,"col_declaration_item":149,"col_declaration_ident":150,".":151,"col_declaration_list":152,"AGGREGATE":153,"CONSTANT":154,"EQ":155,"NE":156,"LT":157,"GT":158,"LE":159,"GE":160,"IS":161,"AND":162,"?":163,"B_AND":164,"B_OR":165,"B_XOR":166,"OR":167,"SHL":168,"SHR":169,"!":170,"+":171,"-":172,"*":173,"%":174,"/":175,"\\\\":176,"POW":177,"POSITIONAL_PARAM":178,"casting":179,"'":180,"array_index":181,"name_reference_right":182,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"EOF",8:"CS",21:"USE",24:"CONTAINER",25:"ALIAS",26:"IDENTIFIER",28:"{",30:"}",31:"PROOF",41:"FIRST",42:"LAST",43:"FRAME",45:"WHEN",46:"(",48:")",49:"HINT",51:"[",53:"]",55:"FUNCTION",56:"PRIVATE",58:":",61:"FINAL",62:"SUBPROOF",64:",",65:"DOTS_FILL",68:"REFERENCE",70:"INT",71:"FE",72:"EXPR",73:"CONST",74:"COL",75:"WITNESS",76:"FIXED",77:"CHALLENGE",78:"T_STRING",79:"PROOF_VALUE",80:"SUBPROOF_VALUE",81:"AIR_VALUE",82:"PUBLIC",83:"PUBLIC_TABLE",86:"===",95:"AIR",96:"ON",100:"CONTINUE",101:"BREAK",104:"FOR",107:"IN",108:"WHILE",109:"DO",110:"ONCE",111:"SWITCH",113:"IF",114:"ELSE",116:"DEFAULT",118:"DOTS_RANGE",119:"CASE",121:"INC",123:"DEC",127:"=",129:"RETURN",131:"+=",132:"-=",133:"*=",137:"INCLUDE",140:"STAGE",141:"NUMBER",142:"STRING",143:"TEMPLATE_STRING",146:"DOTS_ARITH_SEQ",147:"DOTS_GEOM_SEQ",151:".",153:"AGGREGATE",154:"CONSTANT",155:"EQ",156:"NE",157:"LT",158:"GT",159:"LE",160:"GE",161:"IS",162:"AND",163:"?",164:"B_AND",165:"B_OR",166:"B_XOR",167:"OR",168:"SHL",169:"SHR",170:"!",171:"+",172:"-",173:"*",174:"%",175:"/",176:"\\\\",177:"POW",178:"POSITIONAL_PARAM",180:"'"}, -productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[20,2],[23,2],[23,4],[27,5],[27,7],[10,4],[33,1],[33,2],[33,1],[33,2],[37,1],[37,2],[37,1],[38,2],[38,3],[38,3],[38,1],[38,2],[38,2],[38,1],[32,1],[32,0],[29,1],[29,2],[29,0],[35,2],[35,1],[40,1],[40,1],[40,1],[34,1],[34,5],[34,3],[34,4],[34,4],[34,3],[34,1],[34,1],[34,3],[54,2],[54,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[57,1],[57,3],[57,1],[57,0],[63,3],[63,1],[66,2],[66,2],[66,3],[66,3],[67,1],[67,1],[67,1],[67,2],[67,2],[67,2],[67,2],[67,2],[67,1],[67,1],[67,2],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[59,3],[59,1],[69,3],[69,2],[60,1],[60,2],[39,3],[39,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[84,1],[36,1],[36,1],[36,1],[36,1],[36,3],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[89,1],[89,3],[89,3],[50,5],[50,3],[50,3],[50,1],[52,3],[52,1],[90,4],[93,1],[94,1],[94,1],[94,1],[87,7],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[102,1],[102,3],[44,9],[44,7],[44,5],[44,6],[44,6],[44,3],[44,5],[44,5],[44,7],[112,3],[112,5],[117,3],[117,5],[117,1],[117,3],[115,5],[115,4],[120,1],[120,2],[120,2],[120,2],[120,2],[105,1],[105,1],[105,1],[105,1],[19,1],[19,2],[124,2],[124,2],[124,2],[124,2],[124,2],[124,4],[124,4],[124,4],[124,4],[124,4],[124,4],[124,8],[124,8],[124,8],[124,8],[124,8],[128,2],[128,3],[128,3],[128,4],[126,1],[126,2],[125,3],[125,1],[99,1],[99,2],[99,4],[130,1],[130,1],[130,1],[130,1],[134,3],[134,2],[134,1],[135,3],[135,5],[98,3],[98,5],[97,3],[97,3],[106,3],[106,1],[12,2],[139,4],[139,0],[138,1],[138,1],[136,3],[136,4],[136,5],[136,6],[144,3],[144,5],[144,5],[144,5],[144,9],[144,9],[144,4],[144,4],[144,6],[144,6],[144,1],[144,3],[145,3],[145,3],[145,5],[145,5],[145,7],[145,2],[145,3],[145,1],[92,0],[92,3],[92,5],[92,3],[92,1],[103,4],[103,3],[103,2],[103,1],[148,2],[148,3],[148,3],[148,4],[149,1],[149,2],[150,1],[150,1],[150,1],[150,3],[150,3],[152,3],[152,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[88,4],[88,5],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,5],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,2],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,3],[47,2],[47,2],[47,1],[47,2],[47,2],[47,2],[47,2],[47,1],[47,1],[47,3],[47,1],[47,1],[47,1],[179,4],[179,4],[179,4],[179,4],[179,4],[179,5],[179,5],[179,5],[179,5],[179,5],[122,2],[122,3],[122,5],[122,3],[122,2],[122,3],[122,5],[122,3],[122,1],[91,1],[91,2],[181,4],[181,3],[22,3],[22,3],[22,3],[22,1],[22,3],[22,1],[22,3],[182,3],[182,3],[182,1],[182,1]], +symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"variable_declaration":19,"DEBUGGER":20,"use_directive":21,"USE":22,"name_reference":23,"no_closed_container_definition":24,"CONTAINER":25,"ALIAS":26,"IDENTIFIER":27,"closed_container_definition":28,"{":29,"declare_block":30,"}":31,"PROOF":32,"statement_block":33,"non_delimited_statement":34,"statement_closed":35,"lcs":36,"statement_no_closed":37,"statement_list":38,"statement_list_closed":39,"declare_list":40,"when_boundary":41,"FIRST":42,"LAST":43,"FRAME":44,"codeblock_closed":45,"WHEN":46,"(":47,"expression":48,")":49,"HINT":50,"data_object":51,"[":52,"data_array":53,"]":54,"function":55,"FUNCTION":56,"PRIVATE":57,"arguments":58,":":59,"return_type_list":60,"return_type":61,"FINAL":62,"SUBPROOF":63,"arguments_list":64,",":65,"DOTS_FILL":66,"argument":67,"basic_type":68,"REFERENCE":69,"type_array":70,"INT":71,"FE":72,"EXPR":73,"CONST":74,"COL":75,"WITNESS":76,"FIXED":77,"CHALLENGE":78,"T_STRING":79,"PROOF_VALUE":80,"SUBPROOF_VALUE":81,"AIR_VALUE":82,"PUBLIC":83,"PUBLIC_TABLE":84,"declare_item":85,"codeblock_no_closed":86,"===":87,"delayed_function_call":88,"constant_definition":89,"data_value":90,"function_call":91,"name_optional_index":92,"multiple_expression_list":93,"delayed_function_event":94,"defined_scopes":95,"AIR":96,"ON":97,"variable_assignment":98,"variable_multiple_assignment":99,"return_statement":100,"CONTINUE":101,"BREAK":102,"in_expression":103,"expression_list":104,"FOR":105,"for_init":106,"variable_assignment_list":107,"IN":108,"WHILE":109,"DO":110,"ONCE":111,"SWITCH":112,"case_body":113,"IF":114,"ELSE":115,"case_list":116,"DEFAULT":117,"case_value":118,"DOTS_RANGE":119,"CASE":120,"for_assignation":121,"INC":122,"name_id":123,"DEC":124,"variable_type_declaration":125,"variable_declaration_list":126,"variable_declaration_item":127,"=":128,"variable_declaration_array":129,"RETURN":130,"assign_operation":131,"+=":132,"-=":133,"*=":134,"left_variable_multiple_assignment_list":135,"left_variable_multiple_assignment":136,"sequence_definition":137,"INCLUDE":138,"flexible_string":139,"stage_definition":140,"STAGE":141,"NUMBER":142,"STRING":143,"TEMPLATE_STRING":144,"sequence_list":145,"sequence":146,"DOTS_ARITH_SEQ":147,"DOTS_GEOM_SEQ":148,"declaration_array":149,"col_declaration_item":150,"col_declaration_ident":151,".":152,"col_declaration_list":153,"AGGREGATE":154,"CONSTANT":155,"EQ":156,"NE":157,"LT":158,"GT":159,"LE":160,"GE":161,"IS":162,"AND":163,"?":164,"B_AND":165,"B_OR":166,"B_XOR":167,"OR":168,"SHL":169,"SHR":170,"!":171,"+":172,"-":173,"*":174,"%":175,"/":176,"\\\\":177,"POW":178,"POSITIONAL_PARAM":179,"casting":180,"'":181,"array_index":182,"name_reference_right":183,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"EOF",8:"CS",20:"DEBUGGER",22:"USE",25:"CONTAINER",26:"ALIAS",27:"IDENTIFIER",29:"{",31:"}",32:"PROOF",42:"FIRST",43:"LAST",44:"FRAME",46:"WHEN",47:"(",49:")",50:"HINT",52:"[",54:"]",56:"FUNCTION",57:"PRIVATE",59:":",62:"FINAL",63:"SUBPROOF",65:",",66:"DOTS_FILL",69:"REFERENCE",71:"INT",72:"FE",73:"EXPR",74:"CONST",75:"COL",76:"WITNESS",77:"FIXED",78:"CHALLENGE",79:"T_STRING",80:"PROOF_VALUE",81:"SUBPROOF_VALUE",82:"AIR_VALUE",83:"PUBLIC",84:"PUBLIC_TABLE",87:"===",96:"AIR",97:"ON",101:"CONTINUE",102:"BREAK",105:"FOR",108:"IN",109:"WHILE",110:"DO",111:"ONCE",112:"SWITCH",114:"IF",115:"ELSE",117:"DEFAULT",119:"DOTS_RANGE",120:"CASE",122:"INC",124:"DEC",128:"=",130:"RETURN",132:"+=",133:"-=",134:"*=",138:"INCLUDE",141:"STAGE",142:"NUMBER",143:"STRING",144:"TEMPLATE_STRING",147:"DOTS_ARITH_SEQ",148:"DOTS_GEOM_SEQ",152:".",154:"AGGREGATE",155:"CONSTANT",156:"EQ",157:"NE",158:"LT",159:"GT",160:"LE",161:"GE",162:"IS",163:"AND",164:"?",165:"B_AND",166:"B_OR",167:"B_XOR",168:"OR",169:"SHL",170:"SHR",171:"!",172:"+",173:"-",174:"*",175:"%",176:"/",177:"\\\\",178:"POW",179:"POSITIONAL_PARAM",181:"'"}, +productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[21,2],[24,2],[24,4],[28,5],[28,7],[10,4],[34,1],[34,2],[34,1],[34,2],[38,1],[38,2],[38,1],[39,2],[39,3],[39,3],[39,1],[39,2],[39,2],[39,1],[33,1],[33,0],[30,1],[30,2],[30,0],[36,2],[36,1],[41,1],[41,1],[41,1],[35,1],[35,5],[35,3],[35,4],[35,4],[35,3],[35,1],[35,1],[35,3],[55,2],[55,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[58,1],[58,3],[58,1],[58,0],[64,3],[64,1],[67,2],[67,2],[67,3],[67,3],[68,1],[68,1],[68,1],[68,2],[68,2],[68,2],[68,2],[68,2],[68,1],[68,1],[68,2],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[60,3],[60,1],[70,3],[70,2],[61,1],[61,2],[40,3],[40,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[37,1],[37,1],[37,1],[37,1],[37,3],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[90,1],[90,3],[90,3],[51,5],[51,3],[51,3],[51,1],[53,3],[53,1],[91,4],[94,1],[95,1],[95,1],[95,1],[88,7],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[103,1],[103,3],[45,9],[45,7],[45,5],[45,6],[45,6],[45,3],[45,5],[45,5],[45,7],[45,1],[113,3],[113,5],[118,3],[118,5],[118,1],[118,3],[116,5],[116,4],[121,1],[121,2],[121,2],[121,2],[121,2],[106,1],[106,1],[106,1],[106,1],[19,1],[19,2],[125,2],[125,2],[125,2],[125,2],[125,2],[125,4],[125,4],[125,4],[125,4],[125,4],[125,4],[125,8],[125,8],[125,8],[125,8],[125,8],[129,2],[129,3],[129,3],[129,4],[127,1],[127,2],[126,3],[126,1],[100,1],[100,2],[100,4],[131,1],[131,1],[131,1],[131,1],[135,3],[135,2],[135,1],[136,3],[136,5],[99,3],[99,5],[98,3],[98,3],[107,3],[107,1],[12,2],[140,4],[140,0],[139,1],[139,1],[137,3],[137,4],[137,5],[137,6],[145,3],[145,5],[145,5],[145,5],[145,9],[145,9],[145,4],[145,4],[145,6],[145,6],[145,1],[145,3],[146,3],[146,3],[146,5],[146,5],[146,7],[146,2],[146,3],[146,1],[93,0],[93,3],[93,5],[93,3],[93,1],[104,4],[104,3],[104,2],[104,1],[149,2],[149,3],[149,3],[149,4],[150,1],[150,2],[151,1],[151,1],[151,1],[151,3],[151,3],[153,3],[153,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[89,4],[89,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,2],[48,1],[48,2],[48,2],[48,2],[48,2],[48,1],[48,1],[48,3],[48,1],[48,1],[48,1],[180,4],[180,4],[180,4],[180,4],[180,4],[180,5],[180,5],[180,5],[180,5],[180,5],[123,2],[123,3],[123,5],[123,3],[123,2],[123,3],[123,5],[123,3],[123,1],[92,1],[92,2],[182,4],[182,3],[23,3],[23,3],[23,3],[23,1],[23,3],[23,1],[23,3],[183,3],[183,3],[183,1],[183,1]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { /* this == yyval */ @@ -94,810 +94,815 @@ break; case 3: this.$ = [] break; -case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 27: case 29: case 53: case 54: case 64: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 107: case 108: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 130: case 131: case 132: case 133: case 135: case 136: case 138: case 141: case 160: case 166: case 167: case 168: case 191: case 241: case 255: case 306: case 337: +case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 28: case 30: case 54: case 55: case 65: case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 108: case 109: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 131: case 132: case 133: case 134: case 136: case 137: case 139: case 142: case 162: case 168: case 169: case 170: case 193: case 243: case 257: case 308: case 339: this.$ = $$[$0] break; -case 17: - this.$ = { type: 'use', name: $$[$0].name } +case 17: case 153: + this.$ = { type: 'debugger' } break; case 18: - this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } + this.$ = { type: 'use', name: $$[$0].name } break; case 19: - this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } + this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } break; case 20: - this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } break; case 21: - this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } break; case 22: + this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } +break; +case 23: this.$ = { type: 'proof', statements: $$[$0-1].statements } break; -case 23: case 37: case 39: case 165: +case 24: case 38: case 40: case 167: this.$ = $$[$0]; break; -case 24: case 40: +case 25: case 41: this.$ = $$[$0-1]; break; -case 26: case 121: case 122: case 142: case 152: case 315: +case 27: case 122: case 123: case 143: case 154: case 317: this.$ = $$[$0-1] break; -case 28: +case 29: this.$ = $$[$0-1]; this.$.statements.push($$[$0]); break; -case 30: +case 31: this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } break; -case 31: case 32: +case 32: case 33: this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } break; -case 33: case 98: case 212: +case 34: case 99: case 214: this.$ = { statements: [$$[$0]] } break; -case 34: case 35: +case 35: case 36: this.$ = { statements: [$$[$0-1]] } break; -case 44: +case 45: this.$ = { boundary: 'first' } break; -case 45: +case 46: this.$ = { boundary: 'last' } break; -case 46: +case 47: this.$ = { boundary: 'frame' } break; -case 47: +case 48: this.$ = { type: 'code', statements: $$[$0] }; break; -case 48: +case 49: this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } break; -case 49: +case 50: this.$ = { ...$$[$0-1], type: 'when', statements: $$[$0] } break; -case 50: +case 51: this.$ = { type: 'hint', name: $$[$0-3], data: $$[$0-1] } break; -case 51: +case 52: this.$ = { type: 'hint', name: $$[$0-3], data: $$[$0-1] } break; -case 52: +case 53: this.$ = { type: 'hint', name: $$[$0-2], data: $$[$0-1] } break; -case 55: +case 56: this.$ = { type: 'scope_definition', ...$$[$0-1] }; break; -case 56: +case 57: this.$ = {private: false, funcname: $$[$0]} break; -case 57: +case 58: this.$ = {private: true, funcname: $$[$0]} break; -case 58: +case 59: this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } break; -case 59: +case 60: this.$ = { ...$$[$0-8], type: 'function_definition', final: false, ...$$[$0-6], returns: $$[$0-3], ...$$[$0-1] } break; -case 60: +case 61: this.$ = { ...$$[$0-6], type: 'function_definition', final: false, ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 61: +case 62: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'air', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 62: +case 63: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'proof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 63: +case 64: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 65: +case 66: this.$ = $$[$0-2]; this.$.vargs = true break; -case 66: +case 67: this.$ = { args: [], varargs: false } break; -case 67: +case 68: this.$ = { args: [], varargs: false } break; -case 68: +case 69: this.$ = $$[$0-2]; this.$.args.push($$[$0]) break; -case 69: +case 70: this.$ = { args: [ $$[$0] ] } break; -case 70: +case 71: this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } break; -case 71: +case 72: this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } break; -case 72: +case 73: this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } break; -case 73: +case 74: this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } break; -case 74: +case 75: this.$ = { type: 'int' } break; -case 75: +case 76: this.$ = { type: 'fe' } break; -case 76: +case 77: this.$ = { type: 'expr' } break; -case 77: +case 78: this.$ = { type: 'int', const: true } break; -case 78: +case 79: this.$ = { type: 'fe', const: true } break; -case 79: +case 80: this.$ = { type: 'expr', const: true } break; -case 80: +case 81: this.$ = { type: 'witness' } break; -case 81: +case 82: this.$ = { type: 'fixed' } break; -case 82: +case 83: this.$ = { type: 'challenge' } break; -case 83: +case 84: this.$ = { type: 'string' } break; -case 84: +case 85: this.$ = { type: 'string', const: true } break; -case 85: +case 86: this.$ = { type: 'proof' } break; -case 86: +case 87: this.$ = { type: 'subproof' } break; -case 87: +case 88: this.$ = { type: 'air' } break; -case 88: +case 89: this.$ = { type: 'public' } break; -case 89: +case 90: this.$ = { type: 'publicTable' } break; -case 90: +case 91: this.$ = { type: 'function' } break; -case 91: +case 92: this.$ = {returns: [...$$[$0-2], $$[$0]]} break; -case 92: +case 93: this.$.returns = [$$[$0]] break; -case 93: +case 94: this.$ = {dim: $$[$0-2].dim + 1} break; -case 94: +case 95: this.$ = {dim: 1} break; -case 95: +case 96: this.$ = { type: $$[$0].type, dim: 0 } break; -case 96: +case 97: this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } break; -case 97: case 211: +case 98: case 213: this.$ = $$[$0-2]; this.$.statements.push($$[$0]); break; -case 106: +case 107: this.$ = { type: 'code', statements: $$[$0] } break; -case 109: +case 110: this.$ = { type: 'expr', expr: $$[$0] } break; -case 110: +case 111: this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } break; -case 123: - this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] -break; case 124: - this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $$[$0] }) + this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] break; case 125: - this.$ = { type: 'object', data: {}}; this.$.data[$$[$0-2]] = $$[$0] + this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', name: $$[$0] }) break; case 126: - this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $$[$0] }) + this.$ = { type: 'object', data: {}}; this.$.data[$$[$0-2]] = $$[$0] break; case 127: - this.$ = $$[$0-2]; this.$.data.push($$[$0]) + this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', name: $$[$0] }) break; case 128: - this.$ = { type: 'array', data: [ $$[$0] ] } + this.$ = $$[$0-2]; this.$.data.push($$[$0]) break; case 129: + this.$ = { type: 'array', data: [ $$[$0] ] } +break; +case 130: this.$ = { type: 'call', function: $$[$0-3], args: $$[$0-1].values } break; -case 134: +case 135: this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], args: $$[$0-1].values } break; -case 137: +case 138: this.$ = {...$$[$0], ...$$[$01]} break; -case 139: +case 140: this.$ = { type: 'continue' } break; -case 140: +case 141: this.$ = { type: 'break' } break; -case 143: +case 144: this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } break; -case 144: +case 145: this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } break; -case 145: +case 146: this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } break; -case 146: case 147: +case 147: case 148: this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } break; -case 148: +case 149: this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } break; -case 149: +case 150: this.$ = $$[$0-4] break; -case 150: +case 151: this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } break; -case 151: +case 152: this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} break; -case 153: +case 155: this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) break; -case 154: case 222: case 243: case 248: +case 156: case 224: case 245: case 250: this.$ = $$[$0-2]; this.$.values.push($$[$0]) break; -case 155: +case 157: this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) break; -case 156: +case 158: this.$ = { values: [$$[$0]] } break; -case 157: +case 159: this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } break; -case 158: +case 160: this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) break; -case 159: +case 161: this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} break; -case 161: +case 163: this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } break; -case 162: +case 164: this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } break; -case 163: +case 165: this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } break; -case 164: +case 166: this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } break; -case 169: +case 171: this.$ = {...$$[$0], const: false} break; -case 170: +case 172: this.$ = {...$$[$0], const: true } break; -case 171: +case 173: this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } break; -case 172: +case 174: this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } break; -case 173: +case 175: this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } break; -case 174: +case 176: this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } break; -case 175: +case 177: this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } break; -case 176: +case 178: this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } break; -case 177: +case 179: this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } break; -case 178: +case 180: this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } break; -case 179: +case 181: this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } break; -case 180: +case 182: this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } break; -case 181: +case 183: this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } break; -case 182: +case 184: this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } break; -case 183: +case 185: this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } break; -case 184: +case 186: this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } break; -case 185: +case 187: this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } break; -case 186: +case 188: this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } break; -case 187: +case 189: this.$ = { dim: 1, lengths: [null]} break; -case 188: +case 190: this.$ = { dim: 1, lengths: [$$[$0-1]]} break; -case 189: +case 191: this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) break; -case 190: +case 192: this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) break; -case 192: case 339: +case 194: case 341: this.$ = { ...$$[$0-1], ...$$[$0] } break; -case 193: +case 195: this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); break; -case 194: +case 196: this.$ = {items: [{...$$[$0], _d_:2}]} break; -case 195: +case 197: this.$ = { type: 'return', value: null } break; -case 196: +case 198: this.$ = { type: 'return', value: $$[$0] } break; -case 197: +case 199: this.$ = { type: 'return', values: $$[$0-1] } break; -case 198: +case 200: this.$ = { type: 'assign' } break; -case 199: +case 201: this.$ = { type: 'increment' } break; -case 200: +case 202: this.$ = { type: 'substract' } break; -case 201: +case 203: this.$ = { type: 'product' } break; -case 202: +case 204: this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) break; -case 203: +case 205: this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) break; -case 204: +case 206: this.$ = { names: [$$[$0]] } break; -case 205: +case 207: this.$ = $$[$0-2] break; -case 206: +case 208: this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) break; -case 207: +case 209: this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } break; -case 208: +case 210: this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } break; -case 209: +case 211: this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } break; -case 210: +case 212: this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } break; -case 213: +case 215: this.$ = { type: 'include', file: $$[$0] } break; -case 214: +case 216: this.$ = { stage: $$[$0-1] } break; -case 215: +case 217: this.$ = { stage: DEFAULT_STAGE } break; -case 216: +case 218: this.$ = { type: 'string', value: $$[$0] } break; -case 217: +case 219: this.$ = { type: 'string', template: true, value: $$[$0] } break; -case 218: +case 220: this.$ = {type: 'sequence', values: $$[$0-1].values} break; -case 219: +case 221: this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } break; -case 220: +case 222: this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} break; -case 221: +case 223: this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} break; -case 223: +case 225: this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) break; -case 224: +case 226: this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; -case 225: +case 227: this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; -case 226: +case 228: this.$ = $$[$0-8]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; -case 227: +case 229: this.$ = $$[$0-8]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; -case 228: +case 230: this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; -case 229: +case 231: this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; -case 230: +case 232: this.$ = $$[$0-5]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, tn: false}) break; -case 231: +case 233: this.$ = $$[$0-5]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, tn: false}) break; -case 232: +case 234: this.$ = { type: 'seq_list', values: [$$[$0]] } break; -case 233: +case 235: this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } break; -case 234: +case 236: this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} break; -case 235: +case 237: this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} break; -case 236: +case 238: this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} break; -case 237: +case 239: this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0], times: $$[$0-2]} break; -case 238: +case 240: this.$ = {type: 'range_seq', from: $$[$0-6], to: $$[$0-2], times: $$[$0-4], toTimes: $$[$0]} break; -case 239: +case 241: this.$ = {type: 'padding_seq', value: $$[$0-1]} break; -case 240: +case 242: this.$ = {type: 'seq_list', values: [$$[$0-1]]} break; -case 242: +case 244: this.$ = {values: []} break; -case 244: +case 246: this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) break; -case 245: +case 247: this.$ = { type: 'expression_list', values: $$[$0-1].values } break; -case 246: +case 248: this.$ = { type: 'expression_list', values: [$$[$0]] } break; -case 247: +case 249: this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) break; -case 249: +case 251: this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } break; -case 250: +case 252: this.$ = { type: 'expression_list', values: [$$[$0]] } break; -case 251: +case 253: this.$ = { dim: 1, lengths: [null] } break; -case 252: +case 254: this.$ = { dim: 1, lengths: [$$[$0-1]] } break; -case 253: +case 255: this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } break; -case 254: +case 256: this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } break; -case 256: +case 258: this.$ = {...$$[$0-1], ...$$[$0]} break; -case 257: case 345: case 347: case 351: case 352: +case 259: case 347: case 349: case 353: case 354: this.$ = { name: $$[$0] } break; -case 258: +case 260: this.$ = { name: $$[$0], reference: true } break; -case 259: +case 261: this.$ = { name: $$[$0], template: true } break; -case 260: +case 262: this.$ = { name: 'air.'+$$[$0] } break; -case 261: +case 263: this.$ = { name: 'air.'+$$[$0], template: true } break; -case 262: +case 264: this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } break; -case 263: +case 265: this.$ = { items: [$$[$0]] } break; -case 264: +case 266: this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; break; -case 265: +case 267: this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; -case 266: +case 268: this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; -case 267: +case 269: this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; -case 268: +case 270: this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; -case 269: +case 271: this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } break; -case 270: +case 272: this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; -case 271: +case 273: this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } break; -case 272: +case 274: this.$ = { type: 'public_declaration', items: $$[$0].items } break; -case 273: +case 275: this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} break; -case 274: +case 276: this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} break; -case 275: +case 277: this.$ = { type: 'proof_value_declaration', items: $$[$0].items } break; -case 276: +case 278: this.$ = { type: 'subproof_value_declaration', aggregateType: $$[$0-2], items: $$[$0].items } break; -case 277: +case 279: this.$ = { type: 'subproof_definition', aggregate: true, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; -case 278: +case 280: this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; -case 279: +case 281: this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } break; -case 280: +case 282: this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } break; -case 281: +case 283: this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } break; -case 282: +case 284: this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) break; -case 283: +case 285: this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) break; -case 284: +case 286: this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) break; -case 285: +case 287: this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) break; -case 286: +case 288: this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) break; -case 287: +case 289: this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) break; -case 288: +case 290: this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) break; -case 289: +case 291: this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({type: 'istype', vtype: $$[$0].type, dim: $$[$0].dim})); break; -case 290: +case 292: this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; -case 291: +case 293: this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) break; -case 292: +case 294: this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) break; -case 293: +case 295: this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) break; -case 294: +case 296: this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) break; -case 295: +case 297: this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) break; -case 296: +case 298: this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) break; -case 297: +case 299: this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; -case 298: +case 300: this.$ = $$[$0-1].insert('not') break; -case 299: +case 301: this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) break; -case 300: +case 302: this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) break; -case 301: +case 303: this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) break; -case 302: +case 304: this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) break; -case 303: +case 305: this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) break; -case 304: +case 306: this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) break; -case 305: - this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) -break; case 307: - this.$ = $$[$0].insert('neg') -break; -case 308: - this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0] }) + this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) break; case 309: - this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0], inc: 'pre'}) + this.$ = $$[$0].insert('neg') break; case 310: - this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0], dec: 'pre'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0] }) break; case 311: - this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0-1], inc: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0], inc: 'pre'}) break; case 312: - this.$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$$[$0-1], dec: 'post'}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0], dec: 'pre'}) break; case 313: - this.$ = ExpressionFactory.fromObject({ type: 'number', value: BigInt($$[$0])}) + this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0-1], inc: 'post'}) break; case 314: + this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0-1], dec: 'post'}) +break; +case 315: + this.$ = ExpressionFactory.fromObject({ type: 'number', value: BigInt($$[$0])}) +break; +case 316: this.$ = ExpressionFactory.fromObject({...$$[$0], type: 'string'}) break; -case 316: case 318: +case 318: case 320: this.$ = ExpressionFactory.fromObject({...$$[$0]}) break; -case 317: - this.$ = ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'}) -break; case 319: - this.$ = { type: 'cast', cast: 'int', value: $$[$0-1]} -break; -case 320: - this.$ = { type: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'}) break; case 321: - this.$ = { type: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'int', value: $$[$0-1]} break; case 322: - this.$ = { type: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'fe', value: $$[$0-1] } break; case 323: - this.$ = { type: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'expr', value: $$[$0-1] } break; case 324: - this.$ = { ...$$[$0-3], type: 'cast', cast: 'int', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'col', value: $$[$0-1] } break; case 325: - this.$ = { ...$$[$0-3], type: 'cast', cast: 'fe', value: $$[$0-1] } + this.$ = { type: 'cast', cast: 'string', value: $$[$0-1] } break; case 326: - this.$ = { ...$$[$0-3], type: 'cast', cast: 'expr', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'int', value: $$[$0-1] } break; case 327: - this.$ = { ...$$[$0-3], type: 'cast', cast: 'col', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'fe', value: $$[$0-1] } break; case 328: - this.$ = { ...$$[$0-3], type: 'cast', cast: 'string', value: $$[$0-1] } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'expr', value: $$[$0-1] } break; case 329: - this.$ = { ...$$[$0-1], next:1 } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'col', value: $$[$0-1] } break; case 330: - this.$ = { ...$$[$0-2], next: Number($$[$0]) } + this.$ = { ...$$[$0-3], type: 'cast', cast: 'string', value: $$[$0-1] } break; case 331: - this.$ = { ...$$[$0-4], next:$$[$0-1] } + this.$ = { ...$$[$0-1], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: 1, current: $$[$0-1] }) } break; case 332: - this.$ = { ...$$[$0-2], next: ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'}) } + this.$ = { ...$$[$0-2], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: Number($$[$0]), current: $$[$0-2] }) } break; case 333: - this.$ = { ...$$[$0], prior:1 } + this.$ = { ...$$[$0-4], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: $$[$0-1], current: $$[$0-4] }) } break; case 334: - this.$ = { ...$$[$0], prior: Number($$[$0-2]) } + this.$ = { ...$$[$0-2], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', current: $$[$0-2], + value: ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'})}) } break; case 335: - this.$ = { ...$$[$0], prior:$$[$0-3] } + this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: 1, prior: true, current: $$[$0] }) } break; case 336: - this.$ = { ...$$[$0], prior: ExpressionFactory.fromObject({position: $$[$0-2], type: 'positional_param'}) } + this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: Number($$[$0-2]), prior: true, current: $$[$0] }) } +break; +case 337: + this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: $$[$0-3], prior: true, current: $$[$0] }) } break; case 338: - this.$ = { ...$$[$0], dim: 0 } + this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', current: $$[$0], prior: true, + value: ExpressionFactory.fromObject({position: $$[$0-2], type: 'positional_param'})}) } break; case 340: + this.$ = { ...$$[$0], dim: 0 } +break; +case 342: this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } break; -case 341: +case 343: this.$ = { dim: 1, indexes: [$$[$0-1]]} break; -case 342: +case 344: this.$ = { name: 'air.' + $$[$0].name } break; -case 343: +case 345: this.$ = { name: 'subproof.' + $$[$0].name } break; -case 344: +case 346: this.$ = { name: 'proof.' + $$[$0].name } break; -case 346: case 348: +case 348: case 350: this.$ = { name: $$[$0-2] + '.' + $$[$0].name } break; -case 349: case 350: +case 351: case 352: this.$ = { name: $$[$0-2].name + '.' + $$[$0] } break; } }, -table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,24:$V1,31:[1,19],54:20,55:$V2,56:$V3,61:$V4,62:[1,18],70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,124:29,137:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),{26:[1,39],153:[1,38]},{28:[1,40]},{46:[1,41]},{31:[1,43],54:42,55:$Vh,56:$V3,62:[1,44]},{138:46,142:$Vi,143:$Vj},o($Vk,$Vl,{139:49,75:$Vm,76:$Vn,140:$Vo}),o($Vk,$Vl,{139:53,140:$Vo}),{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:54,152:55},{153:[1,61]},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:62},{153:[1,64]},o($Vt,[2,169]),{24:$V1,55:$Vu,70:$V5,71:$V6,72:$V7,78:$Vb,124:65},{22:70,26:[1,67],31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:68,126:69},{55:[1,75]},{22:70,26:$Vz,31:$Vv,51:[1,78],62:$Vw,68:$Vx,95:$Vy,125:76,126:77},{22:70,26:$Vz,31:$Vv,51:[1,82],62:$Vw,68:$Vx,95:$Vy,125:80,126:81},{22:70,26:$Vz,31:$Vv,51:[1,85],62:$Vw,68:$Vx,95:$Vy,125:83,126:84},{22:70,26:$Vz,31:$Vv,51:[1,88],62:$Vw,68:$Vx,95:$Vy,125:86,126:87},{22:70,26:$Vz,31:$Vv,51:$VA,62:$Vw,68:$Vx,95:$Vy,126:89},{26:[1,91]},{28:[1,93],46:[1,92]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:94,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:$V61,55:$V71,57:159,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{46:[1,177]},{54:178,55:$Vh,56:$V3},{54:179,55:$Vh,56:$V3},{26:[1,180]},o($Vl1,[2,213]),o($Vm1,[2,216]),o($Vm1,[2,217]),{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:182,152:181},o($Vk,$Vl,{139:183,140:$Vo}),o($Vk,$Vl,{139:184,140:$Vo}),{46:[1,185]},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:186},o([6,8,24,30,31,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,137],$Vn1,{148:188,51:$Vo1,127:[1,187]}),o($Vl1,[2,272],{64:$Vp1}),o($Vq1,[2,257]),o($Vq1,[2,258]),o($Vq1,[2,259]),{151:[1,191]},o($Vr1,[2,263]),{46:[1,192]},o($Vl1,[2,275],{64:$Vp1}),o($Vr1,$Vn1,{148:188,51:$Vo1}),{46:[1,193]},o($Vt,[2,170]),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:68,126:69},o([6,8,24,30,31,51,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,108,127,137],$Vs1,{46:$Vt1,151:$Vu1}),o($Vt,[2,175],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,196]}),o($Vx1,$Vy1,{128:197,51:$Vz1}),{151:[1,199]},{151:[1,200]},{151:[1,201]},o($VA1,[2,347],{151:[1,202]}),{26:[1,203]},o($Vt,[2,171],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,204]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:205,126:206},o($VA1,$Vs1,{151:$Vu1}),o($Vt,[2,172],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,207]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:208,126:206},o($Vt,[2,173],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,209]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:210,126:206},o($Vt,[2,174],{64:$Vv1}),o($Vr1,$Vw1,{127:[1,211]}),{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:212,126:206},{127:[1,213]},{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,125:214,126:206},{46:[1,215]},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:216,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:225,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,226]},{30:[2,37]},{11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:[2,27],31:$Vv,34:228,36:227,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,30:[2,29],35:229},o($VH1,[2,33],{35:230,8:$VB}),o($VH1,[2,36],{8:$VI1}),o($VJ1,[2,106]),o($VJ1,[2,107]),o($VJ1,[2,108]),o($VJ1,[2,109],{86:[1,232],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VJ1,[2,111]),o($VJ1,[2,112]),o($VJ1,[2,113]),o($VJ1,[2,114]),o($VJ1,[2,115]),o($VJ1,[2,116]),o($VJ1,[2,117]),o($VJ1,[2,118]),o($VJ1,[2,119]),o($V52,[2,47]),{40:257,41:[1,258],42:[1,259],43:[1,260],46:[1,256]},{22:158,26:$Vz,28:[1,261],31:$Vv,46:$VH,47:263,51:[1,262],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,53]),o($V52,[2,54]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:264,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,43]),o($VJ1,[2,135]),o($VJ1,[2,136]),o($VJ1,[2,137]),o($VJ1,[2,138]),o($VJ1,[2,139]),o($VJ1,[2,140]),o($Vk,$Vl,{139:49,69:266,46:$V62,51:$V72,75:$Vm,76:$Vn,140:$Vo}),{22:158,26:$Vz,31:$Vv,46:$VH,47:268,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:269,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:270,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o([8,30,86,107,108,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177],$V82,{130:273,121:$V92,123:$Va2,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:278,141:$Vg2,178:$Vh2,180:$V51},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:283,141:$Vg2,178:$Vh2,180:$V51},o($Vm1,[2,313],{180:$Vi2}),o($Vm1,[2,314]),{22:158,26:$Vz,31:$Vv,46:$VH,47:285,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vm1,[2,316]),o($Vm1,[2,317],{180:$Vj2}),o($Vm1,[2,318]),{61:[1,288],93:287},{26:[1,289]},{22:290,26:$Vz,31:$Vv,51:$VA,62:$Vw,68:$Vx,95:$Vy,126:89},{22:291,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy},{46:[1,292]},{46:[1,293]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:294,34:296,35:297,36:295,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{31:$Vk2,62:$Vl2,94:298,95:$Vm2},{46:[1,302]},{46:[1,303]},{127:[1,304]},o($VJ1,[2,195],{138:134,90:136,179:138,91:151,22:158,122:219,47:305,26:$Vz,31:$Vv,46:$VH,51:[1,306],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,$Vo2,{46:$Vp2,180:$Vq2}),{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:309,95:$Vy},{22:70,26:$Vz,31:$Vv,46:$Vr2,51:[1,312],62:$Vw,68:$Vx,69:311,95:$Vy,125:76,126:77},{22:70,26:$Vz,31:$Vv,46:$Vs2,51:[1,315],62:$Vw,68:$Vx,69:314,95:$Vy,125:80,126:81},{22:70,26:$Vz,31:$Vv,46:$Vt2,51:[1,318],62:$Vw,68:$Vx,69:317,95:$Vy,125:83,126:84},{22:70,26:$Vz,31:$Vv,46:$Vu2,51:[1,321],62:$Vw,68:$Vx,69:320,95:$Vy,125:86,126:87},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:323,134:322,141:$Vg2,178:$Vh2,180:$V51},o($Vv2,[2,338],{181:324,51:[1,325]}),{48:[1,326]},{48:[2,64],64:[1,327]},{48:[2,66]},o($Vw2,[2,69]),{26:[1,328],68:[1,329]},o($Vx2,[2,74]),o($Vx2,[2,75]),o($Vx2,[2,76]),{70:[1,330],71:[1,331],72:[1,332],78:[1,333]},{75:[1,334],76:[1,335]},o($Vx2,[2,82]),o($Vx2,[2,83]),o($Vx2,[2,85]),o($Vx2,[2,86]),o($Vx2,[2,87]),o($Vx2,[2,88]),o($Vx2,[2,89]),o($Vx2,[2,90]),{48:$V61,55:$V71,57:336,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{46:[1,337]},{46:[1,338]},{46:$Vt1},o($Vt,[2,264],{64:$Vp1}),o($Vr1,$Vn1,{148:188,51:$Vo1,127:[1,339]}),{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:340},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:342,152:341},{141:[1,343]},o($Vl1,[2,270],{64:$Vp1}),{22:158,26:$Vz,31:$Vv,46:$VH,47:344,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vr1,[2,256],{51:$Vy2}),{22:158,26:$Vz,31:$Vv,46:$VH,47:347,53:[1,346],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:348,150:63},{26:[1,349],143:[1,350]},{26:[1,351]},{26:[1,352]},{26:$Vz2,143:$VA2,182:353},{22:70,26:$Vz,31:$Vv,62:$Vw,68:$Vx,95:$Vy,126:356},{22:158,26:$Vz,31:$Vv,46:$VH,47:357,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vx1,[2,192],{51:[1,358]}),{22:158,26:$Vz,31:$Vv,46:$VH,47:360,53:[1,359],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{26:$Vz2,143:$VA2,182:361},{26:$Vz2,143:$VA2,182:362},{26:$Vz2,143:$VA2,182:363},{26:$Vz2,143:$VA2,182:364},{46:[2,57]},{22:158,26:$Vz,31:$Vv,46:$VH,47:365,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,366],64:$Vv1},o($VB2,$Vw1),{22:158,26:$Vz,31:$Vv,46:$VH,47:367,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,368],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:369,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,370],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:371,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,372],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:373,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,374],64:$Vv1},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:375,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,376],64:$VC2},{22:158,26:$Vz,31:$Vv,46:$VH,47:378,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VD2,[2,250],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,$V82,{121:$V92,123:$Va2}),{46:$Vr2,51:$V72,69:311},{46:$Vs2,51:$V72,69:314},{46:$Vt2,51:$V72,69:317},{46:$V62,51:$V72,69:266},{46:$Vu2,51:$V72,69:320},{30:[1,379]},o($V0,[2,22]),{8:$VB,30:[2,28],35:380},o($VH1,[2,30],{35:381,8:$VB}),o($VH1,[2,35],{8:$VI1}),o($VH1,[2,34],{8:$VI1}),o($V52,[2,42]),{22:158,26:$Vz,31:$Vv,46:$VH,47:382,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:383,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:384,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:385,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:386,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:387,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:388,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:389,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{55:$V71,60:390,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{22:158,26:$Vz,31:$Vv,46:$VH,47:392,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:393,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:394,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:395,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:396,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:397,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:398,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:399,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:400,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:401,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:402,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:403,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:404,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:405,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:406,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:407,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:408,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VE2,[2,44]),o($VE2,[2,45]),o($VE2,[2,46]),{26:$VF2,50:410},{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,52:412,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:413,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:[1,417],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{30:[1,418]},{22:158,26:$Vz,31:$Vv,46:$VH,47:419,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,420],51:$VI2},{53:$VJ2},o($Vm1,[2,298]),o($Vm1,[2,306]),o($Vm1,[2,307]),o($Vm1,[2,311]),o($Vm1,[2,312]),{22:158,26:$Vz,31:$Vv,46:$VH,47:423,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VK2,[2,198],{136:424,51:$VL2}),o($VK2,[2,199]),o($VK2,[2,200]),o($VK2,[2,201]),o($Vm1,[2,309]),o($Vn2,$Vo2,{180:$Vq2}),{180:$Vi2},{22:158,26:$Vz,31:$Vv,46:$VH,47:426,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{180:$Vj2},o($Vm1,[2,310]),{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:427,95:$Vy},{48:[1,428],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:429,95:$Vy},{31:$Vk2,62:$Vl2,94:430,95:$Vm2},o([31,62,95],[2,130]),{51:$Vo1,127:[1,431],148:432},o($VJ1,[2,18],{128:197,25:[1,433],28:[1,434],51:$Vz1,127:$Vy1}),o($VJ1,[2,17]),{13:439,19:436,22:158,24:$V1,26:$Vz,31:$Vv,46:$Vf2,55:$Vu,62:$Vw,68:$Vx,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,78:$Vb,91:279,95:$Vy,97:437,105:435,122:438,124:29,141:$Vg2,178:$Vh2,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:440,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{108:[1,441]},{8:$VB,35:443,108:[1,442]},o([21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,114,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,23],{35:444,8:$VB}),o($V52,[2,25]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:445,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VE2,[2,131]),o($VE2,[2,132]),o($VE2,[2,133]),{22:158,26:$Vz,31:$Vv,46:$VH,47:446,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:447,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,51:[1,449],62:$Vw,68:$Vx,90:448,91:450,95:$Vy},o($VJ1,[2,196],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:451,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vn2,[2,329],{46:[1,453],141:[1,452],178:[1,454]}),o($Vw2,$VM2,{138:134,90:136,179:138,91:151,22:158,122:219,92:455,47:457,26:$Vz,31:$Vv,46:$VH,51:$VN2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($Vn2,[2,333]),{22:158,26:$Vz,31:$Vv,46:$VH,47:458,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,459],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:205,126:206},{22:158,26:$Vz,31:$Vv,46:$VH,47:460,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,461],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:208,126:206},{22:158,26:$Vz,31:$Vv,46:$VH,47:462,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,463],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:210,126:206},{22:158,26:$Vz,31:$Vv,46:$VH,47:464,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:[1,465],51:$VI2},{22:70,26:$Vz,31:$Vv,53:$VJ2,62:$Vw,68:$Vx,95:$Vy,125:212,126:206},{53:[1,466],64:[1,467]},o($VB2,[2,204]),o($Vv2,[2,339],{51:[1,468]}),{22:158,26:$Vz,31:$Vv,46:$VH,47:469,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{28:[1,471],58:[1,470]},{55:$V71,65:[1,472],66:473,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},o($Vw2,[2,70],{69:474,51:$V72}),o($Vw2,[2,71],{69:475,51:$V72}),o($Vx2,[2,77]),o($Vx2,[2,78]),o($Vx2,[2,79]),o($Vx2,[2,84]),o($Vx2,[2,80]),o($Vx2,[2,81]),{48:[1,476]},{48:$V61,55:$V71,57:477,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{48:$V61,55:$V71,57:478,63:160,65:$V81,66:162,67:163,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{22:158,26:$Vz,31:$Vv,46:$VH,47:479,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vt,[2,266],{64:$Vp1}),o($Vt,[2,267],{64:$Vp1}),o($Vr1,$Vn1,{148:188,51:$Vo1,127:[1,480]}),{48:[1,481]},o($Vl1,[2,271],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:483,53:[1,482],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vq1,[2,251]),{53:[1,484],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vr1,[2,262]),o($Vq1,[2,260]),o($Vq1,[2,261]),{64:[1,485]},{48:[1,486]},o($VA1,[2,346],{151:$VO2}),o($VP2,[2,351]),o($VP2,[2,352]),o([6,8,24,30,31,53,55,56,61,62,64,70,71,72,73,74,77,78,79,80,82,83,107,108,137],[2,193]),o($Vl1,[2,180],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:489,53:[1,488],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VQ2,[2,187]),{53:[1,490],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VA1,[2,342],{151:$VO2}),o($VA1,[2,343],{151:$VO2}),o($VA1,[2,344],{151:$VO2}),o($VA1,[2,348],{151:$VO2}),o($Vl1,[2,176],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,491]},o($Vl1,[2,177],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,492]},o($Vl1,[2,178],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,493]},o($Vl1,[2,179],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,494]},o($Vl1,[2,181],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{127:[1,495]},{48:[1,496],64:$VC2},{28:[1,497]},{22:158,26:$Vz,31:$Vv,46:$VH,47:499,62:$Vw,65:[1,498],68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VD2,[2,249],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V0,[2,279]),o($VH1,[2,32],{8:$VI1}),o($VH1,[2,31],{8:$VI1}),o($VJ1,[2,110],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,282],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,283],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,284],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,285],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,286],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VR2,[2,287],{168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,107,108,118,137,146,147,161,162,163,164,165,166,167],[2,288],{155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vm1,[2,289]),o($VS2,[2,95],{69:500,51:$V72}),o($VT2,[2,290],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{58:[1,501],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VT2,[2,292],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,293],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,294],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VU2,[2,295],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VT2,[2,296],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VU2,[2,297],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,164:$VU1,165:$VV1,166:$VW1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VV2,[2,299],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VV2,[2,300],{173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VW2,[2,301],{177:$V42}),o($VW2,[2,302],{177:$V42}),o($VW2,[2,303],{177:$V42}),o($VW2,[2,304],{177:$V42}),o($Vm1,[2,305]),{48:[1,502],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,49]),{8:$VB,35:443},{30:[1,503],64:$VX2},o($VY2,[2,126],{58:[1,505]}),{53:[1,506],64:$VZ2},o($VB2,[2,128]),o($V_2,[2,120],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{26:$VF2,50:508},{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,52:509,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:413,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,52]),o($V52,[2,55]),{48:[1,510],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:511,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,512]},o($V$2,[2,94]),o([8,30,48,64,108],[2,209],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([8,30,48,64,107,108],[2,210]),{22:158,26:$Vz,31:$Vv,46:$VH,47:515,51:$V03,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,144:513,145:514,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,517],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vn2,[2,334]),o($Vm1,[2,315],{180:$V13}),o($Vn2,[2,336]),{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:519,95:$Vy},{22:158,26:$Vz,31:$Vv,46:$VH,47:520,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{51:$Vy2,127:[1,521]},{26:[1,522]},{13:526,14:527,15:528,16:529,17:530,18:531,19:532,24:$V1,29:523,30:$V23,39:524,55:$Vu,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:525,124:29},{8:[1,533],107:[1,534]},o($V33,[2,165]),o($V33,[2,166]),o($V33,[2,167],{130:273,127:$Vb2,131:$Vc2,132:$Vd2,133:$Ve2}),o($V33,[2,168]),{48:[1,535],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{46:[1,536]},{46:[1,537]},o($V52,[2,26]),o($V52,[2,24]),o($V52,[2,148]),{48:[1,538],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{48:[1,539],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VJ1,[2,207]),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:540,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{46:$Vp2},{53:[1,541],64:$VC2},o($Vn2,[2,330]),{22:158,26:$Vz,31:$Vv,46:$VH,47:542,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vn2,[2,332]),{48:[1,543],64:$V43},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:545,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vw2,[2,246],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{48:[1,546],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:547,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,548],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:549,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,550],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:551,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[1,552],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:553,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{127:[2,205]},o($VB2,[2,203],{22:158,91:279,122:555,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,65:[1,554],68:$Vx,95:$Vy,141:$Vg2,178:$Vh2,180:$V51}),{22:158,26:$Vz,31:$Vv,46:$VH,47:556,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,557],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{51:[1,558],55:$V71,60:559,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:560,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{48:[2,65]},o($Vw2,[2,68]),o($Vw2,[2,72],{51:$VI2}),o($Vw2,[2,73],{51:$VI2}),{28:[1,561]},{48:[1,562]},{48:[1,563]},o($Vl1,[2,265],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:564,51:$VL2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,136:565,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vk,[2,214]),o($Vq1,[2,253]),{53:[1,566],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vq1,[2,252]),{26:[1,567]},{26:$Vp,68:$Vq,95:$Vr,143:$Vs,149:60,150:63,152:568},{26:[1,569],143:[1,570]},o($VQ2,[2,189]),{53:[1,571],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VQ2,[2,188]),{51:[1,572]},{51:[1,573]},{51:[1,574]},{51:[1,575]},{51:[1,576]},{28:[1,577]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:578,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:579,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VD2,[2,248],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VS2,[2,96],{51:$VI2}),{22:158,26:$Vz,31:$Vv,46:$VH,47:580,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:581,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,50]),{26:[1,582]},{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:583,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,51]),{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:584,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,585],64:$VX2},{53:[1,586],64:$VZ2},o($Vm1,[2,322]),{48:[1,587],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V$2,[2,93]),{53:[1,588],64:$V53},o($VB2,[2,232],{58:$V63,65:$V73}),o($V83,$V93,{58:[1,592],107:$VK1,118:$Va3,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:515,51:$V03,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,144:594,145:514,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{180:$V13},{22:158,26:$Vz,31:$Vv,62:$Vw,68:$Vx,91:595,95:$Vy},{46:[1,596]},o($VJ1,[2,280],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{51:$VL2,136:597},o($VJ1,[2,19],{28:[1,598]}),{30:[1,599]},{8:$VB,30:[2,39],35:600},o($Vb3,[2,98]),o($Vb3,[2,99]),o($Vb3,[2,100]),o($Vb3,[2,101]),o($Vb3,[2,102]),o($Vb3,[2,103]),o($Vb3,[2,104]),o($Vb3,[2,105]),{22:158,26:$Vz,31:$Vv,46:$VH,47:601,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:603,51:[1,604],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,102:602,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:605,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:606,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:607,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{28:[1,609],112:608},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:610,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,611],64:$VC2},o($VJ1,[2,197]),{48:[1,612],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,129]),{22:158,26:$Vz,31:$Vv,46:$VH,47:613,51:[1,614],62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,615],64:$VC2},o($Vm1,[2,319]),{48:[1,616],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,320]),{48:[1,617],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,321]),{48:[1,618],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vm1,[2,323]),{48:[1,619],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{53:[1,620]},o($VB2,[2,202]),{53:[1,621],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vc3,[2,341]),{55:$V71,59:622,60:623,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{28:[1,624]},{30:[1,625]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:626,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{28:[1,627]},{28:[1,628]},o($Vl1,[2,268],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vt,[2,269]),o($Vq1,[2,254]),{48:[1,630],64:[1,629]},o($Vl1,[2,276],{64:$Vp1}),o($VP2,[2,349]),o($VP2,[2,350]),o($VQ2,[2,190]),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:631,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:632,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:633,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:634,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:635,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:636,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,637]},o($VD2,[2,247],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o([6,8,24,30,31,48,53,55,56,58,61,62,64,65,70,71,72,73,74,77,78,79,80,82,83,86,108,118,137,146,147],[2,291],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,48]),o($VY2,[2,124],{58:[1,638]}),o($VY2,[2,125]),o($VB2,[2,127]),o($V_2,[2,121]),o($V_2,[2,122]),o($Vm1,[2,327]),o($Vd3,[2,218],{58:[1,640],65:[1,639]}),{22:158,26:$Vz,31:$Vv,46:$VH,47:642,51:$V03,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,145:641,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:643,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Ve3,[2,239]),{22:158,26:$Vz,31:$Vv,46:$VH,47:644,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:645,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,646],64:$V53},o($Vn2,[2,335]),o($Vw2,$VM2,{138:134,90:136,179:138,91:151,22:158,122:219,47:457,92:647,26:$Vz,31:$Vv,46:$VH,51:$VN2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VJ1,[2,281]),{13:526,14:527,15:528,16:529,17:530,18:531,19:532,24:$V1,29:648,30:$V23,39:524,55:$Vu,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:525,124:29},o($V52,[2,20]),{8:$VI1,13:526,14:527,15:528,16:529,17:530,18:531,19:532,24:$V1,30:[2,40],55:$Vu,70:$V5,71:$V6,72:$V7,73:$V8,74:$V9,77:$Va,78:$Vb,79:$Vc,80:$Vd,82:$Ve,83:$Vf,84:649,124:29},{8:[1,650],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{48:[1,651]},{48:[2,141],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:652,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,145]),{48:[1,653],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{48:[1,654],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($V52,[2,149]),{115:655,119:[1,656]},o([8,21,24,26,28,30,31,45,46,49,51,55,56,61,62,68,70,71,72,73,74,77,78,79,80,82,83,95,96,100,101,104,108,109,110,111,113,116,119,121,123,129,137,141,142,143,154,170,171,172,178,180],[2,150],{114:[1,657]}),o($VJ1,[2,208]),o($Vn2,[2,331]),o($Vw2,[2,243],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:658,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vw2,[2,245]),o($Vm1,[2,324]),o($Vm1,[2,325]),o($Vm1,[2,326]),o($Vm1,[2,328]),{127:[2,206]},o($Vc3,[2,340]),{53:[1,659],64:[1,660]},o($VB2,[2,92]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:661,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vf3,[2,60]),{30:[1,662]},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:663,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:664,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:218,62:$Vw,65:$VB1,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,103:665,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{26:[1,666]},{53:[1,667],64:$VC2},{53:[1,668],64:$VC2},{53:[1,669],64:$VC2},{53:[1,670],64:$VC2},{53:[1,671],64:$VC2},{30:[1,672]},o($V0,[2,278]),{22:158,26:$Vz,28:$VG2,31:$Vv,46:$VH,47:414,51:$VH2,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,89:673,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vd3,[2,219]),{22:158,26:$Vz,31:$Vv,46:$VH,47:674,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VB2,[2,222],{58:$V63,65:$V73}),o($V83,$V93,{58:[1,675],107:$VK1,118:$Va3,146:[1,676],147:[1,677],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,234],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,233],{107:$VK1,118:$Vg3,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V83,[2,235],{58:[1,679],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,240]),{48:[1,680],64:$V43},{30:[1,681]},o($Vb3,[2,97]),{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,97:684,106:682,120:683,121:$Vh3,122:687,123:$Vi3,141:$Vg2,178:$Vh2,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:688,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,689],64:$VC2},o($V52,[2,146]),o($V52,[2,147]),{30:[1,690],116:[1,691],119:[1,692]},{22:158,26:$Vz,31:$Vv,46:$VH,47:694,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,117:693,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:695,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,696],64:$VC2},{28:[1,697]},{55:$V71,60:698,67:391,70:$V91,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,77:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1},{30:[1,699]},o($Vf3,[2,61]),{30:[1,700]},{30:[1,701]},{48:[1,702],64:$VC2},{51:[1,703]},o($Vt,[2,182]),o($Vt,[2,183]),o($Vt,[2,184]),o($Vt,[2,185]),o($Vt,[2,186]),o($V0,[2,277]),o($VY2,[2,123]),o($Vd3,[2,220],{65:[1,704],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:705,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VB2,[2,228],{138:134,90:136,179:138,91:151,22:158,122:219,47:706,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,229],{138:134,90:136,179:138,91:151,22:158,122:219,47:707,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{22:158,26:$Vz,31:$Vv,46:$VH,47:708,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:709,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VJ1,[2,134]),o($V52,[2,21]),{48:[1,710],64:[1,711]},o($Vw2,[2,212]),o($Vw2,[2,160]),{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:712,141:$Vg2,178:$Vh2,180:$V51},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,122:713,141:$Vg2,178:$Vh2,180:$V51},{121:[1,714],123:[1,715],127:$Vb2,130:273,131:$Vc2,132:$Vd2,133:$Ve2},o($V52,[2,144]),{48:[2,142]},o($V52,[2,152]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,34:98,35:99,36:97,37:716,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:694,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,117:717,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{58:[1,718],64:$Vj3},o($Vk3,[2,156],{107:$VK1,118:[1,720],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V52,[2,151]),o($Vw2,[2,244]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,30:$VF,31:$Vv,32:721,34:98,35:99,36:97,37:95,38:96,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($VB2,[2,91]),o($Vf3,[2,59]),o($Vf3,[2,62]),o($Vf3,[2,63]),{26:[1,722]},{22:158,26:$Vz,31:$Vv,46:$VH,47:723,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vd3,[2,221]),o($VB2,[2,223],{107:$VK1,118:$Vg3,146:[1,724],147:[1,725],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,224],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,225],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($V83,[2,237],{58:[1,726],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Ve3,[2,236],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,33:727,34:296,35:297,36:409,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$Vf2,62:$Vw,68:$Vx,91:279,95:$Vy,97:684,120:728,121:$Vh3,122:687,123:$Vi3,141:$Vg2,178:$Vh2,180:$V51},o($Vw2,[2,161]),o($Vw2,[2,162]),o($Vw2,[2,163]),o($Vw2,[2,164]),{30:[1,729]},{58:[1,730],64:$Vj3},{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,34:98,35:99,36:732,38:731,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:733,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:734,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{30:[1,735]},{51:[1,736]},{53:[1,737],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,230],{138:134,90:136,179:138,91:151,22:158,122:219,47:738,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),o($VB2,[2,231],{138:134,90:136,179:138,91:151,22:158,122:219,47:739,26:$Vz,31:$Vv,46:$VH,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,95:$Vy,121:$VY,123:$VZ,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{22:158,26:$Vz,31:$Vv,46:$VH,47:740,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($V52,[2,143]),o($Vw2,[2,211]),o($V52,[2,153]),{8:$VB,11:116,12:105,13:101,14:102,15:106,16:107,17:108,18:109,19:120,20:112,21:$VC,22:158,23:111,24:$VD,26:$Vz,27:117,28:$VE,31:$Vv,34:98,35:99,36:732,38:741,44:113,45:$VG,46:$VH,47:103,49:$VI,51:$VJ,54:20,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,85:100,87:104,88:110,90:136,91:151,95:$Vy,96:$VP,97:121,98:122,99:123,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,122:130,123:$VZ,124:29,129:$V_,135:149,137:$Vg,138:134,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vl3,[2,159],{54:20,124:29,85:100,13:101,14:102,47:103,87:104,12:105,15:106,16:107,17:108,18:109,88:110,23:111,20:112,44:113,11:116,27:117,19:120,97:121,98:122,99:123,122:130,138:134,90:136,179:138,135:149,91:151,22:158,34:228,36:742,21:$VC,24:$VD,26:$Vz,28:$VE,31:$Vv,45:$VG,46:$VH,49:$VI,51:$VJ,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vy,96:$VP,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,123:$VZ,129:$V_,137:$Vg,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VB,35:229},o($Vk3,[2,154],{107:$VK1,118:[1,743],155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vk3,[2,157],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vf3,[2,58]),{22:158,26:$Vz,31:$Vv,46:$VH,47:744,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{51:[1,745]},{58:[1,746],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{58:[1,747],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Ve3,[2,238],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($Vl3,[2,158],{54:20,124:29,85:100,13:101,14:102,47:103,87:104,12:105,15:106,16:107,17:108,18:109,88:110,23:111,20:112,44:113,11:116,27:117,19:120,97:121,98:122,99:123,122:130,138:134,90:136,179:138,135:149,91:151,22:158,34:228,36:742,21:$VC,24:$VD,26:$Vz,28:$VE,31:$Vv,45:$VG,46:$VH,49:$VI,51:$VJ,55:$V2,56:$V3,61:$V4,62:$Vw,68:$Vx,70:$VK,71:$VL,72:$VM,73:$V8,74:$VN,77:$Va,78:$VO,79:$Vc,80:$Vd,82:$Ve,83:$Vf,95:$Vy,96:$VP,100:$VQ,101:$VR,104:$VS,108:$VT,109:$VU,110:$VV,111:$VW,113:$VX,121:$VY,123:$VZ,129:$V_,137:$Vg,141:$V$,142:$Vi,143:$Vj,154:$V01,170:$V11,171:$V21,172:$V31,178:$V41,180:$V51}),{8:$VB,35:380},{22:158,26:$Vz,31:$Vv,46:$VH,47:748,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{53:[1,749],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},{22:158,26:$Vz,31:$Vv,46:$VH,47:750,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:751,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},{22:158,26:$Vz,31:$Vv,46:$VH,47:752,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vk3,[2,155],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{51:[1,753]},{53:[1,754],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($VB2,[2,226],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),o($VB2,[2,227],{107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42}),{22:158,26:$Vz,31:$Vv,46:$VH,47:755,62:$Vw,68:$Vx,70:$VC1,71:$VD1,72:$VE1,74:$VF1,78:$VG1,90:136,91:151,95:$Vy,121:$VY,122:219,123:$VZ,138:134,141:$V$,142:$Vi,143:$Vj,170:$V11,171:$V21,172:$V31,178:$V41,179:138,180:$V51},o($Vl1,[2,274]),{53:[1,756],107:$VK1,155:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,171:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42},o($Vl1,[2,273])], -defaultActions: {4:[2,1],95:[2,37],161:[2,66],180:[2,56],203:[2,57],466:[2,205],472:[2,65],620:[2,206],689:[2,142]}, +table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],25:$V1,32:[1,20],55:21,56:$V2,57:$V3,62:$V4,63:[1,19],71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,125:30,138:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),{27:[1,40],154:[1,39]},{29:[1,41]},{47:[1,42]},{32:[1,44],55:43,56:$Vh,57:$V3,63:[1,45]},{139:47,143:$Vi,144:$Vj},o($Vk,$Vl,{140:50,76:$Vm,77:$Vn,141:$Vo}),o($Vk,$Vl,{140:54,141:$Vo}),{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:55,153:56},{154:[1,62]},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:63},{154:[1,65]},o($Vt,[2,171]),{25:$V1,56:$Vu,71:$V5,72:$V6,73:$V7,79:$Vb,125:66},{23:71,27:[1,68],32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:69,127:70},{56:[1,76]},{23:71,27:$Vz,32:$Vv,52:[1,79],63:$Vw,69:$Vx,96:$Vy,126:77,127:78},{23:71,27:$Vz,32:$Vv,52:[1,83],63:$Vw,69:$Vx,96:$Vy,126:81,127:82},{23:71,27:$Vz,32:$Vv,52:[1,86],63:$Vw,69:$Vx,96:$Vy,126:84,127:85},{23:71,27:$Vz,32:$Vv,52:[1,89],63:$Vw,69:$Vx,96:$Vy,126:87,127:88},{23:71,27:$Vz,32:$Vv,52:$VA,63:$Vw,69:$Vx,96:$Vy,127:90},{27:[1,92]},{29:[1,94],47:[1,93]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:95,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:$V71,56:$V81,58:161,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{47:[1,179]},{55:180,56:$Vh,57:$V3},{55:181,56:$Vh,57:$V3},{27:[1,182]},o($Vm1,[2,215]),o($Vn1,[2,218]),o($Vn1,[2,219]),{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:184,153:183},o($Vk,$Vl,{140:185,141:$Vo}),o($Vk,$Vl,{140:186,141:$Vo}),{47:[1,187]},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:188},o([6,8,20,25,31,32,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,109,138],$Vo1,{149:190,52:$Vp1,128:[1,189]}),o($Vm1,[2,274],{65:$Vq1}),o($Vr1,[2,259]),o($Vr1,[2,260]),o($Vr1,[2,261]),{152:[1,193]},o($Vs1,[2,265]),{47:[1,194]},o($Vm1,[2,277],{65:$Vq1}),o($Vs1,$Vo1,{149:190,52:$Vp1}),{47:[1,195]},o($Vt,[2,172]),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:69,127:70},o([6,8,20,25,31,32,52,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,109,128,138],$Vt1,{47:$Vu1,152:$Vv1}),o($Vt,[2,177],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,198]}),o($Vy1,$Vz1,{129:199,52:$VA1}),{152:[1,201]},{152:[1,202]},{152:[1,203]},o($VB1,[2,349],{152:[1,204]}),{27:[1,205]},o($Vt,[2,173],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,206]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:207,127:208},o($VB1,$Vt1,{152:$Vv1}),o($Vt,[2,174],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,209]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:210,127:208},o($Vt,[2,175],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,211]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:212,127:208},o($Vt,[2,176],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,213]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:214,127:208},{128:[1,215]},{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:216,127:208},{47:[1,217]},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:218,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:227,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,228]},{31:[2,38]},{11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:[2,28],32:$Vv,35:230,37:229,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,31:[2,30],36:231},o($VI1,[2,34],{36:232,8:$VB}),o($VI1,[2,37],{8:$VJ1}),o($VK1,[2,107]),o($VK1,[2,108]),o($VK1,[2,109]),o($VK1,[2,110],{87:[1,234],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VK1,[2,112]),o($VK1,[2,113]),o($VK1,[2,114]),o($VK1,[2,115]),o($VK1,[2,116]),o($VK1,[2,117]),o($VK1,[2,118]),o($VK1,[2,119]),o($VK1,[2,120]),o($V62,[2,48]),{41:259,42:[1,260],43:[1,261],44:[1,262],47:[1,258]},{23:160,27:$Vz,29:[1,263],32:$Vv,47:$VI,48:265,52:[1,264],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,54]),o($V62,[2,55]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:266,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,44]),o($VK1,[2,136]),o($VK1,[2,137]),o($VK1,[2,138]),o($VK1,[2,139]),o($VK1,[2,140]),o($VK1,[2,141]),o($Vk,$Vl,{140:50,70:268,47:$V72,52:$V82,76:$Vm,77:$Vn,141:$Vo}),{23:160,27:$Vz,32:$Vv,47:$VI,48:270,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:271,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:272,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o([8,31,87,108,109,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$V92,{131:275,122:$Va2,124:$Vb2,128:$Vc2,132:$Vd2,133:$Ve2,134:$Vf2}),{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:280,142:$Vh2,179:$Vi2,181:$V61},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:285,142:$Vh2,179:$Vi2,181:$V61},o($Vn1,[2,315],{181:$Vj2}),o($Vn1,[2,316]),{23:160,27:$Vz,32:$Vv,47:$VI,48:287,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vn1,[2,318]),o($Vn1,[2,319],{181:$Vk2}),o($Vn1,[2,320]),{62:[1,290],94:289},{27:[1,291]},{23:292,27:$Vz,32:$Vv,52:$VA,63:$Vw,69:$Vx,96:$Vy,127:90},{23:293,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy},{47:[1,294]},{47:[1,295]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:296,35:298,36:299,37:297,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{32:$Vl2,63:$Vm2,95:300,96:$Vn2},{47:[1,304]},{47:[1,305]},o($V62,[2,153]),{128:[1,306]},o($VK1,[2,197],{139:135,91:137,180:139,92:153,23:160,123:221,48:307,27:$Vz,32:$Vv,47:$VI,52:[1,308],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($Vo2,$Vp2,{47:$Vq2,181:$Vr2}),{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:311,96:$Vy},{23:71,27:$Vz,32:$Vv,47:$Vs2,52:[1,314],63:$Vw,69:$Vx,70:313,96:$Vy,126:77,127:78},{23:71,27:$Vz,32:$Vv,47:$Vt2,52:[1,317],63:$Vw,69:$Vx,70:316,96:$Vy,126:81,127:82},{23:71,27:$Vz,32:$Vv,47:$Vu2,52:[1,320],63:$Vw,69:$Vx,70:319,96:$Vy,126:84,127:85},{23:71,27:$Vz,32:$Vv,47:$Vv2,52:[1,323],63:$Vw,69:$Vx,70:322,96:$Vy,126:87,127:88},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:325,135:324,142:$Vh2,179:$Vi2,181:$V61},o($Vw2,[2,340],{182:326,52:[1,327]}),{49:[1,328]},{49:[2,65],65:[1,329]},{49:[2,67]},o($Vx2,[2,70]),{27:[1,330],69:[1,331]},o($Vy2,[2,75]),o($Vy2,[2,76]),o($Vy2,[2,77]),{71:[1,332],72:[1,333],73:[1,334],79:[1,335]},{76:[1,336],77:[1,337]},o($Vy2,[2,83]),o($Vy2,[2,84]),o($Vy2,[2,86]),o($Vy2,[2,87]),o($Vy2,[2,88]),o($Vy2,[2,89]),o($Vy2,[2,90]),o($Vy2,[2,91]),{49:$V71,56:$V81,58:338,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{47:[1,339]},{47:[1,340]},{47:$Vu1},o($Vt,[2,266],{65:$Vq1}),o($Vs1,$Vo1,{149:190,52:$Vp1,128:[1,341]}),{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:342},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:344,153:343},{142:[1,345]},o($Vm1,[2,272],{65:$Vq1}),{23:160,27:$Vz,32:$Vv,47:$VI,48:346,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vs1,[2,258],{52:$Vz2}),{23:160,27:$Vz,32:$Vv,47:$VI,48:349,54:[1,348],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:350,151:64},{27:[1,351],144:[1,352]},{27:[1,353]},{27:[1,354]},{27:$VA2,144:$VB2,183:355},{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,127:358},{23:160,27:$Vz,32:$Vv,47:$VI,48:359,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vy1,[2,194],{52:[1,360]}),{23:160,27:$Vz,32:$Vv,47:$VI,48:362,54:[1,361],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{27:$VA2,144:$VB2,183:363},{27:$VA2,144:$VB2,183:364},{27:$VA2,144:$VB2,183:365},{27:$VA2,144:$VB2,183:366},{47:[2,58]},{23:160,27:$Vz,32:$Vv,47:$VI,48:367,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,368],65:$Vw1},o($VC2,$Vx1),{23:160,27:$Vz,32:$Vv,47:$VI,48:369,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,370],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:371,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,372],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:373,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,374],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:375,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,376],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:377,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,378],65:$VD2},{23:160,27:$Vz,32:$Vv,47:$VI,48:380,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VE2,[2,252],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vn1,$V92,{122:$Va2,124:$Vb2}),{47:$Vs2,52:$V82,70:313},{47:$Vt2,52:$V82,70:316},{47:$Vu2,52:$V82,70:319},{47:$V72,52:$V82,70:268},{47:$Vv2,52:$V82,70:322},{31:[1,381]},o($V0,[2,23]),{8:$VB,31:[2,29],36:382},o($VI1,[2,31],{36:383,8:$VB}),o($VI1,[2,36],{8:$VJ1}),o($VI1,[2,35],{8:$VJ1}),o($V62,[2,43]),{23:160,27:$Vz,32:$Vv,47:$VI,48:384,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:385,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:386,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:387,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:388,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:389,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:390,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:391,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{56:$V81,61:392,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{23:160,27:$Vz,32:$Vv,47:$VI,48:394,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:395,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:396,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:397,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:398,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:399,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:400,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:401,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:402,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:403,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:404,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:405,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:406,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:407,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:408,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:409,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:410,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VF2,[2,45]),o($VF2,[2,46]),o($VF2,[2,47]),{27:$VG2,51:412},{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,53:414,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:415,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:[1,419],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{31:[1,420]},{23:160,27:$Vz,32:$Vv,47:$VI,48:421,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,422],52:$VJ2},{54:$VK2},o($Vn1,[2,300]),o($Vn1,[2,308]),o($Vn1,[2,309]),o($Vn1,[2,313]),o($Vn1,[2,314]),{23:160,27:$Vz,32:$Vv,47:$VI,48:425,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VL2,[2,200],{137:426,52:$VM2}),o($VL2,[2,201]),o($VL2,[2,202]),o($VL2,[2,203]),o($Vn1,[2,311]),o($Vo2,$Vp2,{181:$Vr2}),{181:$Vj2},{23:160,27:$Vz,32:$Vv,47:$VI,48:428,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{181:$Vk2},o($Vn1,[2,312]),{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:429,96:$Vy},{49:[1,430],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:431,96:$Vy},{32:$Vl2,63:$Vm2,95:432,96:$Vn2},o([32,63,96],[2,131]),{52:$Vp1,128:[1,433],149:434},o($VK1,[2,19],{129:199,26:[1,435],29:[1,436],52:$VA1,128:$Vz1}),o($VK1,[2,18]),{13:441,19:438,23:160,25:$V1,27:$Vz,32:$Vv,47:$Vg2,56:$Vu,63:$Vw,69:$Vx,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,79:$Vb,92:281,96:$Vy,98:439,106:437,123:440,125:30,142:$Vh2,179:$Vi2,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:442,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{109:[1,443]},{8:$VB,36:445,109:[1,444]},o([20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,115,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],[2,24],{36:446,8:$VB}),o($V62,[2,26]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:447,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VF2,[2,132]),o($VF2,[2,133]),o($VF2,[2,134]),{23:160,27:$Vz,32:$Vv,47:$VI,48:448,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:449,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,52:[1,451],63:$Vw,69:$Vx,91:450,92:452,96:$Vy},o($VK1,[2,198],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:453,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vo2,[2,331],{47:[1,455],142:[1,454],179:[1,456]}),o($Vx2,$VN2,{139:135,91:137,180:139,92:153,23:160,123:221,93:457,48:459,27:$Vz,32:$Vv,47:$VI,52:$VO2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($Vo2,[2,335]),{23:160,27:$Vz,32:$Vv,47:$VI,48:460,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,461],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:207,127:208},{23:160,27:$Vz,32:$Vv,47:$VI,48:462,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,463],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:210,127:208},{23:160,27:$Vz,32:$Vv,47:$VI,48:464,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,465],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:212,127:208},{23:160,27:$Vz,32:$Vv,47:$VI,48:466,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,467],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:214,127:208},{54:[1,468],65:[1,469]},o($VC2,[2,206]),o($Vw2,[2,341],{52:[1,470]}),{23:160,27:$Vz,32:$Vv,47:$VI,48:471,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{29:[1,473],59:[1,472]},{56:$V81,66:[1,474],67:475,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},o($Vx2,[2,71],{70:476,52:$V82}),o($Vx2,[2,72],{70:477,52:$V82}),o($Vy2,[2,78]),o($Vy2,[2,79]),o($Vy2,[2,80]),o($Vy2,[2,85]),o($Vy2,[2,81]),o($Vy2,[2,82]),{49:[1,478]},{49:$V71,56:$V81,58:479,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{49:$V71,56:$V81,58:480,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{23:160,27:$Vz,32:$Vv,47:$VI,48:481,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vt,[2,268],{65:$Vq1}),o($Vt,[2,269],{65:$Vq1}),o($Vs1,$Vo1,{149:190,52:$Vp1,128:[1,482]}),{49:[1,483]},o($Vm1,[2,273],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:485,54:[1,484],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vr1,[2,253]),{54:[1,486],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vs1,[2,264]),o($Vr1,[2,262]),o($Vr1,[2,263]),{65:[1,487]},{49:[1,488]},o($VB1,[2,348],{152:$VP2}),o($VQ2,[2,353]),o($VQ2,[2,354]),o([6,8,20,25,31,32,54,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,138],[2,195]),o($Vm1,[2,182],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:491,54:[1,490],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VR2,[2,189]),{54:[1,492],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VB1,[2,344],{152:$VP2}),o($VB1,[2,345],{152:$VP2}),o($VB1,[2,346],{152:$VP2}),o($VB1,[2,350],{152:$VP2}),o($Vm1,[2,178],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,493]},o($Vm1,[2,179],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,494]},o($Vm1,[2,180],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,495]},o($Vm1,[2,181],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,496]},o($Vm1,[2,183],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,497]},{49:[1,498],65:$VD2},{29:[1,499]},{23:160,27:$Vz,32:$Vv,47:$VI,48:501,63:$Vw,66:[1,500],69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VE2,[2,251],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V0,[2,281]),o($VI1,[2,33],{8:$VJ1}),o($VI1,[2,32],{8:$VJ1}),o($VK1,[2,111],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,284],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,285],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,286],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,287],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,288],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,289],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o([6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,162,163,164,165,166,167,168],[2,290],{156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vn1,[2,291]),o($VT2,[2,96],{70:502,52:$V82}),o($VU2,[2,292],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{59:[1,503],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VU2,[2,294],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VU2,[2,295],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VU2,[2,296],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VV2,[2,297],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VU2,[2,298],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VV2,[2,299],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VW2,[2,301],{174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VW2,[2,302],{174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VX2,[2,303],{178:$V52}),o($VX2,[2,304],{178:$V52}),o($VX2,[2,305],{178:$V52}),o($VX2,[2,306],{178:$V52}),o($Vn1,[2,307]),{49:[1,504],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($V62,[2,50]),{8:$VB,36:445},{31:[1,505],65:$VY2},o($VZ2,[2,127],{59:[1,507]}),{54:[1,508],65:$V_2},o($VC2,[2,129]),o($V$2,[2,121],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{27:$VG2,51:510},{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,53:511,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:415,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,53]),o($V62,[2,56]),{49:[1,512],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:513,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,514]},o($V03,[2,95]),o([8,31,49,65,109],[2,211],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o([8,31,49,65,108,109],[2,212]),{23:160,27:$Vz,32:$Vv,47:$VI,48:517,52:$V13,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,145:515,146:516,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,519],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vo2,[2,336]),o($Vn1,[2,317],{181:$V23}),o($Vo2,[2,338]),{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:521,96:$Vy},{23:160,27:$Vz,32:$Vv,47:$VI,48:522,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{52:$Vz2,128:[1,523]},{27:[1,524]},{13:528,14:529,15:530,16:531,17:532,18:533,19:534,25:$V1,30:525,31:$V33,40:526,56:$Vu,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,85:527,125:30},{8:[1,535],108:[1,536]},o($V43,[2,167]),o($V43,[2,168]),o($V43,[2,169],{131:275,128:$Vc2,132:$Vd2,133:$Ve2,134:$Vf2}),o($V43,[2,170]),{49:[1,537],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{47:[1,538]},{47:[1,539]},o($V62,[2,27]),o($V62,[2,25]),o($V62,[2,149]),{49:[1,540],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{49:[1,541],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VK1,[2,209]),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:542,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:$Vq2},{54:[1,543],65:$VD2},o($Vo2,[2,332]),{23:160,27:$Vz,32:$Vv,47:$VI,48:544,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vo2,[2,334]),{49:[1,545],65:$V53},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:547,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vx2,[2,248],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{49:[1,548],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:549,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,550],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:551,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,552],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:553,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,554],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:555,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{128:[2,207]},o($VC2,[2,205],{23:160,92:281,123:557,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,66:[1,556],69:$Vx,96:$Vy,142:$Vh2,179:$Vi2,181:$V61}),{23:160,27:$Vz,32:$Vv,47:$VI,48:558,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,559],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{52:[1,560],56:$V81,61:561,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:562,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[2,66]},o($Vx2,[2,69]),o($Vx2,[2,73],{52:$VJ2}),o($Vx2,[2,74],{52:$VJ2}),{29:[1,563]},{49:[1,564]},{49:[1,565]},o($Vm1,[2,267],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:566,52:$VM2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,137:567,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vk,[2,216]),o($Vr1,[2,255]),{54:[1,568],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vr1,[2,254]),{27:[1,569]},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:570},{27:[1,571],144:[1,572]},o($VR2,[2,191]),{54:[1,573],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VR2,[2,190]),{52:[1,574]},{52:[1,575]},{52:[1,576]},{52:[1,577]},{52:[1,578]},{29:[1,579]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:580,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:581,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VE2,[2,250],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VT2,[2,97],{52:$VJ2}),{23:160,27:$Vz,32:$Vv,47:$VI,48:582,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:583,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,51]),{27:[1,584]},{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:585,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,52]),{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:586,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,587],65:$VY2},{54:[1,588],65:$V_2},o($Vn1,[2,324]),{49:[1,589],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($V03,[2,94]),{54:[1,590],65:$V63},o($VC2,[2,234],{59:$V73,66:$V83}),o($V93,$Va3,{59:[1,594],108:$VL1,119:$Vb3,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:517,52:$V13,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,145:596,146:516,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{181:$V23},{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:597,96:$Vy},{47:[1,598]},o($VK1,[2,282],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{52:$VM2,137:599},o($VK1,[2,20],{29:[1,600]}),{31:[1,601]},{8:$VB,31:[2,40],36:602},o($Vc3,[2,99]),o($Vc3,[2,100]),o($Vc3,[2,101]),o($Vc3,[2,102]),o($Vc3,[2,103]),o($Vc3,[2,104]),o($Vc3,[2,105]),o($Vc3,[2,106]),{23:160,27:$Vz,32:$Vv,47:$VI,48:603,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:605,52:[1,606],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,103:604,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:607,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:608,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:609,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{29:[1,611],113:610},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:612,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,613],65:$VD2},o($VK1,[2,199]),{49:[1,614],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,130]),{23:160,27:$Vz,32:$Vv,47:$VI,48:615,52:[1,616],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,617],65:$VD2},o($Vn1,[2,321]),{49:[1,618],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,322]),{49:[1,619],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,323]),{49:[1,620],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,325]),{49:[1,621],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{54:[1,622]},o($VC2,[2,204]),{54:[1,623],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vd3,[2,343]),{56:$V81,60:624,61:625,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{29:[1,626]},{31:[1,627]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:628,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{29:[1,629]},{29:[1,630]},o($Vm1,[2,270],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vt,[2,271]),o($Vr1,[2,256]),{49:[1,632],65:[1,631]},o($Vm1,[2,278],{65:$Vq1}),o($VQ2,[2,351]),o($VQ2,[2,352]),o($VR2,[2,192]),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:633,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:634,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:635,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:636,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:637,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:638,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,639]},o($VE2,[2,249],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o([6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,109,119,138,147,148],[2,293],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V62,[2,49]),o($VZ2,[2,125],{59:[1,640]}),o($VZ2,[2,126]),o($VC2,[2,128]),o($V$2,[2,122]),o($V$2,[2,123]),o($Vn1,[2,329]),o($Ve3,[2,220],{59:[1,642],66:[1,641]}),{23:160,27:$Vz,32:$Vv,47:$VI,48:644,52:$V13,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,146:643,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:645,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vf3,[2,241]),{23:160,27:$Vz,32:$Vv,47:$VI,48:646,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:647,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,648],65:$V63},o($Vo2,[2,337]),o($Vx2,$VN2,{139:135,91:137,180:139,92:153,23:160,123:221,48:459,93:649,27:$Vz,32:$Vv,47:$VI,52:$VO2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($VK1,[2,283]),{13:528,14:529,15:530,16:531,17:532,18:533,19:534,25:$V1,30:650,31:$V33,40:526,56:$Vu,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,85:527,125:30},o($V62,[2,21]),{8:$VJ1,13:528,14:529,15:530,16:531,17:532,18:533,19:534,25:$V1,31:[2,41],56:$Vu,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,85:651,125:30},{8:[1,652],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{49:[1,653]},{49:[2,142],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:654,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,146]),{49:[1,655],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{49:[1,656],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($V62,[2,150]),{116:657,120:[1,658]},o([8,20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],[2,151],{115:[1,659]}),o($VK1,[2,210]),o($Vo2,[2,333]),o($Vx2,[2,245],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:660,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vx2,[2,247]),o($Vn1,[2,326]),o($Vn1,[2,327]),o($Vn1,[2,328]),o($Vn1,[2,330]),{128:[2,208]},o($Vd3,[2,342]),{54:[1,661],65:[1,662]},o($VC2,[2,93]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:663,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vg3,[2,61]),{31:[1,664]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:665,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:666,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:667,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{27:[1,668]},{54:[1,669],65:$VD2},{54:[1,670],65:$VD2},{54:[1,671],65:$VD2},{54:[1,672],65:$VD2},{54:[1,673],65:$VD2},{31:[1,674]},o($V0,[2,280]),{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:675,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Ve3,[2,221]),{23:160,27:$Vz,32:$Vv,47:$VI,48:676,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VC2,[2,224],{59:$V73,66:$V83}),o($V93,$Va3,{59:[1,677],108:$VL1,119:$Vb3,147:[1,678],148:[1,679],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vf3,[2,236],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,235],{108:$VL1,119:$Vh3,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V93,[2,237],{59:[1,681],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vf3,[2,242]),{49:[1,682],65:$V53},{31:[1,683]},o($Vc3,[2,98]),{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,98:686,107:684,121:685,122:$Vi3,123:689,124:$Vj3,142:$Vh2,179:$Vi2,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:690,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,691],65:$VD2},o($V62,[2,147]),o($V62,[2,148]),{31:[1,692],117:[1,693],120:[1,694]},{23:160,27:$Vz,32:$Vv,47:$VI,48:696,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,118:695,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:697,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,698],65:$VD2},{29:[1,699]},{56:$V81,61:700,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{31:[1,701]},o($Vg3,[2,62]),{31:[1,702]},{31:[1,703]},{49:[1,704],65:$VD2},{52:[1,705]},o($Vt,[2,184]),o($Vt,[2,185]),o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($V0,[2,279]),o($VZ2,[2,124]),o($Ve3,[2,222],{66:[1,706],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:707,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VC2,[2,230],{139:135,91:137,180:139,92:153,23:160,123:221,48:708,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($VC2,[2,231],{139:135,91:137,180:139,92:153,23:160,123:221,48:709,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{23:160,27:$Vz,32:$Vv,47:$VI,48:710,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:711,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VK1,[2,135]),o($V62,[2,22]),{49:[1,712],65:[1,713]},o($Vx2,[2,214]),o($Vx2,[2,162]),{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:714,142:$Vh2,179:$Vi2,181:$V61},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:715,142:$Vh2,179:$Vi2,181:$V61},{122:[1,716],124:[1,717],128:$Vc2,131:275,132:$Vd2,133:$Ve2,134:$Vf2},o($V62,[2,145]),{49:[2,143]},o($V62,[2,154]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,35:99,36:100,37:98,38:718,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:696,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,118:719,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{59:[1,720],65:$Vk3},o($Vl3,[2,158],{108:$VL1,119:[1,722],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V62,[2,152]),o($Vx2,[2,246]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:723,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VC2,[2,92]),o($Vg3,[2,60]),o($Vg3,[2,63]),o($Vg3,[2,64]),{27:[1,724]},{23:160,27:$Vz,32:$Vv,47:$VI,48:725,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Ve3,[2,223]),o($VC2,[2,225],{108:$VL1,119:$Vh3,147:[1,726],148:[1,727],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,226],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,227],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V93,[2,239],{59:[1,728],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vf3,[2,238],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:729,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,98:686,121:730,122:$Vi3,123:689,124:$Vj3,142:$Vh2,179:$Vi2,181:$V61},o($Vx2,[2,163]),o($Vx2,[2,164]),o($Vx2,[2,165]),o($Vx2,[2,166]),{31:[1,731]},{59:[1,732],65:$Vk3},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,35:99,36:100,37:734,39:733,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:735,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:736,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,737]},{52:[1,738]},{54:[1,739],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VC2,[2,232],{139:135,91:137,180:139,92:153,23:160,123:221,48:740,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($VC2,[2,233],{139:135,91:137,180:139,92:153,23:160,123:221,48:741,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{23:160,27:$Vz,32:$Vv,47:$VI,48:742,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,144]),o($Vx2,[2,213]),o($V62,[2,155]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,35:99,36:100,37:734,39:743,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vm3,[2,161],{55:21,125:30,86:101,13:102,14:103,48:104,88:105,12:106,15:107,16:108,17:109,18:110,89:111,24:112,21:113,45:114,11:117,28:118,19:121,98:122,99:123,100:124,123:131,139:135,91:137,180:139,136:151,92:153,23:160,35:230,37:744,20:$VC,22:$VD,25:$VE,27:$Vz,29:$VF,32:$Vv,46:$VH,47:$VI,50:$VJ,52:$VK,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,96:$Vy,97:$VQ,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,124:$V_,130:$V$,138:$Vg,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{8:$VB,36:231},o($Vl3,[2,156],{108:$VL1,119:[1,745],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vl3,[2,159],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vg3,[2,59]),{23:160,27:$Vz,32:$Vv,47:$VI,48:746,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{52:[1,747]},{59:[1,748],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{59:[1,749],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vf3,[2,240],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vm3,[2,160],{55:21,125:30,86:101,13:102,14:103,48:104,88:105,12:106,15:107,16:108,17:109,18:110,89:111,24:112,21:113,45:114,11:117,28:118,19:121,98:122,99:123,100:124,123:131,139:135,91:137,180:139,136:151,92:153,23:160,35:230,37:744,20:$VC,22:$VD,25:$VE,27:$Vz,29:$VF,32:$Vv,46:$VH,47:$VI,50:$VJ,52:$VK,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,96:$Vy,97:$VQ,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,124:$V_,130:$V$,138:$Vg,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{8:$VB,36:382},{23:160,27:$Vz,32:$Vv,47:$VI,48:750,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,751],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:752,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:753,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:754,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vl3,[2,157],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{52:[1,755]},{54:[1,756],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VC2,[2,228],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,229],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:757,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vm1,[2,276]),{54:[1,758],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vm1,[2,275])], +defaultActions: {4:[2,1],96:[2,38],163:[2,67],182:[2,57],205:[2,58],468:[2,207],474:[2,66],622:[2,208],691:[2,143]}, parseError: function parseError (str, hash) { if (hash.recoverable) { this.trace(str); @@ -1407,212 +1412,214 @@ case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ break; case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ break; -case 3: return 74; +case 3: return 75; break; -case 4: return 75; +case 4: return 76; break; -case 5: return 76; +case 5: return 77; break; -case 6: return 24; +case 6: return 25; break; case 7: return 'DECLARE'; break; -case 8: return 21; +case 8: return 22; break; -case 9: return 25; +case 9: return 26; break; -case 10: return 137; +case 10: return 138; break; -case 11: return 107; +case 11: return 108; break; -case 12: return 161; +case 12: return 162; break; -case 13: return 83; +case 13: return 84; break; -case 14: return 82; +case 14: return 83; break; -case 15: return 154 +case 15: return 155 break; -case 16: return 73 +case 16: return 74 break; -case 17: return 79 +case 17: return 80 break; -case 18: return 80 +case 18: return 81 break; -case 19: return 62 +case 19: return 63 break; -case 20: return 95 +case 20: return 96 break; -case 21: return 31 +case 21: return 32 break; -case 22: return 70 +case 22: return 71 break; -case 23: return 71 +case 23: return 72 break; -case 24: return 72 +case 24: return 73 break; -case 25: return 78 +case 25: return 79 break; -case 26: return 77 +case 26: return 78 break; -case 27: return 104 +case 27: return 105 break; -case 28: return 108 +case 28: return 109 break; -case 29: return 109 +case 29: return 110 break; -case 30: return 101 +case 30: return 102 break; -case 31: return 100 +case 31: return 101 break; -case 32: return 113 +case 32: return 114 break; case 33: return 'ELSEIF' break; -case 34: return 114 +case 34: return 115 break; -case 35: return 111 +case 35: return 112 break; -case 36: return 119 +case 36: return 120 break; -case 37: return 116 +case 37: return 117 break; -case 38: return 45 +case 38: return 46 break; -case 39: return 153 +case 39: return 154 break; -case 40: return 140 +case 40: return 141 break; -case 41: return 110 +case 41: return 111 break; -case 42: return 96 +case 42: return 97 break; -case 43: return 56 +case 43: return 57 break; -case 44: return 61 +case 44: return 62 break; -case 45: return 55 +case 45: return 56 break; -case 46: return 129 +case 46: return 130 break; -case 47: return 41 +case 47: return 42 break; -case 48: return 42 +case 48: return 43 break; -case 49: return 43 +case 49: return 44 break; -case 50: return 146 +case 50: return 20 break; case 51: return 147 break; -case 52: return 65 +case 52: return 148 break; -case 53: return 118 +case 53: return 66 break; -case 54: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 141; +case 54: return 119 break; -case 55: yy_.yytext = yy_.yytext.slice(1,-1); return 142; +case 55: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 142; break; case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; break; -case 57: return 26; +case 57: yy_.yytext = yy_.yytext.slice(1,-1); return 144; break; -case 58: yy_.yytext = yy_.yytext.slice(1); return 68; +case 58: return 27; break; -case 59: yy_.yytext = yy_.yytext.slice(1); return 49; +case 59: yy_.yytext = yy_.yytext.slice(1); return 69; break; -case 60: yy_.yytext = yy_.yytext.slice(1); return 178; +case 60: yy_.yytext = yy_.yytext.slice(1); return 50; break; -case 61: return 177; +case 61: yy_.yytext = yy_.yytext.slice(1); return 179; break; -case 62: return 121; +case 62: return 178; break; -case 63: return 123; +case 63: return 122; break; -case 64: return 131; +case 64: return 124; break; case 65: return 132; break; case 66: return 133; break; -case 67: return 171; +case 67: return 134; break; case 68: return 172; break; case 69: return 173; break; -case 70: return "'"; +case 70: return 174; break; -case 71: return "?"; +case 71: return "'"; break; -case 72: return "%"; +case 72: return "?"; break; -case 73: return "\\\\"; +case 73: return "%"; break; -case 74: return "/"; +case 74: return "\\\\"; break; -case 75: return 8; +case 75: return "/"; break; -case 76: return 64; +case 76: return 8; break; -case 77: return 151; +case 77: return 65; break; -case 78: return 162; +case 78: return 152; break; -case 79: return 167; +case 79: return 163; break; -case 80: return 164; +case 80: return 168; break; case 81: return 165; break; case 82: return 166; break; -case 83: return 168; +case 83: return 167; break; case 84: return 169; break; -case 85: return 159; +case 85: return 170; break; case 86: return 160; break; -case 87: return 157; +case 87: return 161; break; case 88: return 158; break; -case 89: return 86; +case 89: return 159; +break; +case 90: return 87; break; -case 90: return 156; +case 91: return 157; break; -case 91: return 155; +case 92: return 156; break; -case 92: return 127; +case 93: return 128; break; -case 93: return 46; +case 94: return 47; break; -case 94: return 48; +case 95: return 49; break; -case 95: return 51; +case 96: return 52; break; -case 96: return 53; +case 97: return 54; break; -case 97: return 28; +case 98: return 29; break; -case 98: return 30; +case 99: return 31; break; -case 99: return '::'; +case 100: return '::'; break; -case 100: return 58; +case 101: return 59; break; -case 101: return 170; +case 102: return 171; break; -case 102: return 6; +case 103: return 6; break; -case 103: console.log("INVALID: " + yy_.yytext); return 'INVALID' +case 104: console.log("INVALID: " + yy_.yytext); return 'INVALID' break; } }, -rules: [/^(?:\s+)/,/^(?:\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)/,/^(?:\/\/.*)/,/^(?:col\b)/,/^(?:witness\b)/,/^(?:fixed\b)/,/^(?:container\b)/,/^(?:declare\b)/,/^(?:use\b)/,/^(?:alias\b)/,/^(?:include\b)/,/^(?:in\b)/,/^(?:is\b)/,/^(?:publictable\b)/,/^(?:public\b)/,/^(?:constant\b)/,/^(?:const\b)/,/^(?:proofval\b)/,/^(?:subproofval\b)/,/^(?:subproof\b)/,/^(?:air\b)/,/^(?:proof\b)/,/^(?:int\b)/,/^(?:fe\b)/,/^(?:expr\b)/,/^(?:string\b)/,/^(?:challenge\b)/,/^(?:for\b)/,/^(?:while\b)/,/^(?:do\b)/,/^(?:break\b)/,/^(?:continue\b)/,/^(?:if\b)/,/^(?:elseif\b)/,/^(?:else\b)/,/^(?:switch\b)/,/^(?:case\b)/,/^(?:default\b)/,/^(?:when\b)/,/^(?:aggregate\b)/,/^(?:stage\b)/,/^(?:once\b)/,/^(?:on\b)/,/^(?:private\b)/,/^(?:final\b)/,/^(?:function\b)/,/^(?:return\b)/,/^(?:first\b)/,/^(?:last\b)/,/^(?:frame\b)/,/^(?:\.\.\+\.\.)/,/^(?:\.\.\*\.\.)/,/^(?:\.\.\.)/,/^(?:\.\.)/,/^(?:(0x[0-9A-Fa-f][0-9A-Fa-f_]*)|([0-9][0-9_]*))/,/^(?:"[^"]+")/,/^(?:`[^`]+`)/,/^(?:[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:&[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:@[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:\$[0-9][0-9]*)/,/^(?:\*\*)/,/^(?:\+\+)/,/^(?:--)/,/^(?:\+=)/,/^(?:-=)/,/^(?:\*=)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:')/,/^(?:\?)/,/^(?:%)/,/^(?:\\\\)/,/^(?:\/)/,/^(?:;)/,/^(?:,)/,/^(?:\.)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:&)/,/^(?:\|)/,/^(?:\^)/,/^(?:<<)/,/^(?:>>)/,/^(?:<=)/,/^(?:>=)/,/^(?:<)/,/^(?:>)/,/^(?:===)/,/^(?:!=)/,/^(?:==)/,/^(?:=)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:::)/,/^(?::)/,/^(?:!)/,/^(?:$)/,/^(?:.)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"inclusive":true}} +rules: [/^(?:\s+)/,/^(?:\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)/,/^(?:\/\/.*)/,/^(?:col\b)/,/^(?:witness\b)/,/^(?:fixed\b)/,/^(?:container\b)/,/^(?:declare\b)/,/^(?:use\b)/,/^(?:alias\b)/,/^(?:include\b)/,/^(?:in\b)/,/^(?:is\b)/,/^(?:publictable\b)/,/^(?:public\b)/,/^(?:constant\b)/,/^(?:const\b)/,/^(?:proofval\b)/,/^(?:subproofval\b)/,/^(?:subproof\b)/,/^(?:air\b)/,/^(?:proof\b)/,/^(?:int\b)/,/^(?:fe\b)/,/^(?:expr\b)/,/^(?:string\b)/,/^(?:challenge\b)/,/^(?:for\b)/,/^(?:while\b)/,/^(?:do\b)/,/^(?:break\b)/,/^(?:continue\b)/,/^(?:if\b)/,/^(?:elseif\b)/,/^(?:else\b)/,/^(?:switch\b)/,/^(?:case\b)/,/^(?:default\b)/,/^(?:when\b)/,/^(?:aggregate\b)/,/^(?:stage\b)/,/^(?:once\b)/,/^(?:on\b)/,/^(?:private\b)/,/^(?:final\b)/,/^(?:function\b)/,/^(?:return\b)/,/^(?:first\b)/,/^(?:last\b)/,/^(?:frame\b)/,/^(?:debugger\b)/,/^(?:\.\.\+\.\.)/,/^(?:\.\.\*\.\.)/,/^(?:\.\.\.)/,/^(?:\.\.)/,/^(?:(0x[0-9A-Fa-f][0-9A-Fa-f_]*)|([0-9][0-9_]*))/,/^(?:"[^"]+")/,/^(?:`[^`]+`)/,/^(?:[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:&[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:@[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:\$[0-9][0-9]*)/,/^(?:\*\*)/,/^(?:\+\+)/,/^(?:--)/,/^(?:\+=)/,/^(?:-=)/,/^(?:\*=)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:')/,/^(?:\?)/,/^(?:%)/,/^(?:\\\\)/,/^(?:\/)/,/^(?:;)/,/^(?:,)/,/^(?:\.)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:&)/,/^(?:\|)/,/^(?:\^)/,/^(?:<<)/,/^(?:>>)/,/^(?:<=)/,/^(?:>=)/,/^(?:<)/,/^(?:>)/,/^(?:===)/,/^(?:!=)/,/^(?:==)/,/^(?:=)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:::)/,/^(?::)/,/^(?:!)/,/^(?:$)/,/^(?:.)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],"inclusive":true}} }); return lexer; })(); diff --git a/docs/expression.md b/docs/expression.md index 5c51243..9678933 100644 --- a/docs/expression.md +++ b/docs/expression.md @@ -14,7 +14,7 @@ And next? |fe|| |col witness|| |col fixed|| -|col (im)|| +|expression|| |challenge|| |public|| |air value|| @@ -25,4 +25,21 @@ And next? - **instance()** make a copy of expression, where __runtime values and expressions__ (variables, eq, be) are replaced - **evaluate()** calculate a single value (int, fe, bool) without replacing runtime values and expressions. For example, a condition on loop, etc.. - +```mermaid +classDiagram +ExpressionItem <-- RuntimeItem +ExpressionItem <-- ProofItem +RuntimeItem <-- ReferenceItem +RuntimeItem <-- ExpressionReference +RuntimeItem <-- ValueItem +RuntimeItem <-- StringValue +RuntimeItem <-- FunctionCall +ProofItem <-- Challenge +ProofItem <-- ProofVal +ProofItem <-- FixedCol +ProofItem <-- WitnessCol +ProofItem <-- Public +ProofItem <-- SubproofVal +ValueItem <-- IntValue +ValueItem <-- FeValue +`````` diff --git a/src/constraints.js b/src/constraints.js index d78dbb5..5223952 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -46,7 +46,8 @@ module.exports = class Constraints { console.log('\x1B[31mWARNING: accessing fixed row acces\x1b[0m'); } const id = this.constraints.length; - if (right.eval() !== 0n) { + console.log(right.eval()); + if (right.asIntDefault(false) !== 0n) { left.insert('sub', right); } // left.simplify(); diff --git a/src/definition_items.js b/src/definition_items.js index 851c790..3b3dbbc 100644 --- a/src/definition_items.js +++ b/src/definition_items.js @@ -1,35 +1,33 @@ const DefinitionItem = require("./definition_items/definition_item.js"); -const FeValue = require("./definition_items/fe_value.js"); -const IntValue = require("./definition_items/int_value.js"); +const FeVariable = require("./definition_items/fe_variable.js"); +const IntVariable = require("./definition_items/int_variable.js"); const ProofItem = require("./definition_items/proof_item.js"); const Proofval = require("./definition_items/proofval.js"); const Challenge = require("./definition_items/challenge.js"); const Public = require("./definition_items/public.js"); const Publictable = require("./definition_items/publictable.js"); -const ReferenceItem = require("./definition_items/reference_item.js"); const RuntimeItem = require("./definition_items/runtime_item.js"); -const StringValue = require("./definition_items/string_value.js"); +const StringVariable = require("./definition_items/string_variable.js"); const Subproofval = require("./definition_items/subproofval.js"); -const ValueItem = require("./definition_items/value_item.js"); +const Variable = require("./definition_items/variable.js"); const WitnessCol = require("./definition_items/witness_col.js"); const FixedCol = require("./definition_items/fixed_col.js"); -const Expression = require("./definition_items/expression.js"); +const ExpressionVariable = require("./definition_items/expression_variable.js"); module.exports = { DefinitionItem, - FeValue, + FeVariable, FixedCol, - IntValue, + IntVariable, ProofItem, Proofval, Challenge, Public, Publictable, - ReferenceItem, RuntimeItem, - StringValue, + StringVariable, Subproofval, - ValueItem, + Variable, WitnessCol, - Expression + ExpressionVariable } diff --git a/src/definition_items/definition_item.js b/src/definition_items/definition_item.js index 5840e2b..f7df7c5 100644 --- a/src/definition_items/definition_item.js +++ b/src/definition_items/definition_item.js @@ -51,6 +51,7 @@ */ module.exports = class DefinitionItem { constructor (id, properties = {}) { + this.definition = true; this.id = id; this.label = properties.label; } diff --git a/src/definition_items/expression.js b/src/definition_items/expression_variable.js similarity index 76% rename from src/definition_items/expression.js rename to src/definition_items/expression_variable.js index 22eb761..1f5d753 100644 --- a/src/definition_items/expression.js +++ b/src/definition_items/expression_variable.js @@ -1,6 +1,6 @@ -const RuntimeItem = require("./runtime_item.js"); +const Variable = require("./variable.js"); const ExpressionClass = require('../expression.js'); -module.exports = class Expression extends RuntimeItem { +module.exports = class ExpressionVariable extends Variable { constructor (id, properties = {}) { super(id, properties); this.value = new ExpressionClass(); @@ -11,6 +11,7 @@ module.exports = class Expression extends RuntimeItem { this.value = value.clone(); return; } + console.log(value); this.value._set(value); this.value.dump('setValue'); } diff --git a/src/definition_items/fe_value.js b/src/definition_items/fe_variable.js similarity index 63% rename from src/definition_items/fe_value.js rename to src/definition_items/fe_variable.js index 4d5d13a..ae0f9b9 100644 --- a/src/definition_items/fe_value.js +++ b/src/definition_items/fe_variable.js @@ -1,12 +1,12 @@ const LabelRanges = require("../label_ranges.js"); -const ValueItem = require("./value_item.js"); +const Variable = require("./variable.js"); -module.exports = class FeValue extends ValueItem { +module.exports = class FeVariable extends Variable { constructor (value = 0n) { super(value); } clone() { - return new FeValue(this.value); + return new FeVariable(this.value); } asInt() { return this.value; diff --git a/src/definition_items/int_value.js b/src/definition_items/int_variable.js similarity index 81% rename from src/definition_items/int_value.js rename to src/definition_items/int_variable.js index 7546696..5b570e6 100644 --- a/src/definition_items/int_value.js +++ b/src/definition_items/int_variable.js @@ -1,11 +1,11 @@ const {assert, assertLog} = require('../assert.js'); -const ValueItem = require("./value_item.js"); +const Variable = require("./variable.js"); const ExpressionItem = require('../expression_items/int_value.js'); -module.exports = class IntValue extends ValueItem { +class IntVariable extends Variable { constructor (value = 0n) { - if (value instanceof IntValue) { - value = value.value; + if (typeof value === 'object' && typeof value.asInt === 'function') { + value = value.asInt(); } if (typeof value === 'number') { value = BigInt(value); @@ -42,3 +42,4 @@ module.exports = class IntValue extends ValueItem { return Number(this.value); } } +module.exports = IntVariable; \ No newline at end of file diff --git a/src/definition_items/reference_item.js b/src/definition_items/reference_item.js deleted file mode 100644 index 0d12510..0000000 --- a/src/definition_items/reference_item.js +++ /dev/null @@ -1,20 +0,0 @@ -const RuntimeItem = require("./runtime_item.js"); -module.exports = class ReferenceItem extends RuntimeItem { - constructor (name, indexes = [], next = 0) { - super(); - this.name = name; - this.indexes = [...indexes]; - this.next = Number(next ?? 0); - } - dump(options) { - const [pre,post] = this.getNextStrings(); - return `ReferenceItem(${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post})`; - } - clone() { - let cloned = new ReferenceItem(this.name, this.indexes, this.next); - this.cloneProperties(cloned); - } - cloneProperties(cloned) { - super.cloneProperties(cloned); - } -} diff --git a/src/definition_items/string_value.js b/src/definition_items/string_variable.js similarity index 88% rename from src/definition_items/string_value.js rename to src/definition_items/string_variable.js index 3a5c592..7e78258 100644 --- a/src/definition_items/string_value.js +++ b/src/definition_items/string_variable.js @@ -1,8 +1,8 @@ const {assert, assertLog} = require("../assert.js"); -const RuntimeItem = require("./runtime_item.js"); +const Variable = require("./variable.js"); const StringValueItem = require("../expression_items/string_value.js"); -class StringValue extends RuntimeItem { +class StringVariable extends Variable { constructor (id, properties) { super(id, properties); const value = properties.value ?? ''; @@ -33,4 +33,4 @@ class StringValue extends RuntimeItem { } } -module.exports = StringValue; \ No newline at end of file +module.exports = StringVariable; \ No newline at end of file diff --git a/src/definition_items/value_item.js b/src/definition_items/variable.js similarity index 75% rename from src/definition_items/value_item.js rename to src/definition_items/variable.js index 5e6152f..220ff6b 100644 --- a/src/definition_items/value_item.js +++ b/src/definition_items/variable.js @@ -1,6 +1,5 @@ -const ExpressionItem = require("./definition_item.js"); - -module.exports = class ValueItem extends ExpressionItem { +const RuntimeItem = require("./runtime_item.js"); +module.exports = class Variable extends RuntimeItem { static directValue = true; constructor (value) { super(); diff --git a/src/expression.js b/src/expression.js index 15b585c..6fe354a 100644 --- a/src/expression.js +++ b/src/expression.js @@ -16,6 +16,8 @@ const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; const Exceptions = require('./exceptions.js'); +// TODO: StackPos as class + function assertExpressionItem(value, info) { return assertReturnInstanceOf(value, ExpressionItem, info); } @@ -39,11 +41,10 @@ class Expression extends ExpressionItem { this.stack = []; this.fixedRowAccess = false; } - get isExpression() { return true; } - clone() { + cloneInstance() { let cloned = new Expression(); cloned.fixedRowAccess = this.fixedRowAccess; cloned.pushStack(this); @@ -59,7 +60,13 @@ class Expression extends ExpressionItem { } const count = e.stack.length; for (let index = 0; index < count; ++index) { - this.stack.push(this.cloneStackPos(e.stack[index])); + let stackPos = e.stack[index]; + console.log(stackPos); + e.dumpStackPos(stackPos); + let clonedStackPos = this.cloneStackPos(stackPos); + e.dumpStackPos(stackPos); + this.dumpStackPos(clonedStackPos); + this.stack.push(clonedStackPos); } return count; } @@ -135,6 +142,7 @@ class Expression extends ExpressionItem { if (this.stack.length) { throw new Error(`Set only could be used with empty stack`); } + console.log(operand); this.stack.push({op: false, operands: [assertExpressionItem(operand.clone())]}); } /* @@ -307,6 +315,7 @@ class Expression extends ExpressionItem { } instanceValues() { assert(false); + /* for (let se of this.stack) { for (let index = 0; index < se.operands.length; ++index) { if (se.operands[index].type !== OP_RUNTIME) continue; @@ -347,7 +356,7 @@ class Expression extends ExpressionItem { // value.dump(); throw new Error('Invalid value'); } - } + }*/ } getReference() { if (!this.isAlone()) { @@ -362,7 +371,7 @@ class Expression extends ExpressionItem { } isArray() { // only a reference could be and array. - if (!this.isReference() || this.stack[0].operands[0].next || this.stack[0].operands[0].prior) return false; + if (!this.isReference() || this.stack[0].operands[0].rowOffset) return false; let ref = this.getReference(); console.log(ref); @@ -664,27 +673,8 @@ class Expression extends ExpressionItem { // when evaluates single operands, StackItem is a reference to stack position // and it could be evaluated when all operands are left-to-right evaluated if (operand instanceof ExpressionItems.StackItem) continue; + const result = operand.eval(options); - let next = 0; - // if no prior defined priorValue was 0 - let priorValue = operand.prior ? this.evaluateValueAsNumber(operand.prior, options) : 0n; - - let result = assertExpressionItem(this.evaluateValue(operand, options), operand); - console.log(['RESULT', result]); - let indexes = operand.indexes ? this.evaluateValuesAsNumbers(operand.indexes, options) : []; - if (indexes.length) { - // TODO: fixed access - result = assertExpressionItem(this.getArrayResult(result, indexes, options)); - } - // if no prior defined nextValue was 0 - console.log(operand.next); - let nextValue = operand.next ? this.evaluateValueAsNumber(operand.next, options) : 0n; - - // prior and next are excl - if (priorValue && nextValue) { - throw new Error(`prior and next for same operand it's ambiguous`); - } - next = nextValue - priorValue; if (options.instance && result !== null) { console.log (result); st.operands[operandIndex] = assertExpressionItem(result); @@ -717,6 +707,7 @@ class Expression extends ExpressionItem { // this method instance the expression references to include them inside // TODO: view how these affects to optimization. instanceExpressions(options) { + EXIT_HERE; /* let pos = 0; while (pos < this.stack.length) { let nextPos = true; @@ -758,7 +749,7 @@ class Expression extends ExpressionItem { // this method instance the expression references to include them inside // TODO: view how these affects to optimization. instanceExpressions(options) { - + EXIT_HERE; // assert(ope.__value instanceof Expression === false); /* if (ope.__value instanceof Expression) { @@ -816,8 +807,8 @@ class Expression extends ExpressionItem { // [op,v1,v2] ==> [v1 op v2] if (firstValue !== false && secondValue !== false) { - assert(!firstValue || (!firstValue.next && !firstValue.__next)); - assert(!secondValue || (!secondValue.next && !secondValue.__next)); + assert(!firstValue || !firstValue.rowOffset); + assert(!secondValue || !secondValue.rowOffset); const res = this.applyOperation(st.op, st.operands); st.operands = [assertExpressionItem(res)]; st.op = false; @@ -826,7 +817,7 @@ class Expression extends ExpressionItem { // [neg,value] ==> [false,-value] if (st.op === 'neg' && firstValue !== false) { - assert(!firstValue.next && !firstValue.__next); + assert(!firstValue.rowOffset); st.op = false; st.operands[0].setValue(-st.operands[0].getValue()); assert(st.operands[0] instanceof ExpressionItem); @@ -967,16 +958,18 @@ class Expression extends ExpressionItem { title = title + ' ' + this.getCaller(); console.log(`\x1B[38;5;214m|==========> ${title} <==========|\x1B[0m`); for (let index = stack.length-1; index >=0; --index) { - const st = stack[index]; - const stackValue = st[stackProperty]; - const operationInfo = (stackValue && typeof stackValue.dump === 'function') ? stackValue.dump() : stackValue; - let info =`\x1B[38;5;214m#${index} ${stackValue}`; - for (const operand of st[operandsProperty]) { - const operandInfo = this.dumpOperand(operand, index); - info = info + ' [\x1B[38;5;76m' + operandInfo +'\x1B[38;5;214m]'; - } - console.log(info+'\x1B[0m'); + this.dumpStackPos(stack[index], index, stackProperty, operandsProperty); + } + } + dumpStackPos(stackPos, index = false, stackProperty = 'op', operandsProperty = 'operands') { + const stackValue = stackPos[stackProperty]; + const operationInfo = (stackValue && typeof stackValue.dump === 'function') ? stackValue.dump() : stackValue; + let info =`\x1B[38;5;214m#${index === false?'':index} ${stackValue}`; + for (const operand of stackPos[operandsProperty]) { + const operandInfo = this.dumpOperand(operand, index); + info = info + ' [\x1B[38;5;76m' + operandInfo +'\x1B[38;5;214m]'; } + console.log(info+'\x1B[0m'); } dumpOperand(op, pos) { const cType = '\x1B[38;5;76m'; @@ -986,36 +979,7 @@ class Expression extends ExpressionItem { return op.dump({cType, cProp, cValue, pos}); } if (op === null) return 'null'; - - switch (op.type) { - case OP_VALUE: - return `${cType}VALUE ${cValue}${op.value}`; - case OP_ID_REF: - // refType, [offset], next - const next = op.next ? `${cProp}next:${cValue}${op.next}`:''; - return `${cType}ID_REF ${cProp}refType:${cValue}${op.refType} ${cProp}id:${cValue}${op.id}${next}`; - case OP_STACK: - return `${cType}STACK ${cProp}pos:${cValue}${pos - op.offset}[-${op.offset}]`; - case OP_RUNTIME: - let props = '' - for (const prop in op) { - if (prop === '__yystate' || prop === 'debug' || prop === 'type') continue; - props = props + ` ${cProp}${prop}:${cValue}${op[prop]}`; - } - return `${cType}RUNTIME${props}`; - } - return `\x1B[1;31m¿¿${op.constructor.name ?? op.type}??\x1B[0m`; - } - // TODO: cache of next - instanceNext(next) { - let _next = this.instance(); - } - updateOperandNext(op, next) { - assert(op.type != RUNTIME); - - if (op.type === OP_ID_REF) { - op.next += next; - } + EXIT_HERE; } toString(options) { let top = this.stack.length-1; @@ -1056,34 +1020,6 @@ class Expression extends ExpressionItem { return this.stackPosToString(pos-ope.offset, parentPrecedence, options); } return ope.toString(options); -/* - switch (ope.type) { - - case OP_VALUE: - return ope.value.toString(); - case OP_ID_REF: - // refType, [offset], next - let res = (Expression.parent && (!options || !options.hideLabel))? Expression.parent.getLabel(ope.refType, ope.id, options) : false; - if (!res) { - res = `${ope.refType}@${ope.id}`; - } - if (ope.next < 0) res = `${ope.next==-1?'':-ope.next}'${res}`; - if (ope.next > 0) res = `${res}'${ope.next==1?'':ope.next}`; - return res; - case OP_STACK: - if ((pos - ope.offset ) < 0) { - console.log(`invalid offset ${pos - ope.offset} pos:${pos} offset:${ope.offset}`); - } - return this.stackPosToString(pos-ope.offset, pprec, options); - case OP_RUNTIME: - if (ope.op === 'reference' && ope.name) { - return `RUNTIME{${ope.name}}` - } - return `RUNTIME{${ope.op}(${ope.name??''})}`; - //console.log(ope); - - }*/ - } resolve() { const res = this.eval(); diff --git a/src/expression_factory.js b/src/expression_factory.js index 54c0cf1..c299691 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -5,6 +5,7 @@ const {ReferenceItem, IntValue, StringValue, FunctionCall} = require("./expression_items.js"); const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); +const RowOffset = require('./expression_items/row_offset.js'); module.exports = class ExpressionFactory { // pre function to delete property op only used by routing @@ -21,9 +22,9 @@ module.exports = class ExpressionFactory { assert(obj.type !== 'object' && obj.type !== 'objects'); if (obj.dim === 0) delete obj.dim; - if (obj.next === 0 || obj.next === false) delete obj.next; console.log(obj); + const type = obj.type; let item = ExpressionFactory.router.go(obj); let unknownProperties = []; @@ -35,7 +36,10 @@ module.exports = class ExpressionFactory { if (unknownProperties.length > 0) { console.log(obj); - throw new Error(`Invalid properties: ${unknownProperties.join(',')} on ${obj.debug}`); + throw new Error(`Invalid properties: ${unknownProperties.join(',')} / ${type} on ${obj.debug}`); + } + if (type === 'row_offset') { + return item; } let expr = new Expression(); expr._set(item); @@ -49,12 +53,15 @@ module.exports = class ExpressionFactory { return expressions; } static fromReference(obj) { - let res = new ReferenceItem(obj.name, obj.indexes ?? [], (obj.next ?? 0) - (obj.prior ?? 0)); + if (obj.rowOffset) { + console.log('ROWOFFSET.FROMREFERENCE'); + console.log(obj.rowOffset); + } + let res = new ReferenceItem(obj.name, obj.indexes ?? [], obj.rowOffset); delete obj.name; delete obj.indexes; delete obj.dim; - delete obj.next; - delete obj.prior; + delete obj.rowOffset; return res; } static fromNumber(obj) { @@ -87,5 +94,17 @@ module.exports = class ExpressionFactory { console.log(res); return res; } + static fromRowOffset(obj) { + if (obj.current && obj.current.rowOffset) { + // TODO: ERROR more than rowOffset for same element. + EXIT_HERE; + } + let res = RowOffset.factory(obj.value, obj.prior ?? false); + delete obj.current; + delete obj.value; + delete obj.prior; + console.log(res); + return res; + } // TODO: positionalParams } diff --git a/src/expression_items/array_of.js b/src/expression_items/array_of.js index 1fd1823..f4004b6 100644 --- a/src/expression_items/array_of.js +++ b/src/expression_items/array_of.js @@ -9,7 +9,7 @@ module.exports = class ArrayOf extends RuntimeItem { this.rtype = type; this.instance = instance; } - clone() { + cloneInstance() { return new ArrayOf(this.baseCls, this.id, this.rtype, this. instance); } } diff --git a/src/expression_items/challenge.js b/src/expression_items/challenge.js index 526ed5c..2fe2659 100644 --- a/src/expression_items/challenge.js +++ b/src/expression_items/challenge.js @@ -3,7 +3,7 @@ module.exports = class Challenge extends ProofItem { constructor (id) { super(id); } - clone() { + cloneInstance() { return new Challenge(this.id); } } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index fb99e6d..735c6c1 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -60,11 +60,16 @@ class ExpressionItem { constructor(debug = {}) { this.debug = debug; this.indexes = false; + this.label = ''; this._ns_ = 'ExpressionItem'; } static registerClass(name, cls) { ExpressionItem[name] = cls; } + setLabel (label) { + console.log(['SETLABEL', label]); + this.label = label; + } get dim () { return Array.isArray(this.indexes) ? this.indexes.length : 0; } @@ -99,11 +104,9 @@ class ExpressionItem { getNext() { return this.next ?? 0; } - getNextStrings(options) { - const next = this.getNext(options); - const pre = next < 0 ? (next < -1 ? `${-next}'`:"'"):''; - const post = next > 0 ? (next > 1 ? `'${next}`:"'"):''; - return [pre,post]; + getRowOffsetStrings(options) { + if (!this.rowOffset) return ['','']; + return this.rowOffset.getStrings(); } static setManager(cls, manager) { console.log(['SET_MANAGER', cls.name]); @@ -123,9 +126,51 @@ class ExpressionItem { throw e; } } - eval(options = {}) { + get rowOffset() { + return this._rowOffset; + } + set rowOffset(value) { + if (!value.isZero()) console.log(['ROWOFFSET.SET', value]); + this._rowOffset = value; + } + clone() { + let cloned = this.cloneInstance(); + cloned.cloneUpdate(this); + return cloned; + } + cloneUpdate(source) { + if (source.indexes) { + this.indexes = source.indexes.map(index => (typeof index === 'object' && typeof index.clone === 'function') ? index.clone() : index); + } + if (source.label) { + this.label = source.label; + } + } + evalInside(options = {}) { throw new Error(`eval not defined for class ${this.constructor.name}`); } + evalPrior(options) { + if (!this.rowOffset || !this.rowOffset.isPriorRows()) { + return false; + } + console.log(['ROWOFFSET.EVALPRIOR', this.rowOffset.value]); + return this.rowOffset.value; + } + evalNext(options) { + if (!this.rowOffset || !this.rowOffset.isNextRows()) { + return false; + } + console.log(['ROWOFFSET.EVALNEXT', this.rowOffset.value]); + return this.rowOffset.value; + } + eval(options) { + let results = {}; + const _options = options ? {...options, results} : {results}; + results.prior = this.evalPrior(options); + results.inside = this.evalInside(options); + results.next = this.evalNext(options); + return results.final ? results.final : results.inside; + } } module.exports = ExpressionItem; \ No newline at end of file diff --git a/src/expression_items/fe_value.js b/src/expression_items/fe_value.js index 4d5d13a..8339f89 100644 --- a/src/expression_items/fe_value.js +++ b/src/expression_items/fe_value.js @@ -5,7 +5,7 @@ module.exports = class FeValue extends ValueItem { constructor (value = 0n) { super(value); } - clone() { + cloneInstance() { return new FeValue(this.value); } asInt() { diff --git a/src/expression_items/fixed_col.js b/src/expression_items/fixed_col.js index 93e5bbc..a43ddc3 100644 --- a/src/expression_items/fixed_col.js +++ b/src/expression_items/fixed_col.js @@ -37,17 +37,19 @@ module.exports = class FixedCol extends ProofItem { EXIT_HERE; } } - clone() { - let cloned = new FixedCol(this.id); - cloned.rows = this.rows; - cloned.values = [...this.values]; - cloned.fullFilled = this.fullFilled; - if (this.sequence) { - cloned.sequence = this.sequence.clone(); - } - return cloned; + cloneInstance() { + return new FixedCol(this.id); } - toString() { - return `FixedCol@${this.id}`; + cloneUpdate(source) { + super.cloneUpdate(source); + if (source.rowOffset) { + console.log('CLONE.ROWOFFSET'); + } + this.rows = source.rows; + this.values = [...source.values]; + this.fullFilled = source.fullFilled; + if (source.sequence) { + this.sequence = source.sequence.clone(); + } } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 28535a1..8f32b72 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -18,12 +18,14 @@ module.exports = class FunctionCall extends RuntimeItem { const args = '(' + this.args.map(x => x.toString()).join(',') +')'; return this.name + args + indexes; } - clone() { - let cloned = new FunctionCall(this.name, this.args, this.indexes); - cloned.funcdef = this.funcdef; - return cloned; + cloneInstance() { + return new FunctionCall(this.name, this.args, this.indexes); } - eval(options) { + cloneUpdate(source) { + super.cloneUpdate(source); + this.funcdef = source.funcdef; + } + evalInside(options) { const definition = Context.references.get(this.name, options); const res = Context.processor.executeFunctionCall(this.name, this); console.log(res); diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index 528cbc0..7549d2e 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -19,7 +19,7 @@ class IntValue extends ValueItem { assert(typeof value === 'bigint'); this.value = value; } - clone() { + cloneInstance() { return new IntValue(this.value); } static castTo(value) { diff --git a/src/expression_items/non_runtime_evaluable_item.js b/src/expression_items/non_runtime_evaluable_item.js index 84d2cef..652c688 100644 --- a/src/expression_items/non_runtime_evaluable_item.js +++ b/src/expression_items/non_runtime_evaluable_item.js @@ -10,7 +10,7 @@ class NonRuntimeEvaluableItem extends ExpressionItem { static get () { return NonRuntimeEvaluableItem._singletonInstance; } - clone() { + cloneInstance() { return NonRuntimeEvaluableItem._singletonInstance; } eval(options) { diff --git a/src/expression_items/param_item.js b/src/expression_items/param_item.js index cbf112a..6cb6d14 100644 --- a/src/expression_items/param_item.js +++ b/src/expression_items/param_item.js @@ -16,7 +16,7 @@ module.exports = class ParamItem extends RuntimeItem { dump(options) { return '$'+this.id; } - clone() { + cloneInstance() { return new ParamItem(this.id); } } diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 68d8ab8..36e23ac 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -13,7 +13,7 @@ module.exports = class ProofItem extends ExpressionItem { return manager.getLabel(this.id, options); } dump(options) { - const [pre,post] = this.getNextStrings(); + const [pre,post] = this.getRowOffsetStrings(); options = options ?? {}; const defaultType = options.type ? options.type : this.constructor.name; if (!options.label && !options.hideLabel && options.dumpToString) { @@ -28,5 +28,21 @@ module.exports = class ProofItem extends ExpressionItem { runtimeEvaluable() { return false; } + cloneUpdate(source) { + console.log(['PROOFITEM.CLONEUPDATE', source.rowOffset]); + super.cloneUpdate(source); + if (source.rowOffset) { + this.rowOffset = source.rowOffset.clone(); + } + } + toString(options) { + const [next, prior] = this.getRowOffsetStrings(); + console.log(['ROWOFFSET.TOSTRING', next, prior, this.label, this.constructor.name, this.rowOffset]); + let label = (options.hideClass ? '' : this.constructor.name + '::') + this.label; + if (options.hideLabel || !this.label) { + label = this.constructor.name + '@' + this.id; + } + return next + label + prior; + } } diff --git a/src/expression_items/proofval.js b/src/expression_items/proofval.js index 5f90c12..eb58939 100644 --- a/src/expression_items/proofval.js +++ b/src/expression_items/proofval.js @@ -4,7 +4,7 @@ module.exports = class Proofval extends ProofItem { constructor (id) { super(id); } - clone() { + cloneItem() { return new Proofval(this.id); } } diff --git a/src/expression_items/public.js b/src/expression_items/public.js index 52b84d1..8ffea27 100644 --- a/src/expression_items/public.js +++ b/src/expression_items/public.js @@ -6,7 +6,7 @@ module.exports = class Public extends ProofItem { getId() { return this.id; } - clone() { + cloneInstance() { return new Public(this.id); } } diff --git a/src/expression_items/publictable.js b/src/expression_items/publictable.js index 28b63f1..16621d9 100644 --- a/src/expression_items/publictable.js +++ b/src/expression_items/publictable.js @@ -6,7 +6,7 @@ module.exports = class PublicTable extends ProofItem { getId() { return this.id; } - clone() { + cloneInstance() { return new PublicTable(this.id); } } diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index 7c87ac9..401788c 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -1,22 +1,44 @@ const RuntimeItem = require("./runtime_item.js"); const Context = require('../context.js'); +const RowOffset = require('./row_offset.js'); module.exports = class ReferenceItem extends RuntimeItem { - constructor (name, indexes = [], next = 0) { + constructor (name, indexes = [], rowOffset) { super(); this.name = name; - this.indexes = [...indexes]; - this.next = Number(next ?? 0); + this.indexes = indexes.map(index => index.clone()); + // TODO: next as expression + this.rowOffset = RowOffset.factory(rowOffset); + console.log(['CONSTRUCTOR.REFERENCE '+this.name, this.rowOffset, this.indexes.length > 0 ? this.indexes[0].asInt():'']); + console.log(this.rowOffset); + } + set locator (value) { + throw new Error(`setting locator on reference ${this.name} ${this.indexes.length}`); } dump(options) { - const [pre,post] = this.getNextStrings(); - return `${pre}${this.name}${this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''}${post}`; + return 'ReferenceItem('+this.toString(options)+')'; + } + toString(options) { + const [pre,post] = this.getRowOffsetStrings(); + return `${pre}${this.name}${this.indexes.length > 0 ? '*['+this.indexes.join(',')+']':''}${post}`; } - clone() { - return new ReferenceItem(this.name, this.indexes, this.next); + cloneInstance() { + // console.log(JSON.stringify(this, (key, value) => typeof value === 'bigint' ? value.toString() : value)); + let cloned = new ReferenceItem(this.name, this.indexes, this.rowOffset); + // console.log(JSON.stringify(this, (key, value) => typeof value === 'bigint' ? value.toString() : value)); + // console.log(JSON.stringify(cloned, (key, value) => typeof value === 'bigint' ? value.toString() : value)); + return cloned; } - eval(options = {}) { + evalInside(options = {}) { + console.log('EVALINSIDE '+this.name); + console.log(this.rowOffset); console.log(this); + if (this.rowOffset.value) { + console.log('ROWOFFSET.EVALINSIDE'); + } const item = Context.references.getItem(this.name, this.indexes); + if (this.rowOffset && !this.rowOffset.isZero()) { + item.rowOffset = this.rowOffset.clone(); + } // TODO: next console.log(`REFERENCE ${this.name} [${this.indexes.join('][')}]`) console.log(item); diff --git a/src/expression_items/row_offset.js b/src/expression_items/row_offset.js new file mode 100644 index 0000000..4444c8f --- /dev/null +++ b/src/expression_items/row_offset.js @@ -0,0 +1,58 @@ +const {assert, assertLog} = require("../assert.js"); +class RowOffset { + static Zero; + constructor (index, prior = false) { + assert(typeof index.prior === 'undefined'); + this.index = (typeof index === 'object' && typeof index.clone === 'function') ? index.clone() : index; + assert(typeof prior === 'boolean'); + this.prior = prior; + } + get value() { + if (typeof this.index === 'number') { + return this.prior ? -this.index : this.index; + } + console.log(this.index); + EXIT_HERE; + if (this.index instanceof Expression) { + + } + } + static factory(index, prior = false) { + if (typeof index === 'undefined') { + return RowOffset.Zero; + } + if (index instanceof RowOffset) { + return index.clone(); + } + console.log(['ROWOFFSET !!!!!', index, prior]); + assert(typeof index.prior === 'undefined'); + return new RowOffset(index, prior); + } + isPriorRows() { + return this.prior && this.value !== 0; + } + isNextRows() { + return !this.prior && this.value !== 0; + } + isZero() { + return this.value == 0; + } + clone() { + return this.cloneInstance(); + } + cloneInstance () { + return new RowOffset(this.index, this.prior); + } + getStrings() { + const value = this.value; + if (!value) return ['','']; + const res = [this.prior ? `${value < -1 ? -value : ''}'`: '', this.prior ? '' : `'${value > 1 ? value : ''}`]; + console.log(['ROWOFFSET.GETSTRINGS', res]); + return res; + } +} + +RowOffset.Zero = new RowOffset(0, false); +Object.freeze(RowOffset.Zero); + +module.exports = RowOffset; \ No newline at end of file diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js index 93a0b66..d30a556 100644 --- a/src/expression_items/stack_item.js +++ b/src/expression_items/stack_item.js @@ -15,7 +15,7 @@ module.exports = class StackItem extends ExpressionItem { getAbsolutePos(currentPos) { return currentPos - this.offset; } - clone() { + cloneInstance() { return new StackItem(this.offset); } dump(options) { diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index 8828b6a..da64656 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -26,7 +26,7 @@ class StringValue extends RuntimeItem { asStringItem() { return this.clone(); } - clone() { + cloneInstance() { return new StringValue(this.value); } operatorEq(valueB) { diff --git a/src/expression_items/subproofval.js b/src/expression_items/subproofval.js index 838decf..4fd2bf8 100644 --- a/src/expression_items/subproofval.js +++ b/src/expression_items/subproofval.js @@ -3,7 +3,7 @@ module.exports = class Subproofval extends ProofItem { constructor (id, stage) { super(id, stage); } - clone() { + cloneInstance() { return new Subproofval(this.id, this.stage); } } diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index 556b9ef..ec94875 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -17,8 +17,10 @@ module.exports = class ValueItem extends ExpressionItem { dump() { return `${this.constructor.name}(${this.value})`; } - clone() { - return new ValueItem(this.value); + cloneInstance() { + const cloned = new ValueItem(this.value); + cloned.clonenNonConstructorProperties(this); + } asString() { return this.value.toString(); diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index 4a5d7e6..ff36d13 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,17 +1,13 @@ const ProofItem = require("./proof_item.js"); const {assert, assertLog} = require('../assert.js'); +const Context = require('../context.js'); module.exports = class WitnessCol extends ProofItem { constructor (id) { assertLog(typeof id !== 'undefined', id); super(id); console.log('CONSTRUCTOR_WITNESS', id, this.id); } - clone() { - let cloned = new WitnessCol(this.id); - console.log('CLONE_WITNESS:', this, cloned); - return cloned; - } - toString() { - return `WitnessCol@${this.id}`; + cloneInstance() { + return new WitnessCol(this.id); } } diff --git a/src/indexable.js b/src/indexable.js index 4e9e6a1..7dc777e 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -117,7 +117,7 @@ module.exports = class Indexable { } set(id, value) { const item = this.get(id); - assertLog(item !== null && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, item: item}); + assertLog(item !== null && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); item.setValue(value); /* if (typeof this.cls === 'function') { diff --git a/src/pil_parser.jison b/src/pil_parser.jison index 019011e..59c9fd3 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -61,6 +61,7 @@ return { return 'RETURN' } first { return 'FIRST' } last { return 'LAST' } frame { return 'FRAME' } +debugger { return 'DEBUGGER' } \.\.\+\.\. { return 'DOTS_ARITH_SEQ' } \.\.\*\.\. { return 'DOTS_GEOM_SEQ' } @@ -253,6 +254,8 @@ top_level_block | variable_declaration { $$ = $1 } + | DEBUGGER + { $$ = { type: 'debugger' }} ; use_directive @@ -633,13 +636,13 @@ data_object { $$ = $1; $$.data[$3] = $5 } | data_object ',' IDENTIFIER - { $$ = $1; $$.data[$3] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $3 }) } + { $$ = $1; $$.data[$3] = ExpressionFactory.fromObject({type: 'reference', name: $3 }) } | IDENTIFIER ':' data_value { $$ = { type: 'object', data: {}}; $$.data[$1] = $3 } | IDENTIFIER - { $$ = {data: {}}; $$.data[$1] = ExpressionFactory.fromObject({type: 'reference', next: false, name: $1 }) } + { $$ = {data: {}}; $$.data[$1] = ExpressionFactory.fromObject({type: 'reference', name: $1 }) } ; data_array @@ -734,6 +737,9 @@ codeblock_closed | IF '(' expression ')' non_delimited_statement ELSE non_delimited_statement { $$ = { type:'if', conditions: [{type: 'if', expression: $3, statements: $5 }, {type: 'else', statements: $7}]} } + + | DEBUGGER + { $$ = { type: 'debugger' }} ; case_body @@ -1302,19 +1308,19 @@ expression { $$ = $2.insert('neg') } | name_id - { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$1 }) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', ...$1 }) } | INC name_id - { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$2, inc: 'pre'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', ...$2, inc: 'pre'}) } | DEC name_id - { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$2, dec: 'pre'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', ...$2, dec: 'pre'}) } | name_id INC %prec INC_LEFT - { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$1, inc: 'post'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', ...$1, inc: 'post'}) } | name_id DEC %prec DEC_LEFT - { $$ = ExpressionFactory.fromObject({ type: 'reference', next: false, ...$1, dec: 'post'}) } + { $$ = ExpressionFactory.fromObject({ type: 'reference', ...$1, dec: 'post'}) } | NUMBER %prec EMPTY { $$ = ExpressionFactory.fromObject({ type: 'number', value: BigInt($1)}) } @@ -1372,28 +1378,30 @@ casting name_id : name_optional_index "'" %prec NEXT - { $$ = { ...$1, next:1 } } + { $$ = { ...$1, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: 1, current: $1 }) } } | name_optional_index "'" NUMBER - { $$ = { ...$1, next: Number($3) } } + { $$ = { ...$1, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: Number($3), current: $1 }) } } | name_optional_index "'" '(' expression ')' - { $$ = { ...$1, next:$4 } } + { $$ = { ...$1, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: $4, current: $1 }) } } | name_optional_index "'" POSITIONAL_PARAM - { $$ = { ...$1, next: ExpressionFactory.fromObject({position: $3, type: 'positional_param'}) } } + { $$ = { ...$1, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', current: $1, + value: ExpressionFactory.fromObject({position: $3, type: 'positional_param'})}) } } | "'" name_optional_index %prec LOWER_PREC - { $$ = { ...$2, prior:1 } } + { $$ = { ...$2, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: 1, prior: true, current: $2 }) } } | NUMBER "'" name_optional_index - { $$ = { ...$3, prior: Number($1) } } + { $$ = { ...$3, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: Number($1), prior: true, current: $3 }) } } | '(' expression ')' "'" name_optional_index - { $$ = { ...$5, prior:$2 } } + { $$ = { ...$5, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: $2, prior: true, current: $5 }) } } | POSITIONAL_PARAM "'" name_optional_index - { $$ = { ...$3, prior: ExpressionFactory.fromObject({position: $1, type: 'positional_param'}) } } + { $$ = { ...$3, rowOffset: ExpressionFactory.fromObject({type: 'row_offset', current: $3, prior: true, + value: ExpressionFactory.fromObject({position: $1, type: 'positional_param'})}) } } | name_optional_index %prec EMPTY { $$ = $1 } diff --git a/src/processor.js b/src/processor.js index 62c2d8b..f812c35 100644 --- a/src/processor.js +++ b/src/processor.js @@ -52,19 +52,19 @@ module.exports = class Processor { this.airId = 0; this.subproofId = 0; - this.ints = new Variables('int', DefinitionItems.IntValue, ExpressionItems.IntValue); + this.ints = new Variables('int', DefinitionItems.IntVariable, ExpressionItems.IntValue); this.references.register('int', this.ints); - this.fes = new Variables('fe', DefinitionItems.FeValue, ExpressionItems.FeValue); + this.fes = new Variables('fe', DefinitionItems.FeVariable, ExpressionItems.FeValue); this.references.register('fe', this.fes); - this.strings = new Variables('string', DefinitionItems.StringValue, ExpressionItems.StringValue); + this.strings = new Variables('string', DefinitionItems.StringVariable, ExpressionItems.StringValue); this.references.register('string', this.strings); - this.exprs = new Variables('expr', DefinitionItems.Expression, Expression); + this.exprs = new Variables('expr', DefinitionItems.ExpressionVariable, Expression); this.references.register('expr', this.exprs); - this.subexprs = new Variables('subexpr', DefinitionItems.Expression, Expression); + this.subexprs = new Variables('subexpr', DefinitionItems.ExpressionVariable, Expression); this.references.register('subexpr', this.subexprs); // this.lexprs = new Variables('lexpr', Expression); @@ -661,6 +661,10 @@ module.exports = class Processor { this.references.set('BITS', [], air.bits); this.references.set('__SUBPROOF__', [], subproofName); +/* this.references.set('N', [], new ExpressionItems.IntValue(air.rows)); + this.references.set('BITS', [], new ExpressionItems.IntValue(air.bits)); + this.references.set('__SUBPROOF__', [], new ExpressionItems.StringValue(subproofName));*/ + this.context.push(false, subproofName); this.scope.pushInstanceType('air'); subproof.airStart(); @@ -733,6 +737,9 @@ module.exports = class Processor { this.declareFullReference(colname, 'fixed', lengths, {global}, seq); } } + execDebugger(s) { + debugger; + } execColDeclaration(s) { // intermediate column const global = s.global ?? false; @@ -869,12 +876,10 @@ module.exports = class Processor { assertLog(s.left instanceof Expression, s.left); assertLog(s.right instanceof Expression, s.right); - console.log(s.left); - console.log(s.right); + console.log('############# CONSTRAINT-LEFT ##################'); + console.log(util.inspect(s.left, false, 12, true)); const left = s.left.instance(); - console.log(left); const right = s.right.instance(); - console.log(right); if (scopeType === 'air') { id = this.constraints.define(s.left.instance(true), s.right.instance(true),false,this.sourceRef); expr = this.constraints.getExpr(id); @@ -919,7 +924,8 @@ module.exports = class Processor { case 'expr': // s.init[index].expr.dump('INIT1 '+name); console.log(s.init[index]); - initValue = s.init[index].eval(); + // initValue = s.init[index].eval(); + initValue = s.init[index].instance(); console.log(initValue); // initValue.dump('INIT2 '+name); break; diff --git a/src/reference.js b/src/reference.js index e1290e5..77326e1 100644 --- a/src/reference.js +++ b/src/reference.js @@ -38,6 +38,7 @@ class Reference { set (value, indexes = []) { assert(value !== null); // to detect obsolete legacy uses const id = this.getId(indexes); + assert(id !== null); this.instance.set(id, value); } static getArrayAndSize(lengths) { @@ -52,15 +53,22 @@ class Reference { return this.instance.get(this.getId(indexes)); } getItem(indexes, options = {}) { - console.log(indexes); + console.log(['GETITEM', indexes, options]); let locator = this.locator; + let label = options.label; if (Array.isArray(indexes) && indexes.length > 0) { const evaluatedIndexes = indexes.map(x => x.asInt()); - console.log(evaluatedIndexes); + if (label) label = label + '['+evaluatedIndexes.join('],[')+']'; locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } console.log(locator); const res = this.instance.getItem(locator); + if (locator == 0 && res.constructor.name == 'WitnessCol' && !label) { + EXIT_HERE; + } + if (label) res.setLabel(label); + else res.setLabel('___'); + console.log(res); return res; } diff --git a/src/references.js b/src/references.js index f079f10..ee98ea3 100644 --- a/src/references.js +++ b/src/references.js @@ -242,11 +242,8 @@ module.exports = class References { indexes = indexes ?? []; options = options ?? {}; - console.log(name); const reference = this.getReference(name); - console.log(reference); - console.log(indexes); - const item = reference.getItem(indexes); + const item = reference.getItem(indexes, {label: name}); console.log(item); diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil index 6dcb137..dbfcfe7 100644 --- a/test/pil2/collection/expressions.pil +++ b/test/pil2/collection/expressions.pil @@ -1,8 +1,15 @@ subproof ExpressionTest(2**16) { - col witness x[4],y; + col witness x[4],z; + col fixed Y[100]; + expr a = 5 * Y[99]; + a = a + 100; + a = a + 200; + a === 0; + 5 * Y[99]' + x[1] + 2 * x[0] + 3 * x[2] + 18 * z === x[1]; + /* expr ex = x[0] + 2 * x[1] + 4 * x[2] + 2 ** 3 * x[3]; - x[0] + 2 * x[1] + 3 * x[2] + 5 * y === 0; + ex === 0; int k = 10; @@ -23,5 +30,5 @@ subproof ExpressionTest(2**16) { dump(a); s = s + "hello"; s = s + k; - s = s + a; + s = s + a;*/ } \ No newline at end of file From 8f6c89a30b195a175f528b3fb3041411208de3be Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 3 Oct 2023 00:11:39 +0200 Subject: [PATCH 15/33] WIP const expressions and integers --- src/assign.js | 8 +- src/definition_items/expression_variable.js | 1 + src/expression.js | 89 ++++++++++++-------- src/expression_items/expression_item.js | 3 + src/expression_items/expression_reference.js | 5 ++ src/expression_items/proof_item.js | 2 +- src/expression_items/reference_item.js | 3 +- src/expression_operator_methods.js | 3 + src/expression_variables.js | 13 +++ src/indexable.js | 4 + src/processor.js | 26 ++++-- src/reference.js | 41 +++++++-- src/references.js | 18 ++-- src/sequence.js | 7 +- src/values.js | 3 + test/pil2/collection/expressions.pil | 16 +++- 16 files changed, 178 insertions(+), 64 deletions(-) create mode 100644 src/expression_variables.js diff --git a/src/assign.js b/src/assign.js index 9170df4..f7ce3ee 100644 --- a/src/assign.js +++ b/src/assign.js @@ -1,19 +1,21 @@ const Expression = require("./expression.js"); const Context = require('./context.js'); const {assert, assertLog} = require('./assert.js'); +const NonRuntimeEvaluableItem = require('./expression_items/non_runtime_evaluable_item.js'); module.exports = class Assign { constructor () { } - assign (name, indexes, value) { + console.log(value); value = this.getValue(value); + console.log(value); assert(value !== null); return this.#assign(name, indexes, value); } getValue(value) { const _value = value.eval(); - if (typeof _value !== 'undefined' && _value !== null) { + if (typeof _value !== 'undefined' && _value !== null && (_value instanceof NonRuntimeEvaluableItem) === false) { return _value; } return value; @@ -25,7 +27,7 @@ module.exports = class Assign { // array asignation as array or subarray copy return this.assignArray(name, indexes, value, array); } - + console.log(value); return Context.references.set(name, indexes, value); } assignType(type, name, indexes, value) { diff --git a/src/definition_items/expression_variable.js b/src/definition_items/expression_variable.js index 1f5d753..94542d2 100644 --- a/src/definition_items/expression_variable.js +++ b/src/definition_items/expression_variable.js @@ -11,6 +11,7 @@ module.exports = class ExpressionVariable extends Variable { this.value = value.clone(); return; } + console.log(this); console.log(value); this.value._set(value); this.value.dump('setValue'); diff --git a/src/expression.js b/src/expression.js index 6fe354a..4a5d04b 100644 --- a/src/expression.js +++ b/src/expression.js @@ -99,9 +99,11 @@ class Expression extends ExpressionItem { this.stack[index + delta] = this.stack[index]; } for (let index = 0; index < delta; ++index) { - this.stack[index + stackIndex] = expressionToInsert.stack[index].clone(); + console.log(index); + console.log(expressionToInsert.stack[index]); + this.stack[index + stackIndex] = this.cloneStackPos(expressionToInsert.stack[index]); } - this.fixedRowAccess = this.fixedRowAccess || e.fixedRowAccess; + this.fixedRowAccess = this.fixedRowAccess || expressionToInsert.fixedRowAccess; return 1; } cloneAlone() { @@ -382,19 +384,15 @@ class Expression extends ExpressionItem { // in stackResults[pos][1] contains a results array of this stack position operands instance() { console.log(Context.sourceRef); - if (Context.sourceRef === 'expressions.pil:5:4:5:12') { -// EXIT_HERE; - } this.dump("#############"); let cloned = this.clone(); const options = {instance: true} let stackResults = cloned.evaluateOperands(options); // cloned.extendExpressions(options); cloned.evaluateFullStack(stackResults, options); - cloned.dump(); - console.log('SIMPLIFY'); + cloned.dump('PRE-SIMPLIFY'); cloned.simplify(); - cloned.dump("#############"); + cloned.dump('POST-SIMPLIFY'); // console.log(stackResults); // cloned.dumpStackResults(stackResults, ''); return cloned; @@ -533,9 +531,16 @@ class Expression extends ExpressionItem { if (typeof values[1][casting] === 'function') { const method = this.operatorToMethod(operation); methods.push(`${types[0]}.${method}`); - const [executed, result] = this.applyOperatorMethod(method, [values[0], values[1][casting]()]); - if (executed) { - return result; + try { + const [executed, result] = this.applyOperatorMethod(method, [values[0], values[1][casting]()]); + if (executed) { + return result; + } + } + catch (e) { + if (e instanceof Exceptions.CannotBeCastToType === false) { + throw e; + } } if (onlyOneLoop) { break; @@ -676,8 +681,16 @@ class Expression extends ExpressionItem { const result = operand.eval(options); if (options.instance && result !== null) { - console.log (result); - st.operands[operandIndex] = assertExpressionItem(result); + if (result instanceof Expression) { + this.dump('THIS BEFORE INSERTSTACK'); + result.dump('RESULT BEFORE INSERTSTACK'); + const stackOffset = this.insertStack(result.instance(), stpos); + console.log(stackOffset); + st.operands[operandIndex] = new ExpressionItems.StackItem(stackOffset); + this.dump('THIS AFTER INSERTSTACK'); + } else { + st.operands[operandIndex] = assertExpressionItem(result); + } } } } @@ -948,23 +961,33 @@ class Expression extends ExpressionItem { } return caller; } + static dumpScope = null; dump(title) { - return this.dumpStack(`DUMP (${title ?? ''})`, this.stack); + const previousDumpScope = Expression.dumpScope; + Expression.dumpScope = Expression.dumpScope === null ? '' : Expression.dumpScope + ' '; + const res = this.dumpStack(`DUMP (${title ?? ''})`, this.stack); + Expression.dumpScope = previousDumpScope; + return res; + } + dumpItem(options) { + return 'Expression('+this.toString(options)+')'; } dumpStackResults(stackResults, title = '') { - return this.dumpStack(`STACK RESULTS (${title ?? ''})`, stackResults, 0, 1); + return this.dumpStack(`STACK RESULTS (${title ?? ''})`, stackResults, {stackProperty: 0, operandsProperty: 1}); } - dumpStack(title, stack, stackProperty = 'op', operandsProperty = 'operands') { + dumpStack(title, stack, options = {} ) { title = title + ' ' + this.getCaller(); - console.log(`\x1B[38;5;214m|==========> ${title} <==========|\x1B[0m`); + console.log((Expression.dumpScope ?? '') + `\x1B[38;5;214m|==========> ${title} <==========|\x1B[0m`); for (let index = stack.length-1; index >=0; --index) { - this.dumpStackPos(stack[index], index, stackProperty, operandsProperty); + this.dumpStackPos(stack[index], index, options); } } - dumpStackPos(stackPos, index = false, stackProperty = 'op', operandsProperty = 'operands') { + dumpStackPos(stackPos, index = false, options = {}) { + const stackProperty = options.stackProperty ?? 'op'; + const operandsProperty = options.operandsProperty ?? 'operands'; const stackValue = stackPos[stackProperty]; const operationInfo = (stackValue && typeof stackValue.dump === 'function') ? stackValue.dump() : stackValue; - let info =`\x1B[38;5;214m#${index === false?'':index} ${stackValue}`; + let info = (Expression.dumpScope ?? '') + `\x1B[38;5;214m#${index === false?'':index} ${stackValue}`; for (const operand of stackPos[operandsProperty]) { const operandInfo = this.dumpOperand(operand, index); info = info + ' [\x1B[38;5;76m' + operandInfo +'\x1B[38;5;214m]'; @@ -975,8 +998,9 @@ class Expression extends ExpressionItem { const cType = '\x1B[38;5;76m'; const cProp = '\x1B[38;5;250m'; const cValue = '\x1B[38;5;40m'; + const options = {cType, cProp, cValue, pos}; if (op instanceof ExpressionItem) { - return op.dump({cType, cProp, cValue, pos}); + return op.dumpItem(options); } if (op === null) return 'null'; EXIT_HERE; @@ -989,35 +1013,36 @@ class Expression extends ExpressionItem { const res = this.stackPosToString(top ,0, {...options, dumpToString: true}); return res; } - stackPosToString(pos, parentPrecedence, options) { + stackPosToString(pos, parentOperation, options) { const st = this.stack[pos]; if (typeof st === 'undefined') { console.log(pos); console.log(this.stack); } + const parentPrecedence = ExpressionOperationsInfo.get(parentOperation).precedence; if (st.op === false) { - return this.operandToString(st.operands[0], pos, parentPrecedence, options); + return this.operandToString(st.operands[0], pos, st.op, options); } const operationInfo = ExpressionOperationsInfo.get(st.op); const operationLabel = operationInfo.label; let res; if (st.operands.length === 1) { - res = operationLabel + this.operandToString(st.operands[0], pos, operationInfo.precedence, options); + res = operationLabel + this.operandToString(st.operands[0], pos, st.op, options); } else if (st.operands.length === 2) { - res = this.operandToString(st.operands[0], pos, operationInfo.precedence, options) + ' ' + operationLabel + ' ' + - this.operandToString(st.operands[1], pos, operationInfo.precedence, options); + res = this.operandToString(st.operands[0], pos, st.op, options) + ' ' + operationLabel + ' ' + + this.operandToString(st.operands[1], pos, st.op, options); } else { TODO_EXIT } - if (parentPrecedence > operationInfo.precedence) { + if (parentPrecedence > operationInfo.precedence || parentOperation === 'sub') { res = '(' + res + ')'; } return res; } - operandToString(ope, pos, parentPrecedence, options) { + operandToString(ope, pos, parentOperation, options) { if (ope instanceof ExpressionItems.StackItem) { - return this.stackPosToString(pos-ope.offset, parentPrecedence, options); + return this.stackPosToString(pos-ope.offset, parentOperation, options); } return ope.toString(options); } @@ -1068,12 +1093,6 @@ class Expression extends ExpressionItem { getValue() { return this.eval(); } - operatorAddExpressionIntValue(valueA, valueB) { - EXIT_HERE; - } - operatorAdd(valueA, valueB) { - EXIT_HERE; - } hasRuntimes() { return this.stack.some(stackPos => stackPos.operands.some(operand => operand.isRuntime())); } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 735c6c1..7f77999 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -97,6 +97,9 @@ class ExpressionItem { dump(options) { return this.toString(options); } + dumpItem(options) { + return this.dump(options); + } get type() { console.log(this); throw new Error(`FATAL: use type obsolete-property`) diff --git a/src/expression_items/expression_reference.js b/src/expression_items/expression_reference.js index 6651b7c..17a8da0 100644 --- a/src/expression_items/expression_reference.js +++ b/src/expression_items/expression_reference.js @@ -1,3 +1,8 @@ const RuntimeItem = require("./runtime_item.js"); module.exports = class ExpressionReference extends RuntimeItem { + constructor (id, value, debug = {}) { + super(debug); + this.id = id; + this.value = value; + } } diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 36e23ac..64c74a9 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -37,7 +37,7 @@ module.exports = class ProofItem extends ExpressionItem { } toString(options) { const [next, prior] = this.getRowOffsetStrings(); - console.log(['ROWOFFSET.TOSTRING', next, prior, this.label, this.constructor.name, this.rowOffset]); + // console.log(['ROWOFFSET.TOSTRING', next, prior, this.label, this.constructor.name, this.rowOffset]); let label = (options.hideClass ? '' : this.constructor.name + '::') + this.label; if (options.hideLabel || !this.label) { label = this.constructor.name + '@' + this.id; diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index 401788c..c7b2393 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -1,6 +1,7 @@ const RuntimeItem = require("./runtime_item.js"); const Context = require('../context.js'); const RowOffset = require('./row_offset.js'); +const ExpressionItem = require('./expression_item.js'); module.exports = class ReferenceItem extends RuntimeItem { constructor (name, indexes = [], rowOffset) { super(); @@ -29,7 +30,7 @@ module.exports = class ReferenceItem extends RuntimeItem { return cloned; } evalInside(options = {}) { - console.log('EVALINSIDE '+this.name); + console.log(['EVALINSIDE '+this.name, options]); console.log(this.rowOffset); console.log(this); if (this.rowOffset.value) { diff --git a/src/expression_operator_methods.js b/src/expression_operator_methods.js index f6d299e..0031c8a 100644 --- a/src/expression_operator_methods.js +++ b/src/expression_operator_methods.js @@ -23,6 +23,9 @@ module.exports = class ExpressionOperatorMethods { static operatorMul(valueA, valueB) { return this.#do('mul', valueA, valueB); } + static operatorSub(valueA, valueB) { + return this.#do('sub', valueA, valueB); + } static operatorEqIntValue(valueA, valueB) { let res = valueA.eval(); return new ExpressionItem.IntValue(res.asInt() === valueB.asInt() ? 1n : 0n); diff --git a/src/expression_variables.js b/src/expression_variables.js new file mode 100644 index 0000000..aa661a8 --- /dev/null +++ b/src/expression_variables.js @@ -0,0 +1,13 @@ +const {assert, assertLog} = require('./assert.js'); +const Variables = require("./variables.js"); +const ExpressionReference = require('./expression_items/expression_reference.js'); + +module.exports = class ExpressionVariables extends Variables { + + constructor (type, definitionClass, expressionItemClass, options) { + super(type, definitionClass, expressionItemClass, options); + } + getConstItem(id, properties) { + return new ExpressionReference(id, this.getItem(id, properties)); + } +} \ No newline at end of file diff --git a/src/indexable.js b/src/indexable.js index 7dc777e..e4289e2 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -75,6 +75,10 @@ module.exports = class Indexable { } return res; } + getConstItem(id, properties) { + // by default getConstItem return same as getItem but with property const = true. + return this.getItem(id, {...properties, const: true}); + } // get expression item to add in a expression getItem(id, properties) { let res = this.values[id]; diff --git a/src/processor.js b/src/processor.js index f812c35..47e14d3 100644 --- a/src/processor.js +++ b/src/processor.js @@ -64,9 +64,6 @@ module.exports = class Processor { this.exprs = new Variables('expr', DefinitionItems.ExpressionVariable, Expression); this.references.register('expr', this.exprs); - this.subexprs = new Variables('subexpr', DefinitionItems.ExpressionVariable, Expression); - this.references.register('subexpr', this.subexprs); - // this.lexprs = new Variables('lexpr', Expression); // this.references.register('lexpr', this.lexprs); @@ -331,6 +328,17 @@ module.exports = class Processor { const indexes = this.decodeIndexes(st.name.indexes) const names = this.context.getNames(st.name.name); console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> EXEC-ASSIGN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'); + if (st.value.type === 'sequence') { + const sequence = new Sequence(this, st.value, ExpressionItems.IntValue.castTo(this.references.get('N'))); + sequence.extend(); + console.log(sequence.size); + console.log(sequence.toString()); + EXIT_HERE; + } + console.log(st.value); + st.value.dump('@@@@@@@@@@@@@@@@@@'); + const expr2 = st.value.instance(); + expr2.dump('@^^@------/'); if (st.name.reference) { assert(indexes.length === 0); const assignedValue = st.value.instance(); @@ -876,10 +884,9 @@ module.exports = class Processor { assertLog(s.left instanceof Expression, s.left); assertLog(s.right instanceof Expression, s.right); - console.log('############# CONSTRAINT-LEFT ##################'); - console.log(util.inspect(s.left, false, 12, true)); const left = s.left.instance(); const right = s.right.instance(); + left.dump(); if (scopeType === 'air') { id = this.constraints.define(s.left.instance(true), s.right.instance(true),false,this.sourceRef); expr = this.constraints.getExpr(id); @@ -892,7 +899,6 @@ module.exports = class Processor { } console.log(`\x1B[1;36;44m${prefix}CONSTRAINT > ${expr.toString({hideClass:true, hideLabel:false})} === 0 (${this.sourceRef})\x1B[0m`); console.log(`\x1B[1;36;44m${prefix}CONSTRAINT (RAW)> ${expr.toString({hideClass:true, hideLabel:true})} === 0 (${this.sourceRef})\x1B[0m`); - EXIT_HERE; } execVariableIncrement(s) { // REVIEW used only inside loop (increment) in other cases was an expression @@ -904,6 +910,7 @@ module.exports = class Processor { } execVariableDeclaration(s) { console.log('VARIABLE DECLARATION '+this.context.sourceRef+' init:'+s.init); + console.log(s); const init = typeof s.init !== 'undefined'; // console.log(s); const count = s.items.length; @@ -920,6 +927,11 @@ module.exports = class Processor { let initValue = null; if (init) { console.log([name, s.vtype, Context.sourceRef]); + if (s.init[index] instanceof Expression) { + s.init[index].dump(`+++++++ INIT VARIABLE ${name} ++++++++++`); + const expr2 = s.init[index].instance(); + expr2.dump(`+++++++ INIT VARIABLE INSTANCED ${name} ++++++++++`); + } switch (s.vtype) { case 'expr': // s.init[index].expr.dump('INIT1 '+name); @@ -939,7 +951,7 @@ module.exports = class Processor { } } console.log(initValue); - this.references.declare(name, s.vtype, lengths, { scope, sourceRef }, initValue); + this.references.declare(name, s.vtype, lengths, { scope, sourceRef, const: s.const ?? false }, initValue); // if (initValue !== null) this.references.set(name, [], initValue); } } diff --git a/src/reference.js b/src/reference.js index 77326e1..240aed2 100644 --- a/src/reference.js +++ b/src/reference.js @@ -16,8 +16,10 @@ class Reference { this.locator = id; this.scopeId = scopeId; this.instance = instance; + this.initialized = false; for (const property in properties) { assert(typeof this[property] === 'undefined'); + if (property === 'const') console.log(['CONST ********', properties[property]]); this[property] = properties[property]; } } @@ -28,18 +30,46 @@ class Reference { if (!this.array) return false; return this.array.isValidIndexes(indexes); } - + markAsInitialized(indexes = []) { + if (indexes.length === 0 || !this.array) { + assert(this.initialized === false); + this.initialized = true; + } + else { + this.array.markAsInitialized(indexes); + } + } + isInitialized(indexes = []) { + return (indexes.length === 0 || !this.array) ? this.initialized : this.array.isInitialized(indexes); + } getId(indexes = []) { return (indexes.length === 0 || !this.array) ? this.locator : this.array.getIndexesOffset(indexes); } - init (value, indexes = []) { - return this.set(value, indexes); - } set (value, indexes = []) { assert(value !== null); // to detect obsolete legacy uses + if (!this.isInitialized(indexes)) { + return this.#doInit(value, indexes); + } + const id = this.getId(indexes); + if (this.const) { + // TODO: more info + throw new Error('setting a const element'); + } + this.instance.set(id, value); + } + #doInit(value, indexes) { const id = this.getId(indexes); assert(id !== null); this.instance.set(id, value); + this.markAsInitialized(indexes); + } + init (value, indexes = []) { + assert(value !== null); // to detect obsolete legacy uses + if (this.isInitialized(indexes)) { + // TODO: more info + throw new Error('value initialized'); + } + this.#doInit(value, indexes); } static getArrayAndSize(lengths) { // TODO: dynamic arrays, call to factory, who decides? @@ -62,7 +92,8 @@ class Reference { locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } console.log(locator); - const res = this.instance.getItem(locator); + const res = options.const ? this.instance.getItem(locator, options) : this.instance.getConstItem(locator, options); + console.log(['GETITEM', res.constructor.name, res.definition, this.const]); if (locator == 0 && res.constructor.name == 'WitnessCol' && !label) { EXIT_HERE; } diff --git a/src/references.js b/src/references.js index ee98ea3..de5563d 100644 --- a/src/references.js +++ b/src/references.js @@ -158,14 +158,14 @@ module.exports = class References { } return [scopeId, false]; } - declare (name, type, lengths = [], data = null, initValue = null) { + declare (name, type, lengths = [], options = null, initValue = null) { assert(typeof name === 'string'); assert(!name.includes('::object')); assert(!name.includes('.object')); const nameInfo = this.decodeName(name); - console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}`, data); + console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}`, options); let [array, size] = Reference.getArrayAndSize(lengths); @@ -188,11 +188,19 @@ module.exports = class References { const instance = this.getTypeInstance(finalType); + /* take constant property from options, the rest is data information */ + const constProperty = options.const ?? false; + console.log(['CONST ', constProperty, name]); + let data = {...options}; + delete data.const; + + const refProperties = {container, scope, isStatic: nameInfo.isStatic, data, const: constProperty}; + + // TODO: reserve need array for labels? const id = isReference ? null : instance.reserve(size, nameInfo.name, array, data); - const reference = new Reference(nameInfo.name, type, isReference, array, id, instance, scopeId, - {container, scope, isStatic: nameInfo.isStatic, data}); + const reference = new Reference(nameInfo.name, type, isReference, array, id, instance, scopeId, refProperties); console.log(container, reference); if (container) { @@ -243,7 +251,7 @@ module.exports = class References { options = options ?? {}; const reference = this.getReference(name); - const item = reference.getItem(indexes, {label: name}); + const item = reference.getItem(indexes, {...options, label: name}); console.log(item); diff --git a/src/sequence.js b/src/sequence.js index 824a16c..b02af37 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -382,7 +382,7 @@ module.exports = class Sequence { // console.log('SETTING POST COUNT '+count); } return count; - } + }seq e2num(e) { if (typeof e === 'bigint' || typeof e === 'number') { return e; @@ -402,11 +402,12 @@ module.exports = class Sequence { return {type: vdata.type, value: vdata.values[offset] }; } */ toString() { - return this.values.join(','); + return this.#values.toString(); } toNumber(value) { + console.log(value); let nvalue = Number(value); - if (nvalue === NaN || !isNaN(value)) { + if (nvalue === NaN || isNaN(nvalue)) { throw new Error(`Invalid number ${value}`); } return nvalue; diff --git a/src/values.js b/src/values.js index 3bf5323..c7e7d77 100644 --- a/src/values.js +++ b/src/values.js @@ -46,4 +46,7 @@ module.exports = class Values { getValue(irow) { return this.#values[irow]; } + toString() { + return this.#values.join(); + } } diff --git a/test/pil2/collection/expressions.pil b/test/pil2/collection/expressions.pil index dbfcfe7..1354ff2 100644 --- a/test/pil2/collection/expressions.pil +++ b/test/pil2/collection/expressions.pil @@ -1,12 +1,20 @@ subproof ExpressionTest(2**16) { col witness x[4],z; - col fixed Y[100]; - expr a = 5 * Y[99]; + col fixed Y[4]; + Y[0] = [1..5]...; + col fixed _Y = [1..5]...; + const int k; + const expr isZero = (1 - Y[0]); + k = 10; + const expr b = 13 + 6 * Y[1]; + expr a; + a = 10 + 5 * Y[2]; a = a + 100; - a = a + 200; + a = a + 2 * isZero; + a = a - isZero; a === 0; - 5 * Y[99]' + x[1] + 2 * x[0] + 3 * x[2] + 18 * z === x[1]; + 5 * Y[3]' + x[1] + 2 * x[0] + 3 * x[2] + 18 * z === x[1]; /* expr ex = x[0] + 2 * x[1] + 4 * x[2] + 2 ** 3 * x[3]; From e720a83c6a844cc4ca27a47df6ae05c536e03d9c Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 3 Oct 2023 08:32:25 +0200 Subject: [PATCH 16/33] some fixs to be compatible with previous version of pil2 --- src/expression.js | 2 +- src/expression_items/challenge.js | 3 +++ src/expression_items/expression_item.js | 5 ++++- src/expression_items/expression_reference.js | 4 ++++ src/expression_items/fixed_col.js | 3 +++ src/expression_items/proof_item.js | 4 ++-- src/expression_items/proofval.js | 3 +++ src/expression_items/public.js | 3 +++ src/expression_items/publictable.js | 3 +++ src/expression_items/subproofval.js | 3 +++ src/expression_items/witness_col.js | 3 +++ src/processor.js | 2 +- src/reference.js | 3 --- src/references.js | 6 +++--- 14 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/expression.js b/src/expression.js index 4a5d04b..967b334 100644 --- a/src/expression.js +++ b/src/expression.js @@ -1035,7 +1035,7 @@ class Expression extends ExpressionItem { } else { TODO_EXIT } - if (parentPrecedence > operationInfo.precedence || parentOperation === 'sub') { + if (parentPrecedence > operationInfo.precedence || (parentOperation === 'sub' && st.op !== 'mul')) { res = '(' + res + ')'; } return res; diff --git a/src/expression_items/challenge.js b/src/expression_items/challenge.js index 2fe2659..893e02b 100644 --- a/src/expression_items/challenge.js +++ b/src/expression_items/challenge.js @@ -3,6 +3,9 @@ module.exports = class Challenge extends ProofItem { constructor (id) { super(id); } + getTag() { + return 'challenge'; + } cloneInstance() { return new Challenge(this.id); } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 7f77999..5bfcb2e 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -92,7 +92,7 @@ class ExpressionItem { return this.indexes.pop(); } toString(options) { - return `${this.constructor.name}()`; + return this.getTag() + '(' + this.label + ')'; } dump(options) { return this.toString(options); @@ -100,6 +100,9 @@ class ExpressionItem { dumpItem(options) { return this.dump(options); } + getTag() { + return this.constructor.name; + } get type() { console.log(this); throw new Error(`FATAL: use type obsolete-property`) diff --git a/src/expression_items/expression_reference.js b/src/expression_items/expression_reference.js index 17a8da0..688979c 100644 --- a/src/expression_items/expression_reference.js +++ b/src/expression_items/expression_reference.js @@ -5,4 +5,8 @@ module.exports = class ExpressionReference extends RuntimeItem { this.id = id; this.value = value; } + getTag() { + return 'im'; + } + } diff --git a/src/expression_items/fixed_col.js b/src/expression_items/fixed_col.js index a43ddc3..3cc566b 100644 --- a/src/expression_items/fixed_col.js +++ b/src/expression_items/fixed_col.js @@ -14,6 +14,9 @@ module.exports = class FixedCol extends ProofItem { isPeriodic() { return this.rows > 0; } + getTag() { + return 'fixed'; + } getValue(row) { if (this.sequence === null) { return this.values[row] diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 64c74a9..72d7a04 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -38,9 +38,9 @@ module.exports = class ProofItem extends ExpressionItem { toString(options) { const [next, prior] = this.getRowOffsetStrings(); // console.log(['ROWOFFSET.TOSTRING', next, prior, this.label, this.constructor.name, this.rowOffset]); - let label = (options.hideClass ? '' : this.constructor.name + '::') + this.label; + let label = (options.hideClass ? '' : this.getTag() + '::') + this.label; if (options.hideLabel || !this.label) { - label = this.constructor.name + '@' + this.id; + label = this.getTag() + '@' + this.id; } return next + label + prior; } diff --git a/src/expression_items/proofval.js b/src/expression_items/proofval.js index eb58939..7758d5e 100644 --- a/src/expression_items/proofval.js +++ b/src/expression_items/proofval.js @@ -4,6 +4,9 @@ module.exports = class Proofval extends ProofItem { constructor (id) { super(id); } + getTag() { + return 'proofvalue'; + } cloneItem() { return new Proofval(this.id); } diff --git a/src/expression_items/public.js b/src/expression_items/public.js index 8ffea27..b5ba45a 100644 --- a/src/expression_items/public.js +++ b/src/expression_items/public.js @@ -6,6 +6,9 @@ module.exports = class Public extends ProofItem { getId() { return this.id; } + getTag() { + return 'public'; + } cloneInstance() { return new Public(this.id); } diff --git a/src/expression_items/publictable.js b/src/expression_items/publictable.js index 16621d9..8b6c2b8 100644 --- a/src/expression_items/publictable.js +++ b/src/expression_items/publictable.js @@ -6,6 +6,9 @@ module.exports = class PublicTable extends ProofItem { getId() { return this.id; } + getTag() { + return 'publictable'; + } cloneInstance() { return new PublicTable(this.id); } diff --git a/src/expression_items/subproofval.js b/src/expression_items/subproofval.js index 4fd2bf8..e576e2c 100644 --- a/src/expression_items/subproofval.js +++ b/src/expression_items/subproofval.js @@ -3,6 +3,9 @@ module.exports = class Subproofval extends ProofItem { constructor (id, stage) { super(id, stage); } + getTag() { + return 'subproofvalue'; + } cloneInstance() { return new Subproofval(this.id, this.stage); } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index ff36d13..d50f757 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -7,6 +7,9 @@ module.exports = class WitnessCol extends ProofItem { super(id); console.log('CONSTRUCTOR_WITNESS', id, this.id); } + getTag() { + return 'witness'; + } cloneInstance() { return new WitnessCol(this.id); } diff --git a/src/processor.js b/src/processor.js index 47e14d3..1226ea3 100644 --- a/src/processor.js +++ b/src/processor.js @@ -251,7 +251,7 @@ module.exports = class Processor { const __executeStatementCounter = this.executeStatementCounter++; this.traceLog(`[TRACE] #${__executeStatementCounter} ${st.debug ?? ''} (DEEP:${this.scope.deep})`, '38;5;75'); - this.sourceRef = st.debug ?? ''; + this.sourceRef = st.debug.split(':').slice(0,2).join(':') ?? ''; if (typeof st.type === 'undefined') { console.log(st); diff --git a/src/reference.js b/src/reference.js index 240aed2..ab2734e 100644 --- a/src/reference.js +++ b/src/reference.js @@ -94,9 +94,6 @@ class Reference { console.log(locator); const res = options.const ? this.instance.getItem(locator, options) : this.instance.getConstItem(locator, options); console.log(['GETITEM', res.constructor.name, res.definition, this.const]); - if (locator == 0 && res.constructor.name == 'WitnessCol' && !label) { - EXIT_HERE; - } if (label) res.setLabel(label); else res.setLabel('___'); diff --git a/src/references.js b/src/references.js index de5563d..5a62683 100644 --- a/src/references.js +++ b/src/references.js @@ -158,7 +158,7 @@ module.exports = class References { } return [scopeId, false]; } - declare (name, type, lengths = [], options = null, initValue = null) { + declare (name, type, lengths = [], options = {}, initValue = null) { assert(typeof name === 'string'); assert(!name.includes('::object')); @@ -251,8 +251,8 @@ module.exports = class References { options = options ?? {}; const reference = this.getReference(name); - const item = reference.getItem(indexes, {...options, label: name}); - console.log(item); + // TODO: if reference is a 'reference' check if name is correct + const item = reference.getItem(indexes, {...options, label: reference.name}); if (options.preDelta) { From c9e5ebfe0ff327ef021c83994d1d5c59df9244a2 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 3 Oct 2023 16:35:15 +0200 Subject: [PATCH 17/33] fix some bugs on pilout --- src/constraints.js | 14 +++++++++++--- src/definition_items/proof_item.js | 4 ++-- src/expression_pack.js | 15 ++++++++++++--- src/expressions.js | 14 ++++++++------ src/indexable.js | 3 ++- src/packed_expressions.js | 1 + src/processor.js | 20 ++++++++++---------- src/proto_out.js | 3 ++- src/references.js | 19 ++++++++++--------- 9 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/constraints.js b/src/constraints.js index 5223952..2ce4ca3 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -27,8 +27,13 @@ module.exports = class Constraints { return (typeof this.constraints[id] != 'undefined'); } - getPackedExpressionId(id, container, options) { - return Context.expressions.getPackedExpressionId(id, container, options); + getPackedExpressionId(id, container, options = {}) { + console.log(Context.expressions); + console.log(options); + console.log(id); + console.log(options.expressions ?? Context.expressions); + const res = (options.expressions ?? Context.expressions).getPackedExpressionId(id, container, options); + return res; } define(left, right, boundery, sourceRef) { console.log(left, right); @@ -80,8 +85,11 @@ module.exports = class Constraints { } getDebugInfo(index, packed, options) { const constraint = this.constraints[index]; + console.log(constraint); const eid = constraint.exprId; - const peid = Context.expressions.getPackedExpressionId(eid); + // const peid = Context.expressions.getPackedExpressionId(eid); + const peid = this.getPackedExpressionId(eid, packed, options); + console.log(peid); let info = `INFO ${index}: ${eid} ${peid} ${constraint.sourceRef}` options = options ?? {}; diff --git a/src/definition_items/proof_item.js b/src/definition_items/proof_item.js index 2c6e9c3..d32f17a 100644 --- a/src/definition_items/proof_item.js +++ b/src/definition_items/proof_item.js @@ -1,5 +1,5 @@ -const ExpressionItem = require("./definition_item.js"); -module.exports = class ProofItem extends ExpressionItem { +const DefinitionItem = require("./definition_item.js"); +module.exports = class ProofItem extends DefinitionItem { constructor (id) { super(); this.id = id; diff --git a/src/expression_pack.js b/src/expression_pack.js index adee3fe..927e9ea 100644 --- a/src/expression_pack.js +++ b/src/expression_pack.js @@ -1,5 +1,8 @@ const {assert, assertLog} = require('./assert.js'); const Exceptions = require('./exceptions.js'); +const ExpressionItems = require('./expression_items.js'); +const Context = require('./context.js'); +const { DefinitionItem } = require('./definition_items.js'); module.exports = class ExpressionPack { constructor() { @@ -7,6 +10,7 @@ module.exports = class ExpressionPack { } set(expression) { this.expression = expression; + return this; } packAlone(container, options) { this.operandPack(container, this.expression.getAloneOperand(), 0, options); @@ -64,8 +68,13 @@ module.exports = class ExpressionPack { // container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); // break; const id = ope.getId(); - const def = Context.references.getDefinitionByItem(ope); - assert(def !== false); + console.log(options); + const def = Context.references.getDefinitionByItem(ope, options); + console.log(ope); + console.log(def); + assert(typeof def === 'object') + console.log(def instanceof ExpressionItems.ExpressionItem, DefinitionItem.prototype.constructor.name, Object.getPrototypeOf(def.constructor).name); + assert(def instanceof DefinitionItem); if (ope instanceof ExpressionItems.WitnessCol) { // container.pushWitnessCol(id, next ?? 0, stage ?? 1) console.log(ope); @@ -83,7 +92,7 @@ module.exports = class ExpressionPack { } else if (ope instanceof ExpressionItems.Challenge) { // container.pushChallenge(id, stage ?? 1); - container.pushChallenge(id, ope.getStage()); + container.pushChallenge(id, def.stage); } else if (ope instanceof ExpressionItems.Proofval) { // container.pushProofValue(id) diff --git a/src/expressions.js b/src/expressions.js index 39e8d37..d18bd6a 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -4,7 +4,7 @@ const Expression = require('./expression.js'); const WitnessCol = require('./expression_items/witness_col.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); const ExpressionPack = require('./expression_pack.js'); - +const Context = require('./context.js'); module.exports = class Expressions { constructor () { this.expressions = []; @@ -341,15 +341,17 @@ module.exports = class Expressions { this.packedIds = []; for (let id = 0; id < this.expressions.length; ++id) { if (typeof this.packedIds[id] !== 'undefined') continue; // already packed - const packedId = this.expressionPack.set(this.expressions[id]).pack(container, options); + this.expressions[id].dump('PACK-EXPRESSION '); + this.expressionPack.set(this.expressions[id]); + this.packedIds[id] = this.expressionPack.pack(container, options); // packedId === false, means directly was a alone term. - this.packedIds[id] = packedId; } } getPackedExpressionId(id, container, options) { + console.log(id, this.packedIds, this.packedIds[id]); if (container && typeof this.packedIds[id] === 'undefined') { - const packedId = this.expressionPack.set(this.expressions[id]).pack(container, options); - this.packedIds[id] = packedId; + this.expressionPack.set(this.expressions[id]); + this.packedIds[id] = this.expressionPack.pack(container, options); } return this.packedIds[id]; } @@ -362,7 +364,7 @@ module.exports = class Expressions { this.expressions[index].dump(`EXPRESSION ${index} # ${name}`, 3); } } - clear() { + clear(label = '') { this.expressions = []; this.packedIds = []; this.labelRanges = new LabelRanges(); diff --git a/src/indexable.js b/src/indexable.js index e4289e2..94f14da 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -33,7 +33,8 @@ module.exports = class Indexable { return cloned; } - clear() { + clear(label = '') { + console.log(`CLEARING ${label} (${this.type})`); this.values = []; this.labelRanges = new LabelRanges(); } diff --git a/src/packed_expressions.js b/src/packed_expressions.js index 31a057d..e26a5f6 100644 --- a/src/packed_expressions.js +++ b/src/packed_expressions.js @@ -66,6 +66,7 @@ module.exports = class PackedExpressions { } exprToString(id, options) { const expr = this.expressions[id]; + console.log([id, expr, this.expressions.length]); const [op] = Object.keys(expr); let opes = []; for (const ope of Object.values(expr[op])) { diff --git a/src/processor.js b/src/processor.js index 1226ea3..fcb0741 100644 --- a/src/processor.js +++ b/src/processor.js @@ -188,17 +188,17 @@ module.exports = class Processor { const bits = log2(Number(air.rows)); proto.setAir(airName, air.rows); proto.setFixedCols(air.fixeds); + proto.setWitnessCols(air.witness); // expression: constraint, hint, operand (expression) let packed = new PackedExpressions(); // this.expressions.pack(packed); - air.expressions.pack(packed); + air.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); proto.setConstraints(air.constraints, packed, { labelsByType: { witness: air.witness.labelRanges, - fixed: air.fixeds.labelRanges, - } - }); - proto.setWitnessCols(air.witness); + fixed: air.fixeds.labelRanges }, + expressions: air.expressions + }); proto.setSymbolsFromLabels(air.witness.labelRanges, 'witness', {airId, subproofId}); proto.setSymbolsFromLabels(air.fixeds.labelRanges, 'fixed', {airId, subproofId}); proto.setExpressions(packed); @@ -691,7 +691,7 @@ module.exports = class Processor { air.constraints.expressions = air.expressions; air.hints = this.hints.clone(); air.hints.expressions = air.expressions; - this.clearAirScope(); + this.clearAirScope(airName); this.constraints = new Constraints(this.Fr, this.expressions); this.scope.popInstanceType(['witness', 'fixed', 'im']); this.context.pop(); @@ -706,10 +706,10 @@ module.exports = class Processor { finalAirScope() { this.callDelayedFunctions('air', 'final'); } - clearAirScope() { - this.references.clearType('fixed'); - this.references.clearType('witness'); - this.expressions.clear(); + clearAirScope(label = '') { + this.references.clearType('fixed', label); + this.references.clearType('witness', label); + this.expressions.clear(label); } finalSubproofScope() { this.callDelayedFunctions('subproof', 'final'); diff --git a/src/proto_out.js b/src/proto_out.js index 4e94013..de3d17f 100644 --- a/src/proto_out.js +++ b/src/proto_out.js @@ -413,10 +413,11 @@ module.exports = class ProtoOut { this.pilOut.constraints.push(payload); } } - setConstraints(constraints, packed, options) { + setConstraints(constraints, packed, options = {}) { let airConstraints = this.setupAirProperty('constraints'); for (const [index, constraint] of constraints.keyValues()) { let payload; + console.log([index, constraint]); const debugLine = constraints.getDebugInfo(index, packed, options); const packedExpressionId = constraints.getPackedExpressionId(constraint.exprId, packed, options); switch (constraint.boundery) { diff --git a/src/references.js b/src/references.js index 5a62683..830ee6a 100644 --- a/src/references.js +++ b/src/references.js @@ -14,15 +14,16 @@ module.exports = class References { this.visibilityStack = []; this.containers = new Containers(this); } - getDefinitionByItem(item) { + getDefinitionByItem(item, options) { let instance = null; - console.log(this.types); - for (const type in this.types) { - instance = this.types[type].instance ?? {}; - if (instance.expressionItemClass === item.constructor) break; + const instances = [...(options.instances ?? []), ...Object.values(this.types).map(x => x.instance)]; + for (const _instance of instances) { + if (_instance.expressionItemClass === item.constructor) { + instance = _instance; + break; + } } - console.log(instance.constructor.name); - return instance.get ? instance.get(instance.id): false; + return instance.get ? instance.get(item.id): false; } /* getDefinition(name, indexes) { const reference = this.getReference(name); @@ -64,12 +65,12 @@ module.exports = class References { instance } } - clearType(type) { + clearType(type, label) { const typeInfo = this.types[type]; if (typeof typeInfo === 'undefined') { throw new Error(`type ${type} not registered`); } - typeInfo.instance.clear(); + typeInfo.instance.clear(label); // TODO: remove references for (const name in this.references) { if (this.references[name].type !== type) continue; From e01e53f63d6c4111b7e6440e94e3162845e9a6d8 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 3 Oct 2023 16:59:38 +0200 Subject: [PATCH 18/33] fix rowOffset on pilout --- src/expression_items/expression_item.js | 4 ++-- src/expression_pack.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 5bfcb2e..594970f 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -107,8 +107,8 @@ class ExpressionItem { console.log(this); throw new Error(`FATAL: use type obsolete-property`) } - getNext() { - return this.next ?? 0; + getRowOffset() { + return this.rowOffset ? this.rowOffset.value : 0; } getRowOffsetStrings(options) { if (!this.rowOffset) return ['','']; diff --git a/src/expression_pack.js b/src/expression_pack.js index 927e9ea..3e0d604 100644 --- a/src/expression_pack.js +++ b/src/expression_pack.js @@ -80,11 +80,11 @@ module.exports = class ExpressionPack { console.log(ope); // CURRENT ERROR: in this scope definition not available. console.log(def); - container.pushWitnessCol(id, ope.getNext(), def.stage); + container.pushWitnessCol(id, ope.getRowOffset(), def.stage); } else if (ope instanceof ExpressionItems.FixedCol) { // container.pushFixedCol(id, next ?? 0); - container.pushFixedCol(id, ope.getNext()); + container.pushFixedCol(id, ope.getRowOffset()); } else if (ope instanceof ExpressionItems.Public) { // container.pushPublicValue(id) From eaf2de7afde10bef9b711bbf38008caa20c6ce69 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Wed, 18 Oct 2023 08:30:08 +0200 Subject: [PATCH 19/33] WIP --- build/pil_parser.js | 20 ++- src/compiler.js | 2 + src/context.js | 3 + src/definition_items/expression_variable.js | 13 +- src/expression.js | 43 ++++-- src/expression_factory.js | 30 +++- src/expression_items.js | 4 + src/expression_items/expression_list.js | 26 ++++ src/expression_items/function_call.js | 10 +- src/expression_items/reference_item.js | 2 - src/expression_items/string_template.js | 31 ++++ src/expressions.js | 2 + src/function.js | 149 ++++++++++--------- src/indexable.js | 4 +- src/list.js | 10 +- src/multi_array.js | 29 +++- src/pil.js | 2 + src/pil_parser.jison | 17 ++- src/processor.js | 7 + src/reference.js | 5 +- src/references.js | 11 +- test/pil2/vadcop-fibonacci-std/fibonacci.pil | 23 +++ test/pil2/vadcop-fibonacci-std/module.pil | 15 ++ 23 files changed, 340 insertions(+), 118 deletions(-) create mode 100644 src/expression_items/expression_list.js create mode 100644 src/expression_items/string_template.js create mode 100644 test/pil2/vadcop-fibonacci-std/fibonacci.pil create mode 100644 test/pil2/vadcop-fibonacci-std/module.pil diff --git a/build/pil_parser.js b/build/pil_parser.js index 87ca8c1..5666f60 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -323,10 +323,10 @@ case 129: this.$ = { type: 'array', data: [ $$[$0] ] } break; case 130: - this.$ = { type: 'call', function: $$[$0-3], args: $$[$0-1].values } + this.$ = { type: 'call', function: $$[$0-3], args: $$[$0-1] } break; case 135: - this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], args: $$[$0-1].values } + this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], args: $$[$0-1] } break; case 138: this.$ = {...$$[$0], ...$$[$01]} @@ -364,7 +364,7 @@ break; case 155: this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) break; -case 156: case 224: case 245: case 250: +case 156: case 224: case 250: this.$ = $$[$0-2]; this.$.values.push($$[$0]) break; case 157: @@ -607,16 +607,20 @@ case 242: this.$ = {type: 'seq_list', values: [$$[$0-1]]} break; case 244: - this.$ = {values: []} + this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [] }); console.log('C', this.$) +break; +case 245: + this.$ = $$[$0-2]; console.log(this.$); this.$.pushItem(ExpressionFactory.fromObject($$[$0])); break; case 246: - this.$ = $$[$0-4]; this.$.values.push({ type: 'expression_list', values: $$[$0-1].values }) + this.$ = $$[$0-4]; this.$.pushItem(ExpressionFactory.fromObject({ type: 'expression_list', values: $$[$0-1].values })); break; case 247: - this.$ = { type: 'expression_list', values: $$[$0-1].values } + this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: + [ExpressionFactory.fromObject({ type: 'expression_list', values: [$$[$0-1].values]})]}); console.log('A',this.$) break; case 248: - this.$ = { type: 'expression_list', values: [$$[$0]] } + this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$$[$0]] }); console.log('B',this.$) break; case 249: this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) @@ -766,7 +770,7 @@ case 299: this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; case 300: - this.$ = $$[$0-1].insert('not') + this.$ = $$[$0].insert('not') break; case 301: this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) diff --git a/src/compiler.js b/src/compiler.js index c95c83d..e6ec494 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -12,6 +12,7 @@ const Indexable = require("./indexable.js"); const Ids = require("./ids.js"); const Constraints = require("./constraints.js"); const Processor = require("./processor.js"); +const Context = require("./context.js"); const { mainModule } = require("process"); @@ -108,6 +109,7 @@ console.log('\x1B[93mSTATE '+state+' SYMBOL '+__symbol_info__+" #"+(yylineno + 1 const first = _$[$$.length - 1 - parserStateInfo[yystate][1]]; const last = _$[$$.length - 1]; const sourceRef = `${compiler.relativeFileName}:${last.last_line}`; + Context.processor.sourceRef = sourceRef; // if (sourceRef === 'mem_align.pil:48') { /* if (sourceRef === 'sequence.pil:5') { console.log(arguments); diff --git a/src/context.js b/src/context.js index a638185..61a1d93 100644 --- a/src/context.js +++ b/src/context.js @@ -25,6 +25,9 @@ module.exports = class Context { static get sourceRef() { return this._instance._processor.sourceRef; } + static get sourceTag() { + return this._instance._processor.sourceRef.split('/').slice(-2).join('/'); + } static get processor() { return this._instance._processor; } diff --git a/src/definition_items/expression_variable.js b/src/definition_items/expression_variable.js index 94542d2..c7bad47 100644 --- a/src/definition_items/expression_variable.js +++ b/src/definition_items/expression_variable.js @@ -1,5 +1,6 @@ const Variable = require("./variable.js"); const ExpressionClass = require('../expression.js'); +const ValueItem = require('../expression_items/value_item.js'); module.exports = class ExpressionVariable extends Variable { constructor (id, properties = {}) { super(id, properties); @@ -8,12 +9,20 @@ module.exports = class ExpressionVariable extends Variable { setValue(value) { super.setValue(value); if (value instanceof ExpressionClass) { + this.value = value.instance(); + return; + } + this.value = value.clone(); + /* + if (value instanceof ExpressionClass || value instanceof ValueItem) { this.value = value.clone(); return; } console.log(this); + console.log(this.value); console.log(value); - this.value._set(value); - this.value.dump('setValue'); + this.value.set(value); + // this.value._set(value); + this.value.dump('setValue');*/ } } diff --git a/src/expression.js b/src/expression.js index 967b334..67da00e 100644 --- a/src/expression.js +++ b/src/expression.js @@ -176,26 +176,35 @@ class Expression extends ExpressionItem { /* isRuntimeOperand(ope) { return (ope.type === OP_RUNTIME); }*/ - insertOne (op, b) { - assert(b instanceof Expression); + insertOne (op, b = false) { + assert(b === false || b instanceof Expression); const aIsEmpty = this.stack.length === 0; - const bIsEmpty = b.stack.length === 0; + const bIsEmpty = b === false || b.stack.length === 0; - if (bIsEmpty) { + if (bIsEmpty && op !== 'not') { throw new Error(`insert without operands`); } const aIsAlone = this.isAlone(); - const bIsAlone = b.isAlone(); + const bIsAlone = b === false || b.isAlone(); if (bIsAlone) { // aIsAlone => !aIsEmpty if (aIsAlone) { this.stack[0].op = op; - this.stack[0].operands.push(b.cloneAlone()); + // if b is false => unary operand, no second operand to add + if (b !== false) { + this.stack[0].operands.push(b.cloneAlone()); + } return this; } // let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; // this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); let operandA = aIsEmpty ? [] : [new ExpressionItems.StackItem(1)]; - this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); + + const stackPos = {op, operands: operandA}; + // if b is false => unary operand, no second operand to add + if (b !== false) { + stackPos.operands.push(b.cloneAlone()); + } + this.stack.push(stackPos); return this; } @@ -260,15 +269,25 @@ class Expression extends ExpressionItem { return this; } evaluateAloneReference() { + this.dump(); assert(this.isAlone()); let operand = this.getAloneOperand(); - if (operand.type === OP_RUNTIME || operand.op === 'reference') { - const res = this.evaluateRuntime(operand, true); - if (!(res instanceof Expression)) { + if (operand instanceof ExpressionItems.RuntimeItem || operand instanceof ExpressionItems.ReferenceItem) { + console.log(operand); + const res = operand.eval(); + console.log(res); + console.log(operand.toString()); + console.log(this.toString()); + return res; +/* const res = this.evaluateRuntime(operand, true); + console.log(operand); + console.log(res); + EXIT_HERE;*/ +/* if (!(res instanceof Expression)) { operand.__value = res; - } + }*/ } - return operand.__value; + return operand; } assertInstanced() { assert(false); diff --git a/src/expression_factory.js b/src/expression_factory.js index c299691..80c2463 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -1,8 +1,8 @@ const util = require('util'); const {cloneDeep} = require('lodash'); const Expression = require("./expression.js"); -const {ReferenceItem, IntValue, StringValue, - FunctionCall} = require("./expression_items.js"); +const {ReferenceItem, IntValue, StringValue, StringTemplate, + FunctionCall, ExpressionList} = require("./expression_items.js"); const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); const RowOffset = require('./expression_items/row_offset.js'); @@ -13,6 +13,7 @@ module.exports = class ExpressionFactory { static fromObject(obj) { if (obj instanceof Expression) { + console.log('#########', Object.keys(obj).includes('type')); return obj; } console.log(obj); @@ -41,27 +42,39 @@ module.exports = class ExpressionFactory { if (type === 'row_offset') { return item; } + if (item instanceof ExpressionList) { + return item; + } let expr = new Expression(); expr._set(item); return expr; } static fromObjects(objs) { let expressions = []; - for (const obj of objects) { + for (const obj of objs) { expressions.push(ExpressionFactory.fromObject(obj)); } return expressions; } + static fromExpressionList(obj) { + const elist = new ExpressionList(this.fromObjects(obj.values)); + delete obj.values; + return elist; + } static fromReference(obj) { if (obj.rowOffset) { console.log('ROWOFFSET.FROMREFERENCE'); console.log(obj.rowOffset); } + console.log(obj); let res = new ReferenceItem(obj.name, obj.indexes ?? [], obj.rowOffset); delete obj.name; delete obj.indexes; delete obj.dim; delete obj.rowOffset; + + // TODO + delete obj.inc; return res; } static fromNumber(obj) { @@ -70,12 +83,19 @@ module.exports = class ExpressionFactory { return res; } static fromString(obj) { - let res = new StringValue(obj.value); + let res; + if (obj.template) { + res = new StringTemplate(obj.value); + delete obj.template; + } + else { + res = new StringValue(obj.value); + } delete obj.value; return res; } static fromCall(obj) { - console.log('CALL'); + console.log(`##### CALL ${obj.function.name} ${obj.debug}`); console.log(util.inspect(obj, false, 10, true)); let res = new FunctionCall(obj.function.name, obj.args ?? [], obj.indexes ?? [], { name: obj.function.name.debug}); diff --git a/src/expression_items.js b/src/expression_items.js index 9edc576..560ff3b 100644 --- a/src/expression_items.js +++ b/src/expression_items.js @@ -1,4 +1,5 @@ const ExpressionItem = require("./expression_items/expression_item.js"); +const ExpressionList = require("./expression_items/expression_list.js"); const ExpressionReference = require("./expression_items/expression_reference.js"); const FeValue = require("./expression_items/fe_value.js"); const IntValue = require("./expression_items/int_value.js"); @@ -10,6 +11,7 @@ const Publictable = require("./expression_items/publictable.js"); const ReferenceItem = require("./expression_items/reference_item.js"); const RuntimeItem = require("./expression_items/runtime_item.js"); const StackItem = require("./expression_items/stack_item.js"); +const StringTemplate = require("./expression_items/string_template.js"); const StringValue = require("./expression_items/string_value.js"); const Subproofval = require("./expression_items/subproofval.js"); const ValueItem = require("./expression_items/value_item.js"); @@ -22,6 +24,7 @@ const NonRuntimeEvaluableItem = require('./expression_items/non_runtime_evaluabl module.exports = { ExpressionItem, + ExpressionList, ExpressionReference, FeValue, FixedCol, @@ -34,6 +37,7 @@ module.exports = { ReferenceItem, RuntimeItem, StackItem, + StringTemplate, StringValue, Subproofval, ValueItem, diff --git a/src/expression_items/expression_list.js b/src/expression_items/expression_list.js new file mode 100644 index 0000000..cd9ce89 --- /dev/null +++ b/src/expression_items/expression_list.js @@ -0,0 +1,26 @@ +const Exceptions = require('../exceptions.js'); +const {assert, assertLog} = require('../assert.js'); +const ExpressionItem = require('./expression_item.js'); +class ExpressionList extends ExpressionItem { + + constructor(items, debug = {}) { + super(debug); + this.indexes = [items.length]; + this.label = ''; + this.items = []; + for (const item of items) { + this.items.push(item.clone()); + } + this._ns_ = 'ExpressionItem'; + } + cloneInstance() { + return new ExpressionList(this.items, this.debug); + } + pushItem(item) { + assertLog(item instanceof ExpressionItem, item); + this.items.push(item.clone()); + this.indexes = [this.items.length]; + } +} + +module.exports = ExpressionList; \ No newline at end of file diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 8f32b72..3cf3bd6 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -1,11 +1,18 @@ const util = require('util'); const RuntimeItem = require("./runtime_item.js"); +const ExpressionList = require("./expression_list.js"); const Context = require('../context.js'); module.exports = class FunctionCall extends RuntimeItem { constructor (name, args = [], indexes = [], debug = {}) { super(debug); this.name = name; - this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); + if (args instanceof ExpressionList) { + console.log(util.inspect(args, false, 10, true)); + args = args.items; + } + console.log([`#FCALL#${name} ${Context.sourceTag} ${args.length}`, args]); + // this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); + this.args = args.map(x => x.clone()); this.indexes = indexes.map(x => (typeof x.clone === 'function') ? x.clone() : x); console.log(`############## ARGS(${name},${this.args.length}) ######################`); console.log(util.inspect(args, false, 10, true)); @@ -26,6 +33,7 @@ module.exports = class FunctionCall extends RuntimeItem { this.funcdef = source.funcdef; } evalInside(options) { + console.log([`#FCALL.EVAL#${this.name} ${Context.sourceTag}`, this.args]); const definition = Context.references.get(this.name, options); const res = Context.processor.executeFunctionCall(this.name, this); console.log(res); diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index c7b2393..8c23c80 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -9,8 +9,6 @@ module.exports = class ReferenceItem extends RuntimeItem { this.indexes = indexes.map(index => index.clone()); // TODO: next as expression this.rowOffset = RowOffset.factory(rowOffset); - console.log(['CONSTRUCTOR.REFERENCE '+this.name, this.rowOffset, this.indexes.length > 0 ? this.indexes[0].asInt():'']); - console.log(this.rowOffset); } set locator (value) { throw new Error(`setting locator on reference ${this.name} ${this.indexes.length}`); diff --git a/src/expression_items/string_template.js b/src/expression_items/string_template.js new file mode 100644 index 0000000..e065c0b --- /dev/null +++ b/src/expression_items/string_template.js @@ -0,0 +1,31 @@ +const {assert, assertLog} = require("../assert.js"); +const RuntimeItem = require("./runtime_item.js"); +const StringValue = require("./string_value.js"); +const Context = require('../context.js'); + +class StringTemplate extends StringValue { + evalTemplate(options) { + console.log('BEFORE TEMPLATE'); + const res = new StringValue(Context.processor.evaluateTemplate(this.value)); + console.log('AFTER TEMPLATE'); + return res; + } + toString(options) { + return '"'+this.evalTemplate(options)+'"'; + } + getValue() { + return this.evalTemplate(); + } + asString() { + return this.asStringItem().value; + } + asStringItem() { + return this.evalTemplate(); + } + eval(options = {}) { + return this.evalTemplate(options); + } +} + +RuntimeItem.registerClass('StringTemplate', StringTemplate); +module.exports = StringTemplate; diff --git a/src/expressions.js b/src/expressions.js index d18bd6a..bcd0727 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -119,6 +119,8 @@ module.exports = class Expressions { case 'idref': return this._evalIdref(operand); case 'reference': return this._evalReference(operand, expr, deeply); } + console.log(operand); + return operand.eval(); throw new Error(`Invalid runtime operation ${op}`); } _evalString(e) { diff --git a/src/function.js b/src/function.js index 8d518c6..9b4af5e 100644 --- a/src/function.js +++ b/src/function.js @@ -3,16 +3,13 @@ const {cloneDeep} = require('lodash'); const {assert, assertLog} = require('./assert.js'); const {FlowAbortCmd, BreakCmd, ContinueCmd, ReturnCmd} = require("./flow_cmd.js"); const Expression = require("./expression.js"); +const ExpressionItems = require("./expression_items.js"); const List = require("./list.js"); const Context = require('./context.js'); module.exports = class Function { constructor (id, data = {}) { - console.log(data); this.id = id; - // this.references = parent.references; - // this.expressions = parent.expressions; this.initialized = [data.args, data.returns, data.statements, data.funcname].some(x => typeof x !== 'undefined'); - // this.scope = parent.scope; this.name = data.funcname; if (data.args) { this.defineArguments(data.args); @@ -31,10 +28,11 @@ module.exports = class Function { this.name = value.name; // TODO: clone return types this.args = {...value.args}; - this.returns = value.returns ? [...value.returns] : value.returns; + this.returns = value.returns && Array.isArray(value.returns) ? [...value.returns] : value.returns; this.statements = value.statements; } defineArguments(args) { + console.log(`#FCALL.DEFINE#${this.name}`, args.length); this.args = {}; for (const arg of args) { const name = arg.name; @@ -44,6 +42,8 @@ module.exports = class Function { // console.log(['function', this.name, name, arg]); } } + // mapArgument was called before enter on function visibility scope because + // inside function args "values" aren't visible. mapArguments(s) { console.log('##### MAP ARGUMENTS #######'); // TODO: class o class-by-type to convert, cast, copy... between types @@ -56,83 +56,90 @@ module.exports = class Function { } } */ - // mapArgument was called before enter on function visibility scope because - // inside function args "values" aren't visible. let iarg = 0; + let extraInfo = ''; for (const name in this.args) { - // console.log(`MAP-ARGUMENTS ${this.name} (arg[${iarg}]: ${name})`); - const arg = this.args[name]; - // TODO: arrays and pol references ... - let type = arg.type; - const argDim = arg.dim ? arg.dim : 0; - if (arg.reference) { - // console.log(`${this.name}.MAP-REFERENCE`); - const ref = s.args[iarg].getReference(); - - // special case of col, could be witness, fixed or im - if (type === 'col') { - type = Context.references.getReferenceType(ref.name); - } - const dim = ref.array ? ref.array.dim : 0; - if (dim !== argDim) { - console.log(type); - console.log(ref); - console.log(argDim); - console.log(s.args[iarg].getAloneOperand()); - throw new Error(`Invalid array on ${Context.sourceRef}`); - } - Context.processor.declareReference(name, type, ref.array ? ref.array.lengths : []); - Context.references.setReference(name, ref); - } else if (arg.type === 'int' || arg.type === 'fe') { - if (argDim) { - s.args[iarg].eval(); + try { + // console.log(`MAP-ARGUMENTS ${this.name} (arg[${iarg}]: ${name})`); + const arg = this.args[name]; + // TODO: arrays and pol references ... + let type = arg.type; + const argDim = arg.dim ? arg.dim : 0; + if (arg.reference) { + // console.log(`${this.name}.MAP-REFERENCE`); const ref = s.args[iarg].getReference(); - console.log(ref); - console.log(ref.name); - const def = Context.references.getDefinition(ref.name); - const dup = def.array.applyIndex(def, ref.__indexes ?? []); - if (dup.array.dim !== argDim) { - console.log(dup.array.dim, argDim); - throw new Error(`Invalid array on ${Context.processor.sourceRef}`); + // special case of col, could be witness, fixed or im + if (type === 'col') { + type = Context.references.getReferenceType(ref.name); } + const dim = ref.array ? ref.array.dim : 0; + if (dim !== argDim) { + console.log(type); + console.log(ref); + console.log(argDim); + console.log(s.args[iarg].getAloneOperand()); + throw new Error(`Invalid array on ${Context.sourceRef}`); + } + Context.processor.declareReference(name, type, ref.array ? ref.array.lengths : []); + Context.references.setReference(name, ref); + } else if (arg.type === 'int' || arg.type === 'fe') { + if (argDim) { + s.args[iarg].eval(); + const ref = s.args[iarg].getReference(); + console.log(ref); + console.log(ref.name); + const def = Context.references.getDefinition(ref.name); + const dup = def.array.applyIndex(def, ref.__indexes ?? []); - Context.processor.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); - } else { - const value = Context.processor.expressions.eval(s.args[iarg]); - // TODO: review? no referece? - Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); - } - } else { - // console.log(`MAP-${arg.type}`); - // TODO: type conversion, mapping in other class - if (s.args[iarg].type === 'expression_list') { - // check (argDim === 1 && arg.type === 'expr') - const list = new List(this, s.args[iarg], false); - const values = s.args[iarg].values; - Context.processor.declareReference(name, type, [values.length], {}); - let index = 0; - for (const value of list.values) { - // console.log(value); - Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); + if (dup.array.dim !== argDim) { + console.log(dup.array.dim, argDim); + throw new Error(`Invalid array on ${Context.processor.sourceRef}`); + } + + Context.processor.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); + } else { + console.log([name, iarg, s.args.length]); + const value = s.args[iarg].eval(); + // TODO: review? no referece? + Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } - } else if (!(s.args[iarg] instanceof Expression)) { - console.log(arg); - console.log(s.args[iarg]); - EXIT_HERE; } else { - // const value = s.args[iarg].instance().getAloneOperand(); - // const value = s.args[iarg].getAloneOperand(); - // const value = s.args[iarg].getReference(); - const value = s.args[iarg].evaluateAloneReference(); - const dim = value.array ? value.array.dim : 0; - if (dim !== argDim) { - throw new Error(`Invalid array on ${Context.sourceRef}`); + // console.log(`MAP-${arg.type}`); + // TODO: type conversion, mapping in other class + console.log(s.args[iarg]); + if (s.args[iarg] instanceof ExpressionItems.ExpressionList) { + // check (argDim === 1 && arg.type === 'expr') + const list = new List(this, s.args[iarg], false); + const values = s.args[iarg].items; + Context.processor.declareReference(name, type, [values.length], {}); + let index = 0; + for (const value of list.values) { + extraInfo = index; + console.log(value); + Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); + } + } else if (!(s.args[iarg] instanceof Expression)) { + console.log(arg); + console.log([this.name, iarg, s.args[iarg], s.args.length]); + EXIT_HERE; + } else { + // const value = s.args[iarg].instance().getAloneOperand(); + // const value = s.args[iarg].getAloneOperand(); + // const value = s.args[iarg].getReference(); + const value = s.args[iarg].evaluateAloneReference(); + const dim = value.array ? value.array.dim : 0; + if (dim !== argDim) { + throw new Error(`Invalid array on ${Context.sourceRef}`); + } + Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } - Context.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } + ++iarg; + } catch (e) { + console.log(`ERROR mapping parameter ${name} ${extraInfo} of function ${this.name} on ${Context.sourceRef}`); + throw e; } - ++iarg; } return false; } diff --git a/src/indexable.js b/src/indexable.js index 94f14da..2601c1c 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -122,7 +122,9 @@ module.exports = class Indexable { } set(id, value) { const item = this.get(id); - assertLog(item !== null && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); + console.log(item); + console.log(value); + assertLog(item && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); item.setValue(value); /* if (typeof this.cls === 'function') { diff --git a/src/list.js b/src/list.js index dd02876..3dbdbc5 100644 --- a/src/list.js +++ b/src/list.js @@ -1,7 +1,7 @@ const Context = require('./context.js'); const Router = require("./router.js"); const Expression = require("./expression.js"); - +const {ExpressionList} = require('./expression_items.js'); module.exports = class List { // TODO: Review compiler estructures @@ -30,6 +30,14 @@ module.exports = class List { if (e instanceof Expression) { return this._extendExpr(e); } + if (e instanceof ExpressionList) { + let res = []; + for (const item of e.items) { + res.push(this._resolve(item)); + } + return res; + } + console.log(e); return this.router.go(e); } _extendAppend(e) { diff --git a/src/multi_array.js b/src/multi_array.js index 980ad7c..face786 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -1,11 +1,17 @@ - +const {assert, assertLog} = require('./assert.js'); class MultiArray { constructor (lengths, debug) { this.debug = debug || ''; this.initOffsets(lengths); + this.initialized = []; + } + toDebugString() { + return '['+ this.lengths.join(',')+']'; } clone() { - return new MultiArray(this.lengths, this.debug); + const cloned = new MultiArray(this.lengths, this.debug); + cloned.initialized = [...this.initialized]; + return cloned; } checkIndexes(indexes) { if (indexes === null || typeof indexes === 'undefined') { @@ -20,6 +26,10 @@ class MultiArray { } } } + getLocator(baseLocator, indexes = []) { + const offset = this.indexesToOffset(indexes); + return baseLocator + offset; + } // review __getIndexesOffset(indexes) { return this.getIndexesTypedOffset(indexes).offset; @@ -61,9 +71,16 @@ class MultiArray { } return locatorId + offset; } + indexesToOffset(indexes) { + assert(indexes && Array.isArray(indexes)); + const [offset, dim] = this.getIndexesOffset(indexes); + assert(this.offsets.length === indexes.length); + return offset; + } getIndexesOffset(indexes) { if (indexes === null || typeof indexes === 'undefined') { // TODO: review + EXIT_HERE; return {offset: 0, array: this.createSubArray(this.offsets.length)}; } let offset = 0; @@ -117,6 +134,14 @@ class MultiArray { getLength(dim = 0) { return this.lengths[dim] ?? 0; } + isInitialized(indexes) { + const offset = this.indexesToOffset(indexes); + return this.initialized[offset] ?? false; + } + markAsInitialized(indexes) { + const offset = this.indexesToOffset(indexes); + this.initialized[offset] = true; + } } class ErrorIndexOutOfRange extends Error { diff --git a/src/pil.js b/src/pil.js index 796af5a..94166b0 100755 --- a/src/pil.js +++ b/src/pil.js @@ -17,6 +17,8 @@ const argv = require("yargs") .alias("f", "includePathFirst") .argv; +Error.stackTraceLimit = Infinity; + async function run() { let inputFile; if (argv._.length == 0) { diff --git a/src/pil_parser.jison b/src/pil_parser.jison index 59c9fd3..bf3b210 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -655,7 +655,7 @@ data_array function_call : name_optional_index '(' multiple_expression_list ')' - { $$ = { type: 'call', function: $1, args: $3.values } } + { $$ = { type: 'call', function: $1, args: $3 } } ; delayed_function_event @@ -678,7 +678,7 @@ defined_scopes delayed_function_call : ON delayed_function_event defined_scopes name_optional_index '(' multiple_expression_list ')' - { $$ = { type: 'delayed_function_call', event: $2, scope: $3, function: $4, args: $6.values } } + { $$ = { type: 'delayed_function_call', event: $2, scope: $3, function: $4, args: $6 } } ; @@ -1072,19 +1072,20 @@ sequence multiple_expression_list : %empty %prec EMPTY - { $$ = {values: []} } + { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [] }); console.log('C', $$) } | multiple_expression_list ',' expression %prec ',' - { $$ = $1; $$.values.push($3) } + { $$ = $1; console.log($$); $$.pushItem(ExpressionFactory.fromObject($3)); } | multiple_expression_list ',' '[' expression_list ']' %prec ',' - { $$ = $1; $$.values.push({ type: 'expression_list', values: $4.values }) } + { $$ = $1; $$.pushItem(ExpressionFactory.fromObject({ type: 'expression_list', values: $4.values })); } | '[' expression_list ']' %prec NO_EMPTY - { $$ = { type: 'expression_list', values: $2.values } } + { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: + [ExpressionFactory.fromObject({ type: 'expression_list', values: [$2.values]})]}); console.log('A',$$) } | expression - { $$ = { type: 'expression_list', values: [$1] } } + { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$1] }); console.log('B',$$) } ; expression_list @@ -1278,7 +1279,7 @@ expression { $$ = $1.insert('shr', ExpressionFactory.fromObject($3)) } | '!' expression %prec '!' - { $$ = $1.insert('not') }) + { $$ = $2.insert('not') }) | expression '+' expression %prec '+' { $$ = $1.insert('add', ExpressionFactory.fromObject($3)) } diff --git a/src/processor.js b/src/processor.js index fcb0741..0267c40 100644 --- a/src/processor.js +++ b/src/processor.js @@ -38,6 +38,7 @@ const util = require('util'); module.exports = class Processor { constructor (Fr, parent) { + this.sourceRef = '(processor constructor)'; this.compiler = parent; this.trace = true; this.Fr = Fr; @@ -117,9 +118,12 @@ module.exports = class Processor { this.functionDeep = 0; this.callstack = []; // TODO this.breakpoints = ['expr.pil:26']; + this.sourceRef = '(built-in-class)'; this.loadBuiltInClass(); this.scopeType = 'proof'; this.currentSubproof = false; + + this.sourceRef = '(init)'; } loadBuiltInClass() { const filenames = fs.readdirSync(__dirname + '/builtin'); @@ -150,12 +154,15 @@ module.exports = class Processor { assert(bits === this.log2(value+1n)); // if (value > 0n) console.log([value-1n, bits, this.log2(value-1n)]); } + this.sourceRef = '(start-execution)'; // TODO: use a constant this.references.declare('N', 'int', [], { global: true, sourceRef: this.sourceRef }); this.references.declare('BITS', 'int', [], { global: true, sourceRef: this.sourceRef }); this.references.declare('__SUBPROOF__', 'string', [], { global: true, sourceRef: this.sourceRef }); this.scope.pushInstanceType('proof'); + this.sourceRef = '(execution)'; this.execute(statements); + this.sourceRef = '(subproof-execution)'; this.executeSubproofs(); this.finalProofScope(); this.scope.popInstanceType(); diff --git a/src/reference.js b/src/reference.js index ab2734e..652c80c 100644 --- a/src/reference.js +++ b/src/reference.js @@ -43,7 +43,8 @@ class Reference { return (indexes.length === 0 || !this.array) ? this.initialized : this.array.isInitialized(indexes); } getId(indexes = []) { - return (indexes.length === 0 || !this.array) ? this.locator : this.array.getIndexesOffset(indexes); + console.log(`getId ${this.name} ${Array.isArray(indexes) ? '[' + indexes.join(',') + ']':indexes} ${this.array ? this.array.toDebugString():''}`); + return (indexes.length === 0 || !this.array) ? this.locator : this.array.getLocator(this.locator, indexes); } set (value, indexes = []) { assert(value !== null); // to detect obsolete legacy uses @@ -60,6 +61,8 @@ class Reference { #doInit(value, indexes) { const id = this.getId(indexes); assert(id !== null); + console.log(this.name, id, this.instance.type); + console.log(value); this.instance.set(id, value); this.markAsInitialized(indexes); } diff --git a/src/references.js b/src/references.js index 830ee6a..bb46a10 100644 --- a/src/references.js +++ b/src/references.js @@ -415,7 +415,8 @@ module.exports = class References { return reference; } isVisible(def) { - return !def.scopeId || def.type === 'constant' || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); + return !def.scopeId || def.type === 'constant' || def.type === 'function' || + def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } /** * @@ -461,13 +462,13 @@ module.exports = class References { } if (!reference) { if (typeof defaultValue !== 'undefined') return defaultValue; - throw new Error(`Reference ${names.join(',')} not found`); + throw new Error(`Reference ${names.join(',')} not found on ${Context.sourceRef}`); } // constants are visible inside functions if (this.isVisible(reference) === false) { if (typeof defaultValue !== 'undefined') return defaultValue; - throw new Error(`Reference ${names.join(',')} not visible from current scope`); + throw new Error(`Reference ${names.join(',')} not visible from current scope ${Context.sourceRef}`); } return reference; } @@ -546,7 +547,9 @@ module.exports = class References { assert(value !== null); // to detect obsolete legacy uses // getReference produce an exception if name not found - this.getReference(name).set(value, indexes); + const reference = this.getReference(name); + console.log(reference); + reference.set(value, indexes); } unset(name) { diff --git a/test/pil2/vadcop-fibonacci-std/fibonacci.pil b/test/pil2/vadcop-fibonacci-std/fibonacci.pil new file mode 100644 index 0000000..94f979a --- /dev/null +++ b/test/pil2/vadcop-fibonacci-std/fibonacci.pil @@ -0,0 +1,23 @@ +include "../vadcop/std_sum.pil" +include "module.pil"; + +public mod; +public in1; +public in2; +public out; + +subproof aggregate Fibonacci(2**16, 2**18) { + + subproofval aggregate(sum) gsum_fibonacci; + + col fixed L1 = [1,0...]; + col witness a,b; + + (b' - a) * (1 - L1') === 0; + L1 * (b - in1) === 0; + L1 * (a - in2) === 0; + + multiset_require(MODULE_ID, 1, [a*a + b*b, a']) +}; + + diff --git a/test/pil2/vadcop-fibonacci-std/module.pil b/test/pil2/vadcop-fibonacci-std/module.pil new file mode 100644 index 0000000..a3c1551 --- /dev/null +++ b/test/pil2/vadcop-fibonacci-std/module.pil @@ -0,0 +1,15 @@ +const int MODULE_ID = 1; + +subproof Module(2**16) { + + subproofval aggregate(sum) gsum_module; + + col fixed L1 = [1,0...]; + col witness x, q, x_mod; + + // TODO: verify range checks and x_mod < mod + x === q * mod + x_mod; + + + multiset_provide(MODULE_ID, 1, [x, q, x_mod]); +} \ No newline at end of file From 0b4d0257b6899e14f5b524c50f1b0b6c5801bdc7 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Wed, 25 Oct 2023 23:39:44 +0200 Subject: [PATCH 20/33] WIP --- src/assert.js | 1 - src/assign.js | 7 +- src/builtin/defined.js | 2 +- src/builtin/length.js | 18 +-- src/definition_items/expression_variable.js | 8 +- src/definition_items/public.js | 4 + src/definition_items/variable.js | 9 +- src/definition_items/witness_col.js | 4 + src/dynamic_multi_array.js | 2 +- src/expression.js | 66 ++++---- src/expression_factory.js | 26 ++-- src/expression_items/array_of.js | 26 +++- src/expression_items/expression_item.js | 2 +- src/expression_items/function_call.js | 3 +- src/expression_items/reference_item.js | 3 +- src/function.js | 162 ++++++++++++++++++-- src/indexable.js | 21 ++- src/iterator.js | 2 +- src/multi_array.js | 51 ++++-- src/processor.js | 62 ++++---- src/reference.js | 74 +++++++-- src/references.js | 16 +- test/pil2/features/basic_functions.pil | 40 +++++ 23 files changed, 433 insertions(+), 176 deletions(-) create mode 100644 test/pil2/features/basic_functions.pil diff --git a/src/assert.js b/src/assert.js index 936a56b..557c155 100644 --- a/src/assert.js +++ b/src/assert.js @@ -8,7 +8,6 @@ function assertLog(condition, info) { } function assertReturnInstanceOf(value, cls, info) { - console.log([value, info]); _assert(value instanceof cls); return value; } diff --git a/src/assign.js b/src/assign.js index f7ce3ee..7fef667 100644 --- a/src/assign.js +++ b/src/assign.js @@ -21,14 +21,17 @@ module.exports = class Assign { return value; } #assign (name, indexes, value) { - const array = Context.references.getArray(name, indexes); + // const array = Context.references.getArray(name, indexes); + const reference = Context.references.getReference(name); + return reference.set(value, indexes); + /* const dim = array.dim ?? 0; if (dim > 0) { // array asignation as array or subarray copy return this.assignArray(name, indexes, value, array); } console.log(value); - return Context.references.set(name, indexes, value); + return Context.references.set(name, indexes, value);*/ } assignType(type, name, indexes, value) { console.log(type); diff --git a/src/builtin/defined.js b/src/builtin/defined.js index 41a7caa..ddee17b 100644 --- a/src/builtin/defined.js +++ b/src/builtin/defined.js @@ -1,5 +1,5 @@ const Function = require("../function.js"); -const {MultiArray, ErrorIndexOutOfRange} = require("../multi_array.js"); +const MultiArray = require("../multi_array.js"); module.exports = class Defined extends Function { constructor (parent) { diff --git a/src/builtin/length.js b/src/builtin/length.js index cdfdac4..1621e92 100644 --- a/src/builtin/length.js +++ b/src/builtin/length.js @@ -1,4 +1,6 @@ const Function = require("../function.js"); +const StringValue = require('../expression_items/string_value.js'); +const IntValue = require('../expression_items/int_value.js'); module.exports = class Length extends Function { constructor (parent) { super(parent, {funcname: 'length'}); @@ -8,18 +10,16 @@ module.exports = class Length extends Function { throw new Error('Invalid number of parameters'); } const arg0 = s.args[0]; - if (arg0 && arg0.isReference()) { - const [instance,rinfo] = this.expressions.getReferenceInfo(arg0); - const operand = arg0.getAloneOperand(); - return rinfo.array ? BigInt(rinfo.array.getLength(operand.dim)) : 0n; + const item = arg0.eval(); + if (item instanceof StringValue) { + return {result: BigInt(item.length)}; } - const value = this.expressions.e2value(s.args[0]); - if (typeof value === 'string') { - return BigInt(value.length); + if (arg0 && arg0.isReference()) { + return {result: item.array ? BigInt(item.array.getLength(0)) : 0n}; } - return 0n; + return {result: 0n}; } exec(s, mapInfo) { - return mapInfo; + return new IntValue(mapInfo.result); } } diff --git a/src/definition_items/expression_variable.js b/src/definition_items/expression_variable.js index c7bad47..17e2bbc 100644 --- a/src/definition_items/expression_variable.js +++ b/src/definition_items/expression_variable.js @@ -1,14 +1,20 @@ const Variable = require("./variable.js"); const ExpressionClass = require('../expression.js'); const ValueItem = require('../expression_items/value_item.js'); +const util = require('util'); +const {assert, assertLog} = require('../assert.js'); module.exports = class ExpressionVariable extends Variable { constructor (id, properties = {}) { super(id, properties); this.value = new ExpressionClass(); } setValue(value) { - super.setValue(value); + console.log('================================================================'); + console.log(util.inspect(value, false, 10, true)); + console.log('================================================================'); + // super.setValue(value); if (value instanceof ExpressionClass) { + assert(value.stack.length > 0); this.value = value.instance(); return; } diff --git a/src/definition_items/public.js b/src/definition_items/public.js index 52b84d1..fdf55ef 100644 --- a/src/definition_items/public.js +++ b/src/definition_items/public.js @@ -1,8 +1,12 @@ const ProofItem = require("./proof_item.js"); +const PublicItem = require('../expression_items/public.js'); module.exports = class Public extends ProofItem { constructor (id) { super(id); } + get value () { + return new PublicItem(this.id); + } getId() { return this.id; } diff --git a/src/definition_items/variable.js b/src/definition_items/variable.js index 220ff6b..9b6f25f 100644 --- a/src/definition_items/variable.js +++ b/src/definition_items/variable.js @@ -1,9 +1,8 @@ const RuntimeItem = require("./runtime_item.js"); module.exports = class Variable extends RuntimeItem { static directValue = true; - constructor (value) { - super(); - this.value = value; + constructor (id, properties = {}) { + super(id, properties); } getValue() { return this.value; @@ -11,8 +10,8 @@ module.exports = class Variable extends RuntimeItem { setValue(value) { this.value = value; } - dump() { - return `${this.constructor.name}(${this.value})`; + toString(options) { + return `*${this.constructor.name}(${this.value})[${this.value ? this.value.constructor.name : '??'}]`; } clone() { return new ValueItem(this.value); diff --git a/src/definition_items/witness_col.js b/src/definition_items/witness_col.js index 9abc538..d43c0f2 100644 --- a/src/definition_items/witness_col.js +++ b/src/definition_items/witness_col.js @@ -1,5 +1,6 @@ const ProofStageItem = require("./proof_stage_item.js"); const {assert, assertLog} = require('../assert.js'); +const WitnessColItem = require('../expression_items/witness_col.js') module.exports = class WitnessCol extends ProofStageItem { constructor (id, stage = 1) { assert(typeof id !== 'undefined'); @@ -11,4 +12,7 @@ module.exports = class WitnessCol extends ProofStageItem { console.log('CLONE_WITNESS:', this, cloned); return cloned; } + get value () { + return new WitnessColItem(this.id); + } } diff --git a/src/dynamic_multi_array.js b/src/dynamic_multi_array.js index e2e9aaf..8f84a36 100644 --- a/src/dynamic_multi_array.js +++ b/src/dynamic_multi_array.js @@ -43,7 +43,7 @@ module.exports = class DynamicMultiArray extends MultiArray { createSubArray(dim) { return new MultiArray(this.lengths.slice(-dim)); } - applyIndex(obj, indexes) { + applyIndexes(obj, indexes) { const res = this.getIndexesTypedOffset(indexes); let dup = obj.clone() if (dup.id) { diff --git a/src/expression.js b/src/expression.js index 67da00e..096c396 100644 --- a/src/expression.js +++ b/src/expression.js @@ -41,6 +41,11 @@ class Expression extends ExpressionItem { this.stack = []; this.fixedRowAccess = false; } + static createFrom(object) { + const res = new Expression(); + res._set(object); + return res; + } get isExpression() { return true; } @@ -416,16 +421,30 @@ class Expression extends ExpressionItem { // cloned.dumpStackResults(stackResults, ''); return cloned; } - eval() { + evalAsValue(options) { + return this.eval({...options, onlyAsValue: true}); + } + eval(options = {}) { if (this.stack.length === 0) { return this; } - let options = {}; + console.log('CALL #01', options); let stackResults = this.evaluateOperands(options); - // this.instanceExpressions(options); + console.log('CALL RESULTS', stackResults); + console.log('CALL #02'); this.evaluateFullStack(stackResults, options); - console.log('====[ RESULT ]====> ', stackResults[0][0], this.stack.length); - return stackResults[this.stack.length-1][0]; + console.log('CALL #03'); + if (!options.onlyAsValue && stackResults[0][0] instanceof ExpressionItems.NonRuntimeEvaluableItem) { + // TODO: optimize evaluateFullStack was done .... + console.log('CALL #04'); + const res = this.instance(); + console.log('CALL #05'); + return res; + } + console.log('CALL #06'); + const res = stackResults[this.stack.length-1][0]; + console.log('CALL #07'); + return res; } evaluateFullStack(stackResults, options) { this.evaluateStackPos(stackResults, this.stack.length - 1, options); @@ -642,31 +661,14 @@ class Expression extends ExpressionItem { } return result; } - /* evalAsIntValue() { - return IntValue.castTo(this.eval()); - }*/ - evaluateValueAsNumber(value, options) { - console.log(value); - let evaluated = false; - while (true) { - if (typeof value === 'number' || typeof value === 'bigint' || typeof value === 'boolean') { - return Number(value); - } - if (value instanceof ExpressionItem) { - return value.asInt(); - } - if (evaluated) break; - value = this.evaluateValue(value, options); - evaluated = true; - } - throw new Error(`Value isn't a number`); - } - evaluateValuesAsNumbers(values, options) { - if (typeof values === 'undefined') { - return (options ? options.default ?? [] : []); + evalAsInt(options = {}) { + const value = this.evalAsValue(options); + const res = value.asIntDefault(false); + if (res === false) { + console.log(value); + throw new Error(this.toString() + " isn't a number"); } - console.log(values); - return values.map(value => this.evaluateValueAsNumber(value, options)); + return res; } getArrayResult(results, indexes, options) { console.log(results); @@ -697,8 +699,9 @@ class Expression extends ExpressionItem { // when evaluates single operands, StackItem is a reference to stack position // and it could be evaluated when all operands are left-to-right evaluated if (operand instanceof ExpressionItems.StackItem) continue; + console.log(`CALL OPERAND ${stpos}/${this.stack.length} ${operandIndex}/${st.operands.length} ${operand}`); const result = operand.eval(options); - + operandResults.push(result); if (options.instance && result !== null) { if (result instanceof Expression) { this.dump('THIS BEFORE INSERTSTACK'); @@ -708,6 +711,7 @@ class Expression extends ExpressionItem { st.operands[operandIndex] = new ExpressionItems.StackItem(stackOffset); this.dump('THIS AFTER INSERTSTACK'); } else { + console.log(result); st.operands[operandIndex] = assertExpressionItem(result); } } @@ -1080,7 +1084,7 @@ class Expression extends ExpressionItem { } asInt() { let value = this.eval(); - assert((value instanceof Expression) === false); + assertLog((value instanceof Expression) === false, value); if (typeof value.asInt === 'function') { return value.asInt(); } diff --git a/src/expression_factory.js b/src/expression_factory.js index 80c2463..ef39df9 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -13,10 +13,10 @@ module.exports = class ExpressionFactory { static fromObject(obj) { if (obj instanceof Expression) { - console.log('#########', Object.keys(obj).includes('type')); + // console.log('#########', Object.keys(obj).includes('type')); return obj; } - console.log(obj); + // console.log(obj); assertLog(typeof obj === 'object', obj); assertLog(typeof obj.op === 'undefined', obj); obj = {...obj}; @@ -24,7 +24,7 @@ module.exports = class ExpressionFactory { assert(obj.type !== 'object' && obj.type !== 'objects'); if (obj.dim === 0) delete obj.dim; - console.log(obj); + // console.log(obj); const type = obj.type; let item = ExpressionFactory.router.go(obj); @@ -62,11 +62,11 @@ module.exports = class ExpressionFactory { return elist; } static fromReference(obj) { - if (obj.rowOffset) { - console.log('ROWOFFSET.FROMREFERENCE'); - console.log(obj.rowOffset); - } - console.log(obj); + // if (obj.rowOffset) { + // console.log('ROWOFFSET.FROMREFERENCE'); + // console.log(obj.rowOffset); + // } + // console.log(obj); let res = new ReferenceItem(obj.name, obj.indexes ?? [], obj.rowOffset); delete obj.name; delete obj.indexes; @@ -95,11 +95,11 @@ module.exports = class ExpressionFactory { return res; } static fromCall(obj) { - console.log(`##### CALL ${obj.function.name} ${obj.debug}`); - console.log(util.inspect(obj, false, 10, true)); + // console.log(`##### CALL ${obj.function.name} ${obj.debug}`); + // console.log(util.inspect(obj, false, 10, true)); let res = new FunctionCall(obj.function.name, obj.args ?? [], obj.indexes ?? [], { name: obj.function.name.debug}); - console.log(res); + // console.log(res); delete obj.function; delete obj.indexes; delete obj.dim; @@ -111,7 +111,7 @@ module.exports = class ExpressionFactory { delete obj.name; delete obj.cast; delete obj.value; - console.log(res); + // console.log(res); return res; } static fromRowOffset(obj) { @@ -123,7 +123,7 @@ module.exports = class ExpressionFactory { delete obj.current; delete obj.value; delete obj.prior; - console.log(res); + // console.log(res); return res; } // TODO: positionalParams diff --git a/src/expression_items/array_of.js b/src/expression_items/array_of.js index f4004b6..3d3bd13 100644 --- a/src/expression_items/array_of.js +++ b/src/expression_items/array_of.js @@ -1,15 +1,27 @@ const LabelRanges = require("../label_ranges.js"); const RuntimeItem = require("./runtime_item.js"); - +const MultiArray = require('../multi_array.js'); +const {assert, assertLog} = require('../assert.js'); +const Context = require('../context.js'); module.exports = class ArrayOf extends RuntimeItem { - constructor (baseCls, id, type, instance) { + constructor (instanceType, array) { super(); - this.baseCls = baseCls; - this.id = id; - this.rtype = type; - this.instance = instance; + assert(array instanceof MultiArray); + + this.instanceType = instanceType; + this.array = array.clone(); + } + get instance() { + return Context.references.getTypeInstance(this.instanceType); } cloneInstance() { - return new ArrayOf(this.baseCls, this.id, this.rtype, this. instance); + return new ArrayOf(this.instanceType, this.array); + } + evalInside() { + return this.clone(); + } + getItem(indexes) { + const id = this.array.indexesToOffset(indexes); + return this.instance.getItem(id); } } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 594970f..58d2800 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -153,7 +153,7 @@ class ExpressionItem { } } evalInside(options = {}) { - throw new Error(`eval not defined for class ${this.constructor.name}`); + throw new Error(`evalInside not defined for class ${this.constructor.name}`); } evalPrior(options) { if (!this.rowOffset || !this.rowOffset.isPriorRows()) { diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 3cf3bd6..68592dd 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -33,7 +33,8 @@ module.exports = class FunctionCall extends RuntimeItem { this.funcdef = source.funcdef; } evalInside(options) { - console.log([`#FCALL.EVAL#${this.name} ${Context.sourceTag}`, this.args]); + console.log([`#F CALL.EVAL #${this.name} ${Context.sourceTag}`, this.args]); + if (Context.sourceTag === 'basic_functions.pil:12') debugger; const definition = Context.references.get(this.name, options); const res = Context.processor.executeFunctionCall(this.name, this); console.log(res); diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index 8c23c80..a65e4b4 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -41,6 +41,7 @@ module.exports = class ReferenceItem extends RuntimeItem { // TODO: next console.log(`REFERENCE ${this.name} [${this.indexes.join('][')}]`) console.log(item); - return item; + console.log(item.eval()); + return item.eval(); } } diff --git a/src/function.js b/src/function.js index 9b4af5e..33026e3 100644 --- a/src/function.js +++ b/src/function.js @@ -32,40 +32,66 @@ module.exports = class Function { this.statements = value.statements; } defineArguments(args) { - console.log(`#FCALL.DEFINE#${this.name}`, args.length); this.args = {}; for (const arg of args) { const name = arg.name; if (name === '') throw new Error('Invalid argument name'); if (name in this.args) throw new Error(`Duplicated argument ${name}`); this.args[name] = arg; - // console.log(['function', this.name, name, arg]); } } + // evaluate all called arguments on call scope before + // scope changes + evalArguments(args) { + let eargs = []; + for (const arg of args) { + eargs.push(arg.eval()); + } + return eargs; + } // mapArgument was called before enter on function visibility scope because // inside function args "values" aren't visible. mapArguments(s) { - console.log('##### MAP ARGUMENTS #######'); - // TODO: class o class-by-type to convert, cast, copy... between types + const eargs = this.evalArguments(s.args); + const scall = this.callToString(eargs); + this.checkArgumentsTypes(eargs); + return {eargs, scall}; + } - /* - for (const arg of s.args) { - console.log(arg); - if (arg.stack && arg.stack[0]) { - console.log(arg.stack[0].operands); - } + // calculate a string to debug, with function name and list of arguments + // with its values + callToString(eargs) { + let iarg = 0; + let textArgs = []; + for (const name in this.args) { + textArgs.push(name + ': ' + eargs[iarg].toString()); + ++iarg; + } + return this.name + '(' + textArgs.join(', ') + ')'; + } + + // to check arguments used in call, checks if its types and dimensions match with + // the arguments defined on function + checkArgumentsTypes(args) { + let iarg = 0; + for (const name in this.args) { + // TODO: checking types and dims + args[iarg].dump(); + ++iarg; } - */ + } + getArgumentsReferences(args) { let iarg = 0; let extraInfo = ''; for (const name in this.args) { try { - // console.log(`MAP-ARGUMENTS ${this.name} (arg[${iarg}]: ${name})`); const arg = this.args[name]; + if (name === 'cols') debugger; // TODO: arrays and pol references ... let type = arg.type; const argDim = arg.dim ? arg.dim : 0; if (arg.reference) { + assert(false); // console.log(`${this.name}.MAP-REFERENCE`); const ref = s.args[iarg].getReference(); @@ -90,7 +116,7 @@ module.exports = class Function { console.log(ref); console.log(ref.name); const def = Context.references.getDefinition(ref.name); - const dup = def.array.applyIndex(def, ref.__indexes ?? []); + const dup = def.array.applyIndexes(def, ref.__indexes ?? []); if (dup.array.dim !== argDim) { console.log(dup.array.dim, argDim); @@ -119,6 +145,13 @@ module.exports = class Function { console.log(value); Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); } + } else if (argDim) { + console.log(s.args[iarg].eval()); + const ref = s.args[iarg].getReference(); + const def = Context.references.getDefinition(ref.name); + const dup = def.array.applyIndexes(def, ref.__indexes ?? []); + Context.processor.declareReference(name, type, dup.array.lengths, {}); + Context.processor.assign.assign(name, dup.array.lengths, s.args[iarg]); } else if (!(s.args[iarg] instanceof Expression)) { console.log(arg); console.log([this.name, iarg, s.args[iarg], s.args.length]); @@ -127,11 +160,15 @@ module.exports = class Function { // const value = s.args[iarg].instance().getAloneOperand(); // const value = s.args[iarg].getAloneOperand(); // const value = s.args[iarg].getReference(); + console.log(util.inspect(s.args[iarg], false, 10, true)); const value = s.args[iarg].evaluateAloneReference(); + console.log(util.inspect(s.args[iarg].eval(), false, 10, true)); + console.log(util.inspect(s.args[iarg].instance(), false, 10, true)); const dim = value.array ? value.array.dim : 0; if (dim !== argDim) { - throw new Error(`Invalid array on ${Context.sourceRef}`); + throw new Error(`Invalid array on ${Context.sourceRef} ${dim} != ${argDim}`); } + console.log(util.inspect(value, false, 10, true)); Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } } @@ -143,7 +180,99 @@ module.exports = class Function { } return false; } - exec(s, mapInfo) { + declareAndInitializeArguments(eargs) { + let iarg = 0; + for (const name in this.args) { + this.setArgument(name, eargs[iarg]); + ++iarg; + } + } + setArgument(name, value) { + const arg = this.args[name]; + console.log(name); + console.log(arg); + console.log(value); + // REVIEW: use arg.type, but perphaps we need to do a casting + console.log(value.array); + Context.references.declare(name, arg.type, value.array ? value.array.lengths: [], {}, value); + + // TODO: arrays. + /* + let type = arg.type; + const argDim = arg.dim ? arg.dim : 0; + } else if (arg.type === 'int' || arg.type === 'fe') { + if (argDim) { + s.args[iarg].eval(); + const ref = s.args[iarg].getReference(); + console.log(ref); + console.log(ref.name); + const def = Context.references.getDefinition(ref.name); + const dup = def.array.applyIndexes(def, ref.__indexes ?? []); + + if (dup.array.dim !== argDim) { + console.log(dup.array.dim, argDim); + throw new Error(`Invalid array on ${Context.processor.sourceRef}`); + } + + Context.processor.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); + } else { + console.log([name, iarg, s.args.length]); + const value = s.args[iarg].eval(); + // TODO: review? no referece? + Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); + } + } else { + // console.log(`MAP-${arg.type}`); + // TODO: type conversion, mapping in other class + console.log(s.args[iarg]); + if (s.args[iarg] instanceof ExpressionItems.ExpressionList) { + // check (argDim === 1 && arg.type === 'expr') + const list = new List(this, s.args[iarg], false); + const values = s.args[iarg].items; + Context.processor.declareReference(name, type, [values.length], {}); + let index = 0; + for (const value of list.values) { + extraInfo = index; + console.log(value); + Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); + } + } else if (argDim) { + console.log(s.args[iarg].eval()); + const ref = s.args[iarg].getReference(); + const def = Context.references.getDefinition(ref.name); + const dup = def.array.applyIndexes(def, ref.__indexes ?? []); + Context.processor.declareReference(name, type, dup.array.lengths, {}); + Context.processor.assign.assign(name, dup.array.lengths, s.args[iarg]); + } else if (!(s.args[iarg] instanceof Expression)) { + console.log(arg); + console.log([this.name, iarg, s.args[iarg], s.args.length]); + EXIT_HERE; + } else { + // const value = s.args[iarg].instance().getAloneOperand(); + // const value = s.args[iarg].getAloneOperand(); + // const value = s.args[iarg].getReference(); + console.log(util.inspect(s.args[iarg], false, 10, true)); + const value = s.args[iarg].evaluateAloneReference(); + console.log(util.inspect(s.args[iarg].eval(), false, 10, true)); + console.log(util.inspect(s.args[iarg].instance(), false, 10, true)); + const dim = value.array ? value.array.dim : 0; + if (dim !== argDim) { + throw new Error(`Invalid array on ${Context.sourceRef} ${dim} != ${argDim}`); + } + console.log(util.inspect(value, false, 10, true)); + Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); + } + } + ++iarg; + } catch (e) { + console.log(`ERROR mapping parameter ${name} ${extraInfo} of function ${this.name} on ${Context.sourceRef}`); + throw e; + } + }*/ + return false; + } + exec(callInfo, mapInfo) { + this.declareAndInitializeArguments(mapInfo.eargs); console.log(Context.constructor.name); let res = Context.processor.execute(this.statements, `FUNCTION ${this.name}`); if (res instanceof ReturnCmd) { @@ -153,4 +282,7 @@ module.exports = class Function { } return res; } + toString() { + return `[Function ${this.name}${this.args ? '(' + Object.keys(this.args).join(',') + ')': ''}]`; + } } diff --git a/src/indexable.js b/src/indexable.js index 2601c1c..080b711 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -86,18 +86,13 @@ module.exports = class Indexable { if (typeof res.getItem === 'function') { return res.getItem(); } - if (this.expressionItemClass && (res instanceof this.expressionItemClass) === false) { - if (typeof res.value !== 'undefined' && res.value instanceof this.expressionItemClass) { - return res.value.clone(); - } - // REVIEW, empty properties - properties = properties ?? {}; - res = new this.expressionItemClass(id); - for (const property in properties) { - res[property] = properties[property]; - } + if (!this.expressionItemClass || res instanceof this.expressionItemClass) { + return res; } - return res; + if (typeof res.value !== 'undefined' && res.value instanceof this.expressionItemClass) { + return res.value.clone(); + } + return this.expressionItemClass.createFrom(res.value); } getLabel(id, options) { @@ -123,7 +118,9 @@ module.exports = class Indexable { set(id, value) { const item = this.get(id); console.log(item); - console.log(value); + console.log(value.constructor.name); + if (value && typeof value.toString === 'function') console.log(value.toString()); + else console.log(value); assertLog(item && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); item.setValue(value); /* diff --git a/src/iterator.js b/src/iterator.js index 19afbb5..5c48764 100644 --- a/src/iterator.js +++ b/src/iterator.js @@ -42,7 +42,7 @@ module.exports = class Iterator { } getValue() { - return this.reference.array.applyIndex(this.reference, [this.index]); + return this.reference.array.applyIndexes(this.reference, [this.index]); } *[Symbol.iterator]() { diff --git a/src/multi_array.js b/src/multi_array.js index face786..3010d90 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -1,16 +1,38 @@ const {assert, assertLog} = require('./assert.js'); class MultiArray { - constructor (lengths, debug) { - this.debug = debug || ''; + static ErrorIndexOutOfRange = class extends Error { + } + constructor (lengths, options = {}) { + // baseOffset is accumulated offset, means parentOffset + new offset. + this.baseOffset = options.baseOffset ?? 0; this.initOffsets(lengths); - this.initialized = []; + + // if parentInitizalized means need to extract + if (options.parentInitialized) { + // calculate relative offset from parent because initialized contains only + // parent initialized values. + const offset = this.baseOffset - options.parentOffset ?? 0; + this.initialized = options.parentInitialized.slice(offset, offset + this.size); + } else { + this.initialized = options.initialized ?? []; + } } toDebugString() { return '['+ this.lengths.join(',')+']'; } clone() { - const cloned = new MultiArray(this.lengths, this.debug); - cloned.initialized = [...this.initialized]; + const cloned = new MultiArray(this.lengths, { + baseOffset: this.baseOffset, + initialized: [...this.initialized]}); + return cloned; + } + createSubArray(indexes, locatorOffset) { + const [offset, dims] = this.getIndexesOffset(indexes); + const dim = this.offsets.length - dims; + const cloned = new MultiArray(this.lengths.slice(-dim), { + baseOffset: this.baseOffset + offset + locatorOffset, + parentOffset: this.baseOffset, + parentInitialized: this.initialized }); return cloned; } checkIndexes(indexes) { @@ -48,10 +70,7 @@ class MultiArray { } return indexes; } - createSubArray(dim) { - return new MultiArray(this.lengths.slice(-dim)); - } - applyIndex(obj, indexes) { + applyIndexes(obj, indexes) { const res = this.getIndexesTypedOffset(indexes); let dup = obj.clone() if (dup.id) { @@ -62,12 +81,15 @@ class MultiArray { } return dup; } + isFullIndexed(indexes) { + return (indexes.length === this.dim); + } locatorIndexesApply(locatorId, indexes) { console.log([locatorId, indexes, this.dim, this.lengths]); const [offset, dims] = this.getIndexesOffset(indexes); console.log([offset, dims]); if ((this.dim - dims) > 0) { - throw new Error(''); + throw new Error(`ERROR ON ARRAY ${offset} ${dims} ${this.dim}`); } return locatorId + offset; } @@ -89,7 +111,7 @@ class MultiArray { if (Number(indexes[idim]) >= this.lengths[idim]) return [false, idim]; offset += this.offsets[idim] * Number(indexes[idim]); } - return [offset, dims]; + return [offset + this.baseOffset, dims]; } isValidIndexes(indexes) { const [offset, dims] = this.getIndexesOffset(indexes); @@ -107,6 +129,7 @@ class MultiArray { if (dim === 0) { return {offset, array: false}; } + EXIT_HERE; // return {offset, dim, lengths: dim ? this.lengths.slice(-dim):[], array: this.createSubArray(dim)}; return {offset, array: this.createSubArray(dim)}; } @@ -144,8 +167,4 @@ class MultiArray { } } -class ErrorIndexOutOfRange extends Error { - -} - -module.exports = { MultiArray, ErrorIndexOutOfRange }; +module.exports = MultiArray; diff --git a/src/processor.js b/src/processor.js index 0267c40..3cf00a5 100644 --- a/src/processor.js +++ b/src/processor.js @@ -290,43 +290,31 @@ module.exports = class Processor { } executeFunctionCall(name, callinfo) { const func = this.builtIn[name] ?? this.references.get(name); + console.log(`CALL ${name}`); console.log(callinfo); if (func) { - this.callstack.push(name); + const mapInfo = func.mapArguments(callinfo); + this.callstack.push(mapInfo.scall ?? name); ++this.functionDeep; this.scope.push(); - console.log(func.constructor.name); - const mapInfo = func.mapArguments(callinfo); this.references.pushVisibilityScope(); const res = func.exec(callinfo, mapInfo); this.references.popVisibilityScope(); this.scope.pop(); --this.functionDeep; this.callstack.pop(); + console.log(`END CALL ${name}`) return res; } this.error({}, `Undefined function ${name}`); } execCall(st) { const name = st.function.name; - const func = this.builtIn[name] ?? this.references.get(name); - - if (func) { - this.callstack.push(st.debug); - ++this.functionDeep; - this.scope.push(); - console.log(func.constructor.name); - const mapInfo = func.mapArguments(st); - this.references.pushVisibilityScope(); - const res = func.exec(st, mapInfo); - this.references.popVisibilityScope(); - this.scope.pop(); - --this.functionDeep; - this.callstack.pop(); - return res; - } - this.error(st, `Undefined function ${name}`); + console.log(`CALL (EXEC) ${name}`); + const res = this.executeFunctionCall(name, st); + console.log(`END CALL (EXEC) ${name}`); + return res; } execAssign(st) { // type: number(int), fe, string, col, challenge, public, prover, @@ -335,7 +323,8 @@ module.exports = class Processor { const indexes = this.decodeIndexes(st.name.indexes) const names = this.context.getNames(st.name.name); console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> EXEC-ASSIGN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'); - if (st.value.type === 'sequence') { +// if (st.value.type === 'sequence') { + if (st.value instanceof ExpressionItems.ExpressionList) { const sequence = new Sequence(this, st.value, ExpressionItems.IntValue.castTo(this.references.get('N'))); sequence.extend(); console.log(sequence.size); @@ -865,13 +854,7 @@ module.exports = class Processor { } const res = this.references.declare(name, type, lengths, data); if (initValue !== null) { - if (type === 'fixed') { - console.log('FIXED-SET', initValue.getValue(0), initValue.getValue(1)); - } this.references.set(name, [], initValue); - if (type === 'fixed') { - console.log('FIXED-SET', this.fixeds.values[0]); - } } return res; } @@ -934,31 +917,40 @@ module.exports = class Processor { let initValue = null; if (init) { console.log([name, s.vtype, Context.sourceRef]); - if (s.init[index] instanceof Expression) { - s.init[index].dump(`+++++++ INIT VARIABLE ${name} ++++++++++`); - const expr2 = s.init[index].instance(); - expr2.dump(`+++++++ INIT VARIABLE INSTANCED ${name} ++++++++++`); - } switch (s.vtype) { case 'expr': // s.init[index].expr.dump('INIT1 '+name); console.log(s.init[index]); // initValue = s.init[index].eval(); - initValue = s.init[index].instance(); + console.log('CALL #2.1'); + initValue = s.init[index].eval(); + console.log('CALL #2.1E'); console.log(initValue); + console.log('CALL #2.1F'); // initValue.dump('INIT2 '+name); break; case 'int': console.log(s); - initValue = new ExpressionItems.IntValue(this.expressions.e2value(s.init[index])); + console.log('CALL #2.2'); + console.log(s.init[index]); + const _v = s.init[index].eval(); + console.log(_v); + console.log('CALL #2.2E'); + initValue = new ExpressionItems.IntValue(_v); + console.log('CALL #2.2F'); break; case 'string': + console.log('CALL #2.3'); initValue = new ExpressionItems.StringValue(this.expressions.e2value(s.init[index])); + console.log('CALL #2.3E'); break; } } + console.log('CALL #_3'); console.log(initValue); + console.log('CALL #3'); this.references.declare(name, s.vtype, lengths, { scope, sourceRef, const: s.const ?? false }, initValue); + console.log('CALL #3E'); // if (initValue !== null) this.references.set(name, [], initValue); } } @@ -1022,6 +1014,8 @@ module.exports = class Processor { throw new Error('Return is called out of function scope'); } const res = s.value.instance(); + console.log(res); + console.log(res.eval()); this.traceLog(`[RETURN.END ${sourceRef}] ${this.scope.deep}`); return new ReturnCmd(res); } diff --git a/src/reference.js b/src/reference.js index 652c80c..d42e672 100644 --- a/src/reference.js +++ b/src/reference.js @@ -1,5 +1,6 @@ const {assert, assertLog} = require('./assert.js'); -const {MultiArray} = require("./multi_array.js"); +const MultiArray = require("./multi_array.js"); +const ArrayOf = require('./expression_items/array_of.js'); /** * @property {MultiArray} array @@ -46,10 +47,37 @@ class Reference { console.log(`getId ${this.name} ${Array.isArray(indexes) ? '[' + indexes.join(',') + ']':indexes} ${this.array ? this.array.toDebugString():''}`); return (indexes.length === 0 || !this.array) ? this.locator : this.array.getLocator(this.locator, indexes); } - set (value, indexes = []) { + set (value, indexes = [], options = {}) { + console.log(indexes); + console.log(`set(${this.name}, [${indexes.join(',')}]`); assert(value !== null); // to detect obsolete legacy uses + if (!this.array || this.array.isFullIndexed(indexes)) { + return this.setOneItem(value, indexes, options); + } + this.setArrayLevel(0, indexes, value, options); + // At this point, it's a array initilization + } + setArrayLevel(level, indexes, value, options = {}) { + console.log(`setArrayLevel(${this.name} ${level}, [${indexes.join(',')}]`); + const len = this.array.lengths[level]; + for (let index = 0; index < len; ++index) { + let _indexes = [...indexes]; + _indexes.push(index); + if (level + 1 === this.array.dim) { + this.setOneItem(value.getItem(_indexes), _indexes, options); + continue; + } + this.setArrayLevel(level+1, _indexes, value, options); + } + } + // setting by only one element + setOneItem(value, indexes, options = {}) { + console.log(this.name, value); if (!this.isInitialized(indexes)) { return this.#doInit(value, indexes); + } else if (options.doInit) { + // called as doInit:true but it's initizalized before + throw new Error('value initialized'); } const id = this.getId(indexes); if (this.const) { @@ -62,17 +90,14 @@ class Reference { const id = this.getId(indexes); assert(id !== null); console.log(this.name, id, this.instance.type); - console.log(value); + if (typeof value.toString === 'function') console.log(value.toString()); + else console.log(value); this.instance.set(id, value); this.markAsInitialized(indexes); } - init (value, indexes = []) { + init (value, indexes = [], options = {}) { assert(value !== null); // to detect obsolete legacy uses - if (this.isInitialized(indexes)) { - // TODO: more info - throw new Error('value initialized'); - } - this.#doInit(value, indexes); + this.set(value, indexes, {...options, doInit: true}); } static getArrayAndSize(lengths) { // TODO: dynamic arrays, call to factory, who decides? @@ -86,17 +111,36 @@ class Reference { return this.instance.get(this.getId(indexes)); } getItem(indexes, options = {}) { - console.log(['GETITEM', indexes, options]); + console.log(['GETITEM', indexes, options, this.locator]); let locator = this.locator; let label = options.label; + + // indexes evaluation + let evaluatedIndexes = []; if (Array.isArray(indexes) && indexes.length > 0) { - const evaluatedIndexes = indexes.map(x => x.asInt()); + evaluatedIndexes = indexes.map(x => x.asInt()); if (label) label = label + '['+evaluatedIndexes.join('],[')+']'; - locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } - console.log(locator); - const res = options.const ? this.instance.getItem(locator, options) : this.instance.getConstItem(locator, options); - console.log(['GETITEM', res.constructor.name, res.definition, this.const]); + + // if array is defined + let res = false; + if (this.array) { + console.log(evaluatedIndexes); + if (this.array.isFullIndexed(evaluatedIndexes)) { + // full access => result an item (non subarray) + locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); + } else { + // parcial access => result a subarray + res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator)); + console.log(res); + } + } else if (evaluatedIndexes.length > 0) { + throw new Error('try to access to index on non-array value'); + } + if (res === false) { + res = options.const ? this.instance.getConstItem(locator, options) : this.instance.getItem(locator, options); + } + if (label) res.setLabel(label); else res.setLabel('___'); diff --git a/src/references.js b/src/references.js index bb46a10..b211072 100644 --- a/src/references.js +++ b/src/references.js @@ -1,5 +1,5 @@ const {assert, assertLog} = require('./assert.js'); -const {MultiArray} = require("./multi_array.js"); +const MultiArray = require("./multi_array.js"); const Expression = require("./expression.js"); const {ExpressionItem, ArrayOf} = require("./expression_items.js"); const Reference = require('./reference.js'); @@ -34,7 +34,7 @@ module.exports = class References { if (!reference.array) { return false; } - return reference.array.applyIndexes(indexes); + return reference.array.applyIndexes(reference, indexes); } getNameScope(name) { const nameInfo = this.decodeName(name); @@ -146,7 +146,6 @@ module.exports = class References { return false; } prepareScope(nameInfo, type, existingReference) { - if (nameInfo.isStatic) { return [Context.scope.declare(nameInfo.name, type, false, nameInfo.scope), nameInfo.scope]; } @@ -159,14 +158,14 @@ module.exports = class References { } return [scopeId, false]; } - declare (name, type, lengths = [], options = {}, initValue = null) { - + declare(name, type, lengths = [], options = {}, initValue = null) { + console.log(`declare(${name},${type},[${lengths.join(',')}])`); assert(typeof name === 'string'); assert(!name.includes('::object')); assert(!name.includes('.object')); const nameInfo = this.decodeName(name); - console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}`, options); + console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}[type: ${initValue instanceof Object ? initValue.constructor.name : typeof initValue}]`, options); let [array, size] = Reference.getArrayAndSize(lengths); @@ -211,7 +210,8 @@ module.exports = class References { } if (initValue !== null) { - console.log(initValue); + if (initValue && typeof initValue.toString === 'function') console.log(initValue.toString()); + else console.log(initValue); reference.init(initValue); } return id; @@ -548,10 +548,8 @@ module.exports = class References { // getReference produce an exception if name not found const reference = this.getReference(name); - console.log(reference); reference.set(value, indexes); } - unset(name) { let def = this.references[name]; if (def.array) delete def.array; diff --git a/test/pil2/features/basic_functions.pil b/test/pil2/features/basic_functions.pil new file mode 100644 index 0000000..0d199d6 --- /dev/null +++ b/test/pil2/features/basic_functions.pil @@ -0,0 +1,40 @@ +subproof Functions(2**23) { + col witness w; + int values[12][20]; + + function sum1(int a, int b) : int { + return a + b; + } + + function sum(int a, int bs[]) : int { + int total = a; + int count_ = a; + int count = length(bs); + for (int index = 0; index < count; index = index + 1) { + int count__ = index; + // total = sum1(total, bs[index]); + total = total + bs[index]; + } + int count___ = 34; + return total; + } + + function fact(int k): int { + if (k < 2) { + return 1; + } + return k * fact(k - 1); + } + + function procedure(int value) { + col witness p1; + + p1 === value; + } + int k[10]; + k[0] = 109; + expr e1 = 12; + int res = sum1(18, e1); + int res2 = sum(20, values[7]); + int res3 = sum(25, k); +} \ No newline at end of file From 92845d8e3ad5602eeb373b6ff40da98802772f80 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 2 Nov 2023 07:11:20 +0100 Subject: [PATCH 21/33] WIP pending finals and pilout errors --- package.json | 5 +- src/builtin/assert_eq.js | 10 +- src/builtin/defined.js | 26 +- src/builtin/error.js | 29 ++ src/containers.js | 6 +- src/debug_console.js | 44 +++ src/definition_items/expression_variable.js | 1 + src/exceptions.js | 6 +- src/exceptions/cannot_be_cast_to_type.js | 1 - src/exceptions/reference_not_found.js | 5 + src/exceptions/reference_not_visible.js | 5 + src/expression.js | 50 ++- src/expression_items/array_of.js | 16 +- src/expression_items/expression_list.js | 3 + src/expression_items/function_call.js | 2 +- src/expression_items/proof_item.js | 2 +- src/expression_items/string_value.js | 3 + src/expression_items/value_item.js | 3 + src/function.js | 21 +- src/indexable.js | 4 + src/iterator.js | 11 +- src/multi_array.js | 3 + src/pil.js | 35 +- src/processor.js | 24 +- src/reference.js | 11 +- src/references.js | 21 +- src/scope.js | 4 + test/pil2/components/expression.test.js | 374 +++++++----------- test/pil2/components/expression_build.test.js | 251 ++++++++++++ test/{ => pil2}/components/scope.test.js | 2 +- test/pil2/features/basic_functions.pil | 36 ++ test/pil2/vadcop/std_sum.pil | 26 +- 32 files changed, 689 insertions(+), 351 deletions(-) create mode 100644 src/builtin/error.js create mode 100644 src/debug_console.js create mode 100644 src/exceptions/reference_not_found.js create mode 100644 src/exceptions/reference_not_visible.js create mode 100644 test/pil2/components/expression_build.test.js rename test/{ => pil2}/components/scope.test.js (98%) diff --git a/package.json b/package.json index a8b3e4a..5ceb23b 100644 --- a/package.json +++ b/package.json @@ -33,15 +33,16 @@ "homepage": "https://github.com/0xpolygonhermez/pilcom#readme", "devDependencies": { "chai": "^4.3.6", + "fastfile": "^0.0.20", "ffjavascript": "^0.2.55", "jison": "^0.4.18", "mocha": "^10.0.0", "nyc": "^15.1.0", "tmp-promise": "^3.0.3", - "yargs": "^17.2.1", - "fastfile": "^0.0.20" + "yargs": "^17.2.1" }, "dependencies": { + "deep-equal-in-any-order": "^2.0.6", "lodash": "^4.17.21", "long": "^5.2.3", "protobufjs": "^7.2.3" diff --git a/src/builtin/assert_eq.js b/src/builtin/assert_eq.js index de0a0fe..075b658 100644 --- a/src/builtin/assert_eq.js +++ b/src/builtin/assert_eq.js @@ -1,5 +1,7 @@ const Function = require("../function.js"); const Expression = require('../expression.js'); +const Context = require('../context.js'); +const {assert, assertLog} = require('../assert.js'); module.exports = class AssertEq extends Function { constructor () { super(999999, {funcname: 'assert_eq'}); @@ -10,9 +12,11 @@ module.exports = class AssertEq extends Function { } assert(s.args[0] instanceof Expression); assert(s.args[1] instanceof Expression); - const arg0 = s.args[0].e2value(); - const arg1 = s.args[1].e2value(); - if (arg0 !== arg1) { + const arg0 = s.args[0].eval(); + const arg1 = s.args[1].eval(); + console.log(arg0); + console.log(arg1); + if (!arg0.equals(arg1)) { throw new Error(`Assert fails (${arg0} === ${arg1}) on ${Context.sourceRef}`); } return 0n; diff --git a/src/builtin/defined.js b/src/builtin/defined.js index ddee17b..3c3ed86 100644 --- a/src/builtin/defined.js +++ b/src/builtin/defined.js @@ -1,5 +1,7 @@ const Function = require("../function.js"); const MultiArray = require("../multi_array.js"); +const {IntValue} = require('../expression_items.js'); +const Exceptions = require('../exceptions.js'); module.exports = class Defined extends Function { constructor (parent) { @@ -10,12 +12,26 @@ module.exports = class Defined extends Function { throw new Error('Invalid number of parameters'); } const arg0 = s.args[0]; - if (arg0 && arg0.isReference()) { - const ref = arg0.getReference(); - // console.log(ref); - return this.references.isDefined(ref.name, ref.__indexes) ? 1n : 0n; + let value = false; + try { + if (arg0) { + value = arg0.eval(); + } + // if (arg0 && arg0.isReference()) { + // const ref = arg0.getReference(); + // return this.references.isDefined(ref.name, ref.__indexes) ? 1n : 0n; + // } + } catch (e) { + if (e instanceof Exceptions.ReferenceNotFound || e instanceof Exceptions.ReferenceNotVisible) { + console.log(`defined(${arg0.toString()}) EXCEPTION `, e.message); + } else { + throw e; + } } - return 0n; + console.log(value); + const res = new IntValue(value !== false ? 1n : 0n); + console.log(`defined(${arg0.toString()})`,res); + return res; } exec(s, mapInfo) { return mapInfo; diff --git a/src/builtin/error.js b/src/builtin/error.js new file mode 100644 index 0000000..95ac6fd --- /dev/null +++ b/src/builtin/error.js @@ -0,0 +1,29 @@ +const Function = require("../function.js"); +module.exports = class Error extends Function { + constructor (parent) { + super(parent, {funcname: 'error', args: [], returns: [] }); + } + mapArguments(s) { + let texts = []; + for (const arg of s.args) { + if (typeof arg === 'string') { + texts.push(arg); + continue; + } + + const value = arg.toString(); + texts.push(value); + } + return texts; + } + exec(s, mapInfo) { + /* let caller = ''; + try { + throw new Error(); + } catch (e) { + caller = e.stack.split('\n').slice(1).join('\n'); + } + console.log(caller);*/ + console.log(`\x1B[1;35m[${s.debug}] ERROR ${mapInfo.join(' ')}\x1B[0m`); + } +} diff --git a/src/containers.js b/src/containers.js index 172a19f..29d8e6d 100644 --- a/src/containers.js +++ b/src/containers.js @@ -67,7 +67,7 @@ module.exports = class Containers { // const nameInfo = this.decodeName(name).scope; ; - this.containers[name] = {scope: this.parent.getNameScope(name), alias, definitions: {}}; + this.containers[name] = {scope: this.parent.getNameScope(name), alias, references: {}}; this.current = name; return true; } @@ -91,6 +91,8 @@ module.exports = class Containers { throw new Error(`Could add reference ${name} to closed container`); } const container = this.containers[this.current]; + console.log(this.containers); + console.log(this.current); if (container.references[name]) { throw new Error(`Reference ${name} was declared previously on scope ${this.current}`); } @@ -99,7 +101,7 @@ module.exports = class Containers { addUse(name) { if (!this.containers[name]) { // TODO: defined must be check containers - throw new Exception(`Use not created container ${name}`); + throw new Error(`Use not created container ${name}`); } Context.scope.addToScopeProperty('uses', name); this.uses.push(name); diff --git a/src/debug_console.js b/src/debug_console.js new file mode 100644 index 0000000..23f6b60 --- /dev/null +++ b/src/debug_console.js @@ -0,0 +1,44 @@ +module.exports = class DebugClass { + constructor (options = {}) { + this.originalMethod = console.log; + this.maxSourceRefLen = options.maxSourceRefLen ?? 20; + console.log = (...args) => this.consoleLog.apply(this, args); + console.stdebug = (...args) => this.stdebug.apply(this, args); + console.stclear = (...args) => this.stclear.apply(this, args); + } + static init (options = {}) { + return new DebugClass(options); + } + consoleLog (...args) { + let initiator = false; + try { + throw new Error(); + } catch (e) { + if (typeof e.stack === 'string') { + let lineIndex = 2; + for (const line of e.stack.split('\n')) { + const matches = line.match(/^\s+at\s+.*\/([^\/:]*:[0-9]+:[0-9]+)\)/); + if (!matches) continue; + --lineIndex; + if (lineIndex < 0) { + initiator = matches[1]; + break; + } + } + } + } + if (initiator === false) { + this.originalMethod.apply(console, args); + } else { + initiator = initiator.split(':').slice(0,2).join(':').replace('.js',''); + initiator = initiator.length > this.maxSourceRefLen ? ('...' + initiator.substring(-this.maxSourceRefLen+3)) : initiator.padEnd(this.maxSourceRefLen); + this.originalMethod.apply(console, [`\x1B[30;104m${initiator} \x1B[0m`, ...args]); + } + } + stdebug(...args) { + this.consoleLog.apply(this, args); + } + stclear(...args) { + this.debuglog = []; + } +} diff --git a/src/definition_items/expression_variable.js b/src/definition_items/expression_variable.js index 17e2bbc..afde773 100644 --- a/src/definition_items/expression_variable.js +++ b/src/definition_items/expression_variable.js @@ -18,6 +18,7 @@ module.exports = class ExpressionVariable extends Variable { this.value = value.instance(); return; } + console.log(value); this.value = value.clone(); /* if (value instanceof ExpressionClass || value instanceof ValueItem) { diff --git a/src/exceptions.js b/src/exceptions.js index b3e9833..12e3fcb 100644 --- a/src/exceptions.js +++ b/src/exceptions.js @@ -1,5 +1,9 @@ const CannotBeCastToType = require('./exceptions/cannot_be_cast_to_type.js'); +const ReferenceNotFound = require('./exceptions/reference_not_found.js'); +const ReferenceNotVisible = require('./exceptions/reference_not_visible.js'); const Exceptions = { - CannotBeCastToType + CannotBeCastToType, + ReferenceNotFound, + ReferenceNotVisible } module.exports = Exceptions; diff --git a/src/exceptions/cannot_be_cast_to_type.js b/src/exceptions/cannot_be_cast_to_type.js index 0cf72bb..dfdac4d 100644 --- a/src/exceptions/cannot_be_cast_to_type.js +++ b/src/exceptions/cannot_be_cast_to_type.js @@ -2,5 +2,4 @@ module.exports = class CannotBeCastToType extends Error { constructor (castingType = false) { super('Error casting type '+ (castingType === false ? '':' to '+castingType)); } - } \ No newline at end of file diff --git a/src/exceptions/reference_not_found.js b/src/exceptions/reference_not_found.js new file mode 100644 index 0000000..bff0c44 --- /dev/null +++ b/src/exceptions/reference_not_found.js @@ -0,0 +1,5 @@ +module.exports = class ReferenceNotFound extends Error { + constructor (name) { + super('Error reference '+name+' not found'); + } +} \ No newline at end of file diff --git a/src/exceptions/reference_not_visible.js b/src/exceptions/reference_not_visible.js new file mode 100644 index 0000000..f748eff --- /dev/null +++ b/src/exceptions/reference_not_visible.js @@ -0,0 +1,5 @@ +module.exports = class ReferenceNotVisible extends Error { + constructor (name) { + super('Error reference '+name+' not visible/accesible'); + } +} \ No newline at end of file diff --git a/src/expression.js b/src/expression.js index 096c396..5c1e7e4 100644 --- a/src/expression.js +++ b/src/expression.js @@ -149,7 +149,6 @@ class Expression extends ExpressionItem { if (this.stack.length) { throw new Error(`Set only could be used with empty stack`); } - console.log(operand); this.stack.push({op: false, operands: [assertExpressionItem(operand.clone())]}); } /* @@ -157,7 +156,7 @@ class Expression extends ExpressionItem { assert(typeof refType === 'string'); this._set({type: OP_ID_REF, id, refType, next}); } - +/* setValue (value) { if (typeof value === 'object') { throw new Error(`object(${value.constructor.name}) as value not allowed`); @@ -428,22 +427,13 @@ class Expression extends ExpressionItem { if (this.stack.length === 0) { return this; } - console.log('CALL #01', options); let stackResults = this.evaluateOperands(options); - console.log('CALL RESULTS', stackResults); - console.log('CALL #02'); this.evaluateFullStack(stackResults, options); - console.log('CALL #03'); if (!options.onlyAsValue && stackResults[0][0] instanceof ExpressionItems.NonRuntimeEvaluableItem) { - // TODO: optimize evaluateFullStack was done .... - console.log('CALL #04'); const res = this.instance(); - console.log('CALL #05'); return res; } - console.log('CALL #06'); const res = stackResults[this.stack.length-1][0]; - console.log('CALL #07'); return res; } evaluateFullStack(stackResults, options) { @@ -458,7 +448,7 @@ class Expression extends ExpressionItem { return results[0]; } - console.log([results, st.operands.length, st]); + // console.log([results, st.operands.length, st]); let values = results[1]; for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { const operand = st.operands[operandIndex]; @@ -469,16 +459,16 @@ class Expression extends ExpressionItem { if (operand instanceof ExpressionItems.StackItem) { values[operandIndex] = this.evaluateStackPos(stackResults, stackIndex - operand.getOffset()); } else { - console.log(operand); + // console.log(operand); values[operandIndex] = operand.eval(options); } if (options.instance) { } } - console.log(values); + // console.log(values); - console.log([st.op, ...values]); + // console.log([st.op, ...values]); let value = null; if (values.some(value => value instanceof ExpressionItems.NonRuntimeEvaluableItem)) { value = ExpressionItems.NonRuntimeEvaluableItem.get(); @@ -692,14 +682,14 @@ class Expression extends ExpressionItem { const st = this.stack[stpos]; stackResults.push(results); let operandResults = results[1]; - console.log(st.operands); + // console.log(st.operands); for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { const operand = assertExpressionItem(st.operands[operandIndex]); // when evaluates single operands, StackItem is a reference to stack position // and it could be evaluated when all operands are left-to-right evaluated if (operand instanceof ExpressionItems.StackItem) continue; - console.log(`CALL OPERAND ${stpos}/${this.stack.length} ${operandIndex}/${st.operands.length} ${operand}`); + // console.log(`CALL OPERAND ${stpos}/${this.stack.length} ${operandIndex}/${st.operands.length} ${operand}`); const result = operand.eval(options); operandResults.push(result); if (options.instance && result !== null) { @@ -1076,14 +1066,35 @@ class Expression extends ExpressionItem { } return res; } + isEmpty() { + return this.stack.length === 0; + } asBool() { - return this.asInt() ? true : false; + let value = this.eval(); + // check if empty expression + if (this.isEmpty()) { + return false; + } + assertLog((value instanceof Expression) === false, value); + if (typeof value.asBool === 'function') { + return value.asBool(); + } + if (typeof value.asInt === 'function') { + const ivalue = value.asInt(); + assert(typeof ivalue === 'bigint'); + return ivalue !== 0n; + } + throw new Exceptions.CannotBeCastToType('bool'); } asIntItem() { return new ExpressionItems.IntValue(this.asInt()); } asInt() { let value = this.eval(); + // check if empty expression + if (this.isEmpty()) { + return 0n; + } assertLog((value instanceof Expression) === false, value); if (typeof value.asInt === 'function') { return value.asInt(); @@ -1098,6 +1109,9 @@ class Expression extends ExpressionItem { } asString() { const value = this.eval(); + if (this.isEmpty()) { + return ''; + } assert((value instanceof Expression) === false); if (typeof value.asString === 'function') { return value.asString(); diff --git a/src/expression_items/array_of.js b/src/expression_items/array_of.js index 3d3bd13..2007409 100644 --- a/src/expression_items/array_of.js +++ b/src/expression_items/array_of.js @@ -6,22 +6,30 @@ const Context = require('../context.js'); module.exports = class ArrayOf extends RuntimeItem { constructor (instanceType, array) { super(); - assert(array instanceof MultiArray); + assertLog(array instanceof MultiArray, array); this.instanceType = instanceType; - this.array = array.clone(); + this._array = array.clone(); + console.log(array.constructor.name, array, this._array); + } + get array() { + return this._array; + } + set array(value) { + throw new Error(); } get instance() { return Context.references.getTypeInstance(this.instanceType); } cloneInstance() { - return new ArrayOf(this.instanceType, this.array); + console.log(this.instanceType, this._array); + return new ArrayOf(this.instanceType, this._array); } evalInside() { return this.clone(); } getItem(indexes) { - const id = this.array.indexesToOffset(indexes); + const id = this._array.indexesToOffset(indexes); return this.instance.getItem(id); } } diff --git a/src/expression_items/expression_list.js b/src/expression_items/expression_list.js index cd9ce89..a546cc5 100644 --- a/src/expression_items/expression_list.js +++ b/src/expression_items/expression_list.js @@ -21,6 +21,9 @@ class ExpressionList extends ExpressionItem { this.items.push(item.clone()); this.indexes = [this.items.length]; } + evalInside(options = {}) { + return this.items.map(x => x.eval(options)); + } } module.exports = ExpressionList; \ No newline at end of file diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 68592dd..8ca6e03 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -32,7 +32,7 @@ module.exports = class FunctionCall extends RuntimeItem { super.cloneUpdate(source); this.funcdef = source.funcdef; } - evalInside(options) { + evalInside(options = {}) { console.log([`#F CALL.EVAL #${this.name} ${Context.sourceTag}`, this.args]); if (Context.sourceTag === 'basic_functions.pil:12') debugger; const definition = Context.references.get(this.name, options); diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 72d7a04..195099d 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -35,7 +35,7 @@ module.exports = class ProofItem extends ExpressionItem { this.rowOffset = source.rowOffset.clone(); } } - toString(options) { + toString(options = {}) { const [next, prior] = this.getRowOffsetStrings(); // console.log(['ROWOFFSET.TOSTRING', next, prior, this.label, this.constructor.name, this.rowOffset]); let label = (options.hideClass ? '' : this.getTag() + '::') + this.label; diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index da64656..3e23423 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -26,6 +26,9 @@ class StringValue extends RuntimeItem { asStringItem() { return this.clone(); } + asBool() { + return this.value !== ""; + } cloneInstance() { return new StringValue(this.value); } diff --git a/src/expression_items/value_item.js b/src/expression_items/value_item.js index ec94875..cbddb84 100644 --- a/src/expression_items/value_item.js +++ b/src/expression_items/value_item.js @@ -34,4 +34,7 @@ module.exports = class ValueItem extends ExpressionItem { toString() { return `${this.value}`; } + equals(value) { + return this.constructor.name === value.constructor.name && this.value === value.value; + } } diff --git a/src/function.js b/src/function.js index 33026e3..24bd616 100644 --- a/src/function.js +++ b/src/function.js @@ -76,7 +76,13 @@ module.exports = class Function { let iarg = 0; for (const name in this.args) { // TODO: checking types and dims - args[iarg].dump(); + if (Array.isArray(args[iarg])) { + for (const arg of args[iarg]) { + arg.dump(); + } + } else { + args[iarg].dump(); + } ++iarg; } } @@ -193,8 +199,17 @@ module.exports = class Function { console.log(arg); console.log(value); // REVIEW: use arg.type, but perphaps we need to do a casting - console.log(value.array); - Context.references.declare(name, arg.type, value.array ? value.array.lengths: [], {}, value); + if (name === 'cols') { +// debugger; + } + let lengths = []; + if (value.array) { + lengths = value.array.lengths; + } else if (Array.isArray(value)) { + lengths = [value.lenght]; + } + + Context.references.declare(name, arg.type, lengths, {}, value); // TODO: arrays. /* diff --git a/src/indexable.js b/src/indexable.js index 080b711..b895dcc 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -92,6 +92,10 @@ module.exports = class Indexable { if (typeof res.value !== 'undefined' && res.value instanceof this.expressionItemClass) { return res.value.clone(); } + if (typeof res.value === 'undefined') { + return new this.expressionItemClass(); + } + assertLog(typeof this.expressionItemClass.createFrom === 'function', [this.type, this.constructor.name, this.expressionItemClass, res, res.value]); return this.expressionItemClass.createFrom(res.value); } diff --git a/src/iterator.js b/src/iterator.js index 5c48764..9141f47 100644 --- a/src/iterator.js +++ b/src/iterator.js @@ -1,4 +1,5 @@ const Expression = require("./expression.js"); +const {assert, assertLog} = require('./assert.js'); module.exports = class Iterator { @@ -11,9 +12,11 @@ module.exports = class Iterator { throw new Error(`Invalid iterator`); } this.index = 0; - this.expr = expr.instance(); - this.reference = this.expr.getReference(); - this.count = this.reference.array.getLength(0); + this.expr = expr.eval(); + console.log(this.expr); + assertLog(this.expr.array, this.expr); + // this.reference = this.expr.getReference(); + // this.count = this.reference.array.getLength(0); } goFirst() { this.index = 0; @@ -42,7 +45,7 @@ module.exports = class Iterator { } getValue() { - return this.reference.array.applyIndexes(this.reference, [this.index]); + return this.expr.array.applyIndexes(this.expr, [this.index]); } *[Symbol.iterator]() { diff --git a/src/multi_array.js b/src/multi_array.js index 3010d90..b9d09ba 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -72,6 +72,9 @@ class MultiArray { } applyIndexes(obj, indexes) { const res = this.getIndexesTypedOffset(indexes); + if (res.array === false && typeof obj.getItem === 'function') { + return obj.getItem(indexes); + } let dup = obj.clone() if (dup.id) { dup.id = dup.id + res.offset; diff --git a/src/pil.js b/src/pil.js index 94166b0..8bb58b9 100755 --- a/src/pil.js +++ b/src/pil.js @@ -6,6 +6,7 @@ const version = require("../package").version; const compile = require("./compiler.js"); const ffjavascript = require("ffjavascript"); const tty = require('tty'); +const debugConsole = require('./debug_console.js').init(); const argv = require("yargs") .version(version) @@ -68,39 +69,9 @@ async function run() { // await fs.promises.writeFile(outputFile.trim(), JSON.stringify(out, null, 1) + "\n", "utf8"); } -const originalMethod = console.log -const maxSourceRefLen = 20; -console.log = (...args) => { - let initiator = false; - try { - throw new Error(); - } catch (e) { - if (typeof e.stack === 'string') { - let isFirst = true; - for (const line of e.stack.split('\n')) { - const matches = line.match(/^\s+at\s+.*\/([^\/:]*:[0-9]+:[0-9]+)\)/); - if (matches) { - if (!isFirst) { // first line - current function - // second line - caller (what we are looking for) - initiator = matches[1]; - break; - } - isFirst = false; - } - } - } - } - if (initiator === false) { - originalMethod.apply(console, args); - } else { - initiator = initiator.split(':').slice(0,2).join(':').replace('.js',''); - initiator = initiator.length > maxSourceRefLen ? ('...' + initiator.substring(-maxSourceRefLen+3)) : initiator.padEnd(maxSourceRefLen); - originalMethod.apply(console, [`\x1B[30;104m${initiator} \x1B[0m`, ...args]); - } -} run().then(()=> { - process.exit(0); + process.exitCode = 0; }, (err) => { console.log(err.stack); if (err.pos) { @@ -108,5 +79,5 @@ run().then(()=> { } else { console.log(err.message); } - process.exit(1); + process.exitCode = 1; }); diff --git a/src/processor.js b/src/processor.js index 3cf00a5..aef8116 100644 --- a/src/processor.js +++ b/src/processor.js @@ -381,10 +381,10 @@ module.exports = class Processor { for (let icond = 0; icond < s.conditions.length; ++icond) { const cond = s.conditions[icond]; if ((icond === 0) !== (cond.type === 'if')) { - throw new Exception('first position must be an if, and if only could be on first position'); + throw new Error('first position must be an if, and if only could be on first position'); } if (cond.type === 'else' && icond !== (s.conditions.length-1)) { - throw new Exception('else only could be on last position'); + throw new Error('else only could be on last position'); } if (typeof cond.expression !== 'undefined' && this.expressions.e2bool(cond.expression) !== true) { @@ -448,7 +448,8 @@ module.exports = class Processor { return result; } execForIn(s) { - if (s.list && s.list.type === 'expression_list') { + console.log(s); + if (s.list && s.list instanceof ExpressionItems.ExpressionList) { return this.execForInList(s); } return this.execForInExpression(s); @@ -998,9 +999,22 @@ module.exports = class Processor { lindex = m.index + m[0].length; } const lastS = template.substring(lindex); - const codeTags = tags.map((x, index) => 'constant ____'+index+' = '+x.expr+";").join("\n"); + + // create a tag for each substitution string + const codeTags = tags.map((x, index) => 'expr ____'+index+' = '+x.expr+";").join("\n"); + + // compile a list of tags to created its associated expressions + // this expressions aren't executed, only compiled for this reason + // we don't need create a context. const compiledTags = this.compiler.parseExpression(codeTags); - return compiledTags.map((e, index) => tags[index].pre + this.e2value(e.value)).join('')+lastS; + + // evaluating different init of each tag + const stringTags = compiledTags.map(e => e.init[0].eval().asString()); + + // replace on string each tag for its value + const evaluatedTemplate = stringTags.map((s, index) => tags[index].pre + s).join('')+lastS; + console.log(`TEMPLATE "${template}" ==> "${evaluatedTemplate}"`); + return evaluatedTemplate; } evaluateExpression(e){ // TODO diff --git a/src/reference.js b/src/reference.js index d42e672..da2d1b9 100644 --- a/src/reference.js +++ b/src/reference.js @@ -48,8 +48,7 @@ class Reference { return (indexes.length === 0 || !this.array) ? this.locator : this.array.getLocator(this.locator, indexes); } set (value, indexes = [], options = {}) { - console.log(indexes); - console.log(`set(${this.name}, [${indexes.join(',')}]`); + console.stdebug(`set(${this.name}, [${indexes.join(',')}]`); assert(value !== null); // to detect obsolete legacy uses if (!this.array || this.array.isFullIndexed(indexes)) { return this.setOneItem(value, indexes, options); @@ -72,7 +71,6 @@ class Reference { } // setting by only one element setOneItem(value, indexes, options = {}) { - console.log(this.name, value); if (!this.isInitialized(indexes)) { return this.#doInit(value, indexes); } else if (options.doInit) { @@ -89,9 +87,6 @@ class Reference { #doInit(value, indexes) { const id = this.getId(indexes); assert(id !== null); - console.log(this.name, id, this.instance.type); - if (typeof value.toString === 'function') console.log(value.toString()); - else console.log(value); this.instance.set(id, value); this.markAsInitialized(indexes); } @@ -111,7 +106,6 @@ class Reference { return this.instance.get(this.getId(indexes)); } getItem(indexes, options = {}) { - console.log(['GETITEM', indexes, options, this.locator]); let locator = this.locator; let label = options.label; @@ -125,14 +119,12 @@ class Reference { // if array is defined let res = false; if (this.array) { - console.log(evaluatedIndexes); if (this.array.isFullIndexed(evaluatedIndexes)) { // full access => result an item (non subarray) locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } else { // parcial access => result a subarray res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator)); - console.log(res); } } else if (evaluatedIndexes.length > 0) { throw new Error('try to access to index on non-array value'); @@ -144,7 +136,6 @@ class Reference { if (label) res.setLabel(label); else res.setLabel('___'); - console.log(res); return res; } } diff --git a/src/references.js b/src/references.js index b211072..39fd27a 100644 --- a/src/references.js +++ b/src/references.js @@ -5,6 +5,7 @@ const {ExpressionItem, ArrayOf} = require("./expression_items.js"); const Reference = require('./reference.js'); const Containers = require('./containers.js'); const Context = require('./context.js'); +const Exceptions = require('./exceptions.js'); module.exports = class References { constructor () { @@ -159,7 +160,6 @@ module.exports = class References { return [scopeId, false]; } declare(name, type, lengths = [], options = {}, initValue = null) { - console.log(`declare(${name},${type},[${lengths.join(',')}])`); assert(typeof name === 'string'); assert(!name.includes('::object')); assert(!name.includes('.object')); @@ -190,7 +190,6 @@ module.exports = class References { /* take constant property from options, the rest is data information */ const constProperty = options.const ?? false; - console.log(['CONST ', constProperty, name]); let data = {...options}; delete data.const; @@ -201,7 +200,6 @@ module.exports = class References { const id = isReference ? null : instance.reserve(size, nameInfo.name, array, data); const reference = new Reference(nameInfo.name, type, isReference, array, id, instance, scopeId, refProperties); - console.log(container, reference); if (container) { this.containers.addReference(nameInfo.name, reference); @@ -376,12 +374,7 @@ module.exports = class References { return this._getInstanceAndLocator(name, indexes); } addUse(name) { - if (!this.containers[name]) { - // TODO: defined must be check containers - throw new Exception(`Use not created container ${name}`); - } - Context.scope.addToScopeProperty('uses', name); - this.uses.push(name); + this.containers.addUse(name); } searchDefinition(name) { const subnames = name.split('.'); @@ -402,7 +395,7 @@ module.exports = class References { throw new Error(`Not match declaration scope and accessing scope (${containerName}) of ${name}`); } } - if (reference && this.containers.isDefined(explicitContainer)) { + if (!reference && this.containers.isDefined(explicitContainer)) { reference = this.containers.getReferenceInside(explicitContainer, lname, false); } } @@ -462,13 +455,13 @@ module.exports = class References { } if (!reference) { if (typeof defaultValue !== 'undefined') return defaultValue; - throw new Error(`Reference ${names.join(',')} not found on ${Context.sourceRef}`); + throw new Exceptions.ReferenceNotFound(names.join(',')); } // constants are visible inside functions if (this.isVisible(reference) === false) { if (typeof defaultValue !== 'undefined') return defaultValue; - throw new Error(`Reference ${names.join(',')} not visible from current scope ${Context.sourceRef}`); + throw new Exceptions.ReferenceNotVisible(names.join(',')); } return reference; } @@ -555,7 +548,9 @@ module.exports = class References { if (def.array) delete def.array; delete this.references[name]; } - + unsetProperty(property, values) { + this.containers.unsetProperty(property, values); + } *[Symbol.iterator]() { for (let index in this.references) { yield index; diff --git a/src/scope.js b/src/scope.js index 8129149..95bcff5 100644 --- a/src/scope.js +++ b/src/scope.js @@ -1,4 +1,5 @@ const Context = require('./context.js'); +const {assert, assertLog} = require('./assert.js'); module.exports = class Scope { constructor () { this.deep = 0; @@ -71,6 +72,9 @@ module.exports = class Scope { } this.shadows[this.deep] = {}; for (const property in this.properties[this.deep]) { + console.log(this.properties); + console.log(this.properties[this.deep]); + assertLog(typeof Context.references.unsetProperty === 'function', Context.references.constructor.name); Context.references.unsetProperty(property, this.properties[this.deep][property]); } this.properties[this.deep] = {}; diff --git a/test/pil2/components/expression.test.js b/test/pil2/components/expression.test.js index 01de6e6..ac5fdd1 100644 --- a/test/pil2/components/expression.test.js +++ b/test/pil2/components/expression.test.js @@ -1,251 +1,141 @@ -const chai = require("chai"); +const { F1Field } = require("ffjavascript"); +const fs = require("fs"); +const path = require("path"); +const util = require('util'); +var tmp = require('tmp-promise'); +const Expression = require('../../../src/expression.js'); +const ExpressionItems = require('../../../src/expression_items.js'); + +const deepEqualInAnyOrder = require('deep-equal-in-any-order'); +const chai = require('chai'); const assert = chai.assert; -const src = __dirname + "/../../../src/"; -const Expression = require(src + 'expression.js'); +const expect = chai.expect; +chai.use(deepEqualInAnyOrder); +const debugConsole = require('../../../src/debug_console.js').init(); - -const toJSON = function (obj) { - return JSON.stringify(obj, (_, v) => typeof v === 'bigint' ? v.toString() : v); -} - -describe("Expression", async function () { +describe("Expressions", async function () { this.timeout(10000000); - - it("Basic test", async () => { - let e = new Expression(); - assert.equal(e.isAlone(), false); - - e.setValue(0); - assert.equal(e.isAlone(), true); - - assert.throws(() => {e.setValue(0)}, Error, 'Set only could be used with empty stack'); - assert.throws(() => {e.setRuntime({name: 'mary', indexes: [1], next: 2})}, Error, 'Set only could be used with empty stack'); - assert.throws(() => {e.setIdReference(10, 'imC', 0, 2)}, Error, 'Set only could be used with empty stack'); - - let expected = [{op: false, operands: [{type: 0, value: 0}]}]; - assert.equal(toJSON(e.stack), toJSON(expected)); - - e = new Expression(); - - assert.equal(e.isAlone(), false); - - e.setRuntime({name: 'joe', indexes: [5], next: 7}); - assert.equal(e.isAlone(), true); - - assert.throws(() => {e.setValue(0)}, Error, 'Set only could be used with empty stack'); - assert.throws(() => {e.setRuntime({name: 'mary', indexes: [1], next: 2})}, Error, 'Set only could be used with empty stack'); - assert.throws(() => {e.setIdReference(10, 'imC', 0, 2)}, Error, 'Set only could be used with empty stack'); - - expected = [{op: false, operands: [{type: 3, name: 'joe', indexes: [5], next: 7}]}]; - assert.equal(toJSON(e.stack), toJSON(expected)); - - e = new Expression(); - - assert.equal(e.isAlone(), false); - - e.setIdReference(12, 'witness', 1, -1); - assert.equal(e.isAlone(), true); - - assert.throws(() => {e.setValue(0)}, Error, 'Set only could be used with empty stack'); - assert.throws(() => {e.setRuntime({name: 'mary', indexes: [1], next: 2})}, Error, 'Set only could be used with empty stack'); - assert.throws(() => {e.setIdReference(10, 'imC', 0, 2)}, Error, 'Set only could be used with empty stack'); - - expected = [{op: false, operands: [{type:1, id: 12, refType: 'witness', offset: 1, next: -1}]}]; - assert.equal(toJSON(e.stack), toJSON(expected)); - }); - - it("Insert test", async () => { - let a = new Expression(); - assert.equal(a.isAlone(), false); - - a.setValue(10); - assert.equal(a.isAlone(), true); - - let b = new Expression(); - b.setValue(20); - - a.insert('+', b); - let expected = [{op:'+',operands:[{type:0, value: 10},{type:0, value: 20}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - - b.stack[0].operands[0].value = 30; - assert.equal(toJSON(a.stack), toJSON(expected)); - - a.insert('*', b); - expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:0, value: 30}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - - a.insert('-', a); - let count = expected.length; - expected = [...expected, ...expected, {op:'-',operands:[{type:2, offset:count+1},{type:2, offset: 1}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - }); - it("Direct insert test", async () => { - let a = new Expression(); - a.setValue(10); - - let b = new Expression(); - b.setValue(20); - - let c = new Expression(); - c.insert('+', a, b); - let expected = [{op:'+',operands:[{type:0, value:10},{type:0, value: 20}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - b.stack[0].operands[0].value = 30; - assert.equal(toJSON(c.stack), toJSON(expected)); - - c.insert('*', b); - expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:0, value: 30}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - c.insert('-', c); - let count = expected.length; - expected = [...expected, ...expected, {op:'-',operands:[{type:2, offset:count+1},{type:2, offset: 1}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - d = new Expression(); - d.insert('neg', a); - expected = [{op:'neg',operands:[{type:0, value:10}]}]; - assert.equal(toJSON(d.stack), toJSON(expected)); + const F = new F1Field(0xffffffff00000001n); + + function checkScopeDefine(scope, name, value) { + scope.define(name, value); + assert.equal(value, scope.get(name)); + assert.equal(true, scope.isDefined(name)); + } + function checkScopeSet(scope, name, value) { + scope.set(name, value); + assert.equal(value, scope.get(name)); + assert.equal(true, scope.isDefined(name)); + } + it("Empty expressions", async () => { + const e1 = new Expression(); + expect(e1.asIntItem()).to.deep.equalInAnyOrder(new ExpressionItems.IntValue(0n)); + // expect(e1.asFeItem()).to.deep.equalInAnyOrder(new ExpressionItems.FeValue(0n)); + expect(e1.asStringItem()).to.deep.equalInAnyOrder(new ExpressionItems.StringValue('')); + assert.equal(0n, e1.asInt()); + // assert.equal(0n, e1.asFe()); + assert.equal('', e1.asString()); + assert.equal(false, e1.asBool()); + expect(e1).to.deep.equalInAnyOrder(new Expression()); }) - - it("Multiple insert test", async () => { - let a = new Expression(); - a.setValue(10); - - let b = new Expression(); - b.setValue(20); - - let c = new Expression(); - c.insert('+', a, b); - let expected = [{op:'+',operands:[{type:0, value:10},{type:0, value: 20}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - b.stack[0].operands[0].value = 30; - assert.equal(toJSON(c.stack), toJSON(expected)); - - c.insert('*', b); - expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:0, value: 30}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - c.insert('-', c); - let count = expected.length; - expected = [...expected, ...expected, {op:'-',operands:[{type:2, offset:count+1},{type:2, offset: 1}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - - let d1 = new Expression(); - d1.setRuntime({name: 'JohnSmith', indexes: [2,5,7], next: 10}); - - let d2 = new Expression(); - d2.setIdReference(103, 'fe', -18746, 0); - - - - let d = new Expression(); - d.insert('+', d1, d2); - let expectedD = [{op:'+',operands:[{type:3, name: 'JohnSmith', indexes: [2, 5, 7], next: 10}, - {type:1, id: 103, refType: 'fe', offset: -18746, next: 0}]}]; - expected = expectedD; - assert.equal(toJSON(d.stack), toJSON(expected)); - - a.insert('*', d); - expected = [{op:false,operands:[{type:0, value: 10}]},...expected, {op:'*',operands:[{type:2, offset: 2},{type:2, offset: 1}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - - a = new Expression(); - a.insert('fx', d); - expected = [...expectedD, {op:'fx',operands:[{type:2, offset: 1}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); + it("Setting as int", async () => { + { + const e1 = new Expression(); + e1._set(new ExpressionItems.IntValue(10n)); + expect(e1.asIntItem()).to.deep.equalInAnyOrder(new ExpressionItems.IntValue(10n)); + assert.equal(10n, e1.asInt()); + assert.equal(true, e1.asBool()); + } + { + const e2 = new Expression(); + e2._set(new ExpressionItems.IntValue(0n)); + expect(e2.asIntItem()).to.deep.equalInAnyOrder(new ExpressionItems.IntValue(0n)); + assert.equal(0n, e2.asInt()); + assert.equal(false, e2.asBool()); + } }) - - it("Clone test", async () => { - let a = new Expression(); - a.setValue(10); - - let b = new Expression(); - b.setRuntime({name: 'Joe', indexes: [2, 10, 13], next: -10}); - - let c = new Expression(); - c.insert('+', a, b); - let expected = [{op:'+',operands:[{type:0, value: 10},{type:3, name: "Joe", indexes: [2, 10, 13], next: -10}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - b.stack[0].operands[0].indexes[2] = 30; - assert.equal(toJSON(c.stack), toJSON(expected)); - - b = new Expression(); - b.setIdReference(100, 'int', 180, -13); - - c.insert('*', b); - expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:1, id: 100, refType: 'int', offset:180, next: -13}]}]; - assert.equal(toJSON(c.stack), toJSON(expected)); - - d = c.clone(); - assert.equal(toJSON(d.stack), toJSON(expected)); - c.stack[0].operands[0].type = 29; - c.stack[0].operands[1].type = 18; - c.stack[0].op = 'xx'; - c.stack[1].operands[0].type = 56; - c.stack[1].operands[1].type = 57; - c.stack[1].op = 'yy'; - assert.equal(toJSON(d.stack), toJSON(expected)); - - // clone himself - d = d.clone(); - assert.equal(toJSON(d.stack), toJSON(expected)); + it("Setting as string", async () => { + { + const e1 = new Expression(); + const stringExample = "Hello, world !!"; + e1._set(new ExpressionItems.StringValue(stringExample)); + expect(e1.asStringItem()).to.deep.equalInAnyOrder(new ExpressionItems.StringValue(stringExample)); + assert.equal(stringExample, e1.asString()); + assert.equal(true, e1.asBool()); + } + { + const e2 = new Expression(); + const emptyString = ""; + e2._set(new ExpressionItems.StringValue(emptyString)); + expect(e2.asStringItem()).to.deep.equalInAnyOrder(new ExpressionItems.StringValue(emptyString)); + assert.equal(emptyString, e2.asString()); + assert.equal(false, e2.asBool()); + } }) - - it("Insert himself", async () => { - let a = new Expression(); - a.setValue(10); - - a.insert('+', a, a); - let expectedA = {op:'+',operands:[{type:0, value: 10},{type:0, value: 10},{type:0, value: 10}]}; - let expected = [expectedA]; - assert.equal(toJSON(a.stack), toJSON(expected)); - - let b = new Expression(); - b.setValue(38); - b.insert('*', a, a); - expected = [{op:false, operands:[{type:0, value:38}]},...expected, ...expected, {op:'*',operands:[{type:2, offset: 3},{type:2, offset:2},{type:2, offset:1}]}]; - assert.equal(toJSON(b.stack), toJSON(expected)); - - b.insert('**', a, a); - expected = [...expected, expectedA, expectedA, {op:'**',operands:[{type:2, offset:3},{type:2, offset:2},{type:2, offset:1}]}]; - assert.equal(toJSON(b.stack), toJSON(expected)); + // TODO: settinga as template + it("Adding", async () => { + const e1 = new Expression(); + e1._set(new ExpressionItems.IntValue(10n)); + expect(e1.asIntItem()).to.deep.equalInAnyOrder(new ExpressionItems.IntValue(10n)); + assert.equal(10n, e1.asInt()); + assert.equal(true, e1.asBool()); }) - - it("Exceptions test", async () => { - let a = new Expression(); - a.setValue(10); - assert.throws(() => {a.pushStack(0)}, Error, 'pushStack parameter must be an Expression'); - assert.throws(() => {a.pushStack(this)}, Error, 'pushStack parameter must be an Expression'); - assert.throws(() => {a.pushStack()}, Error, 'pushStack parameter must be an Expression'); - - let b = new Expression(); - assert.throws(() => {a.insert('+', b)}, Error, 'insert without operands'); - - let b2 = new Expression(); - assert.throws(() => {a.insert('+', b, b2)}, Error, 'insert without operands'); - assert.throws(() => {b2.setValue(b)}, Error, 'object(Expression) as value not allowed'); +/* + it("Basic test", async () => { + const F = new F1Field(0xffffffff00000001n); + let scope = new Scope(F); + + assert.equal(false, scope.isDefined('myFirstVar')); + scope.define('myFirstVar', 13); + assert.equal(13, scope.get('myFirstVar')); + assert.equal(true, scope.isDefined('myFirstVar')); + scope.set('myFirstVar', 14); + assert.equal(14, scope.get('myFirstVar')); }); - - it("Unary insert", async () => { - let a = new Expression(); - a.setValue(10); - let expected = [{op:false, operands:[{type:0, value: 10}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - - a.insert('not'); - expected = [{op:'not', operands:[{type:0, value: 10}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - - a.insert('not'); - expected = [...expected, {op:'not', operands:[{type:2, offset: 1}]}]; - assert.equal(toJSON(a.stack), toJSON(expected)); - }) - - + it("Scope Test", async () => { + const F = new F1Field(0xffffffff00000001n); + let scope = new Scope(F); + + assert.equal(false, scope.isDefined('myFirstVar')); + scope.define('myFirstVar', 13); + assert.equal(13, scope.get('myFirstVar')); + assert.equal(true, scope.isDefined('myFirstVar')); + scope.push(); + assert.equal(13, scope.get('myFirstVar')); + assert.equal(true, scope.isDefined('myFirstVar')); + scope.set('myFirstVar', 14); + assert.equal(14, scope.get('myFirstVar')); + scope.define('myFirstVar', 20); + assert.equal(20, scope.get('myFirstVar')); + assert.equal(true, scope.isDefined('myFirstVar')); + scope.define('mySecondVar', 25); + assert.equal(25, scope.get('mySecondVar')); + assert.equal(true, scope.isDefined('mySecondVar')); + scope.set('mySecondVar', 27); + assert.equal(27, scope.get('mySecondVar')); + assert.throws( + () => scope.define('myFirstVar', 50), + 'myFirstVar already defined on this scope ....' + ); + assert.equal(20, scope.get('myFirstVar')); + assert.equal(true, scope.isDefined('myFirstVar')); + scope.pop(); + assert.equal(14, scope.get('myFirstVar')); + assert.equal(true, scope.isDefined('myFirstVar')); + }); + it("Scope Pop destroy variables", async () => { + const F = new F1Field(0xffffffff00000001n); + let scope = new Scope(F); + + scope.push(); + checkScopeDefine(scope, 'mySecondVar', 25); + checkScopeSet(scope, 'mySecondVar', 27); + scope.pop(); + assert.equal(false, scope.isDefined('mySecondVar')); + assert.equal(null, scope.get('mySecondVar')); + assert.throws( + () => scope.set('mySecondVar', 29), + 'mySecondVar not defined on this scope ....' + ); + });*/ }); \ No newline at end of file diff --git a/test/pil2/components/expression_build.test.js b/test/pil2/components/expression_build.test.js new file mode 100644 index 0000000..01de6e6 --- /dev/null +++ b/test/pil2/components/expression_build.test.js @@ -0,0 +1,251 @@ +const chai = require("chai"); +const assert = chai.assert; +const src = __dirname + "/../../../src/"; +const Expression = require(src + 'expression.js'); + + +const toJSON = function (obj) { + return JSON.stringify(obj, (_, v) => typeof v === 'bigint' ? v.toString() : v); +} + +describe("Expression", async function () { + this.timeout(10000000); + + it("Basic test", async () => { + let e = new Expression(); + assert.equal(e.isAlone(), false); + + e.setValue(0); + assert.equal(e.isAlone(), true); + + assert.throws(() => {e.setValue(0)}, Error, 'Set only could be used with empty stack'); + assert.throws(() => {e.setRuntime({name: 'mary', indexes: [1], next: 2})}, Error, 'Set only could be used with empty stack'); + assert.throws(() => {e.setIdReference(10, 'imC', 0, 2)}, Error, 'Set only could be used with empty stack'); + + let expected = [{op: false, operands: [{type: 0, value: 0}]}]; + assert.equal(toJSON(e.stack), toJSON(expected)); + + e = new Expression(); + + assert.equal(e.isAlone(), false); + + e.setRuntime({name: 'joe', indexes: [5], next: 7}); + assert.equal(e.isAlone(), true); + + assert.throws(() => {e.setValue(0)}, Error, 'Set only could be used with empty stack'); + assert.throws(() => {e.setRuntime({name: 'mary', indexes: [1], next: 2})}, Error, 'Set only could be used with empty stack'); + assert.throws(() => {e.setIdReference(10, 'imC', 0, 2)}, Error, 'Set only could be used with empty stack'); + + expected = [{op: false, operands: [{type: 3, name: 'joe', indexes: [5], next: 7}]}]; + assert.equal(toJSON(e.stack), toJSON(expected)); + + e = new Expression(); + + assert.equal(e.isAlone(), false); + + e.setIdReference(12, 'witness', 1, -1); + assert.equal(e.isAlone(), true); + + assert.throws(() => {e.setValue(0)}, Error, 'Set only could be used with empty stack'); + assert.throws(() => {e.setRuntime({name: 'mary', indexes: [1], next: 2})}, Error, 'Set only could be used with empty stack'); + assert.throws(() => {e.setIdReference(10, 'imC', 0, 2)}, Error, 'Set only could be used with empty stack'); + + expected = [{op: false, operands: [{type:1, id: 12, refType: 'witness', offset: 1, next: -1}]}]; + assert.equal(toJSON(e.stack), toJSON(expected)); + }); + + it("Insert test", async () => { + let a = new Expression(); + assert.equal(a.isAlone(), false); + + a.setValue(10); + assert.equal(a.isAlone(), true); + + let b = new Expression(); + b.setValue(20); + + a.insert('+', b); + let expected = [{op:'+',operands:[{type:0, value: 10},{type:0, value: 20}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + + b.stack[0].operands[0].value = 30; + assert.equal(toJSON(a.stack), toJSON(expected)); + + a.insert('*', b); + expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:0, value: 30}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + + a.insert('-', a); + let count = expected.length; + expected = [...expected, ...expected, {op:'-',operands:[{type:2, offset:count+1},{type:2, offset: 1}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + }); + it("Direct insert test", async () => { + let a = new Expression(); + a.setValue(10); + + let b = new Expression(); + b.setValue(20); + + let c = new Expression(); + c.insert('+', a, b); + let expected = [{op:'+',operands:[{type:0, value:10},{type:0, value: 20}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + b.stack[0].operands[0].value = 30; + assert.equal(toJSON(c.stack), toJSON(expected)); + + c.insert('*', b); + expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:0, value: 30}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + c.insert('-', c); + let count = expected.length; + expected = [...expected, ...expected, {op:'-',operands:[{type:2, offset:count+1},{type:2, offset: 1}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + d = new Expression(); + d.insert('neg', a); + expected = [{op:'neg',operands:[{type:0, value:10}]}]; + assert.equal(toJSON(d.stack), toJSON(expected)); + }) + + it("Multiple insert test", async () => { + let a = new Expression(); + a.setValue(10); + + let b = new Expression(); + b.setValue(20); + + let c = new Expression(); + c.insert('+', a, b); + let expected = [{op:'+',operands:[{type:0, value:10},{type:0, value: 20}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + b.stack[0].operands[0].value = 30; + assert.equal(toJSON(c.stack), toJSON(expected)); + + c.insert('*', b); + expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:0, value: 30}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + c.insert('-', c); + let count = expected.length; + expected = [...expected, ...expected, {op:'-',operands:[{type:2, offset:count+1},{type:2, offset: 1}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + + let d1 = new Expression(); + d1.setRuntime({name: 'JohnSmith', indexes: [2,5,7], next: 10}); + + let d2 = new Expression(); + d2.setIdReference(103, 'fe', -18746, 0); + + + + let d = new Expression(); + d.insert('+', d1, d2); + let expectedD = [{op:'+',operands:[{type:3, name: 'JohnSmith', indexes: [2, 5, 7], next: 10}, + {type:1, id: 103, refType: 'fe', offset: -18746, next: 0}]}]; + expected = expectedD; + assert.equal(toJSON(d.stack), toJSON(expected)); + + a.insert('*', d); + expected = [{op:false,operands:[{type:0, value: 10}]},...expected, {op:'*',operands:[{type:2, offset: 2},{type:2, offset: 1}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + + a = new Expression(); + a.insert('fx', d); + expected = [...expectedD, {op:'fx',operands:[{type:2, offset: 1}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + }) + + it("Clone test", async () => { + let a = new Expression(); + a.setValue(10); + + let b = new Expression(); + b.setRuntime({name: 'Joe', indexes: [2, 10, 13], next: -10}); + + let c = new Expression(); + c.insert('+', a, b); + let expected = [{op:'+',operands:[{type:0, value: 10},{type:3, name: "Joe", indexes: [2, 10, 13], next: -10}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + b.stack[0].operands[0].indexes[2] = 30; + assert.equal(toJSON(c.stack), toJSON(expected)); + + b = new Expression(); + b.setIdReference(100, 'int', 180, -13); + + c.insert('*', b); + expected = [...expected, {op:'*',operands:[{type:2, offset:1},{type:1, id: 100, refType: 'int', offset:180, next: -13}]}]; + assert.equal(toJSON(c.stack), toJSON(expected)); + + d = c.clone(); + assert.equal(toJSON(d.stack), toJSON(expected)); + c.stack[0].operands[0].type = 29; + c.stack[0].operands[1].type = 18; + c.stack[0].op = 'xx'; + c.stack[1].operands[0].type = 56; + c.stack[1].operands[1].type = 57; + c.stack[1].op = 'yy'; + assert.equal(toJSON(d.stack), toJSON(expected)); + + // clone himself + d = d.clone(); + assert.equal(toJSON(d.stack), toJSON(expected)); + }) + + it("Insert himself", async () => { + let a = new Expression(); + a.setValue(10); + + a.insert('+', a, a); + let expectedA = {op:'+',operands:[{type:0, value: 10},{type:0, value: 10},{type:0, value: 10}]}; + let expected = [expectedA]; + assert.equal(toJSON(a.stack), toJSON(expected)); + + let b = new Expression(); + b.setValue(38); + b.insert('*', a, a); + expected = [{op:false, operands:[{type:0, value:38}]},...expected, ...expected, {op:'*',operands:[{type:2, offset: 3},{type:2, offset:2},{type:2, offset:1}]}]; + assert.equal(toJSON(b.stack), toJSON(expected)); + + b.insert('**', a, a); + expected = [...expected, expectedA, expectedA, {op:'**',operands:[{type:2, offset:3},{type:2, offset:2},{type:2, offset:1}]}]; + assert.equal(toJSON(b.stack), toJSON(expected)); + }) + + it("Exceptions test", async () => { + let a = new Expression(); + a.setValue(10); + assert.throws(() => {a.pushStack(0)}, Error, 'pushStack parameter must be an Expression'); + assert.throws(() => {a.pushStack(this)}, Error, 'pushStack parameter must be an Expression'); + assert.throws(() => {a.pushStack()}, Error, 'pushStack parameter must be an Expression'); + + let b = new Expression(); + assert.throws(() => {a.insert('+', b)}, Error, 'insert without operands'); + + let b2 = new Expression(); + assert.throws(() => {a.insert('+', b, b2)}, Error, 'insert without operands'); + assert.throws(() => {b2.setValue(b)}, Error, 'object(Expression) as value not allowed'); + }); + + it("Unary insert", async () => { + let a = new Expression(); + a.setValue(10); + let expected = [{op:false, operands:[{type:0, value: 10}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + + a.insert('not'); + expected = [{op:'not', operands:[{type:0, value: 10}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + + a.insert('not'); + expected = [...expected, {op:'not', operands:[{type:2, offset: 1}]}]; + assert.equal(toJSON(a.stack), toJSON(expected)); + }) + + +}); \ No newline at end of file diff --git a/test/components/scope.test.js b/test/pil2/components/scope.test.js similarity index 98% rename from test/components/scope.test.js rename to test/pil2/components/scope.test.js index 4017e93..bcf7f68 100644 --- a/test/components/scope.test.js +++ b/test/pil2/components/scope.test.js @@ -4,7 +4,7 @@ const fs = require("fs"); const path = require("path"); const assert = chai.assert; var tmp = require('tmp-promise'); -const Scope = require('../../src/scope.js'); +const Scope = require('../../../src/scope.js'); describe("Scope", async function () { this.timeout(10000000); diff --git a/test/pil2/features/basic_functions.pil b/test/pil2/features/basic_functions.pil index 0d199d6..a7cfa61 100644 --- a/test/pil2/features/basic_functions.pil +++ b/test/pil2/features/basic_functions.pil @@ -2,6 +2,23 @@ subproof Functions(2**23) { col witness w; int values[12][20]; + function defer_definition_2(int b, int a) { + // b = vb, a = va + // a <= vb | b <= vb (now a value is vb, definition at same time) + // [a,b] <= [vb,va] + return sum1(a, b); + } + + function defer_definition(int a, int b) { + return sum1(a, b); + } + + function stotal_ (int a[]): int { + return sum(0, a); + } + function stotal (int a[]): int { + return stotal_(a); + } function sum1(int a, int b) : int { return a + b; } @@ -35,6 +52,25 @@ subproof Functions(2**23) { k[0] = 109; expr e1 = 12; int res = sum1(18, e1); + assert_eq(res, 30); int res2 = sum(20, values[7]); + assert_eq(res2, 20); + int res3 = sum(25, k); + assert_eq(res3, 109 + 25); + + int k2[4]; + k2[0] = 110; + k2[1] = 220; + k2[2] = 330; + k2[3] = 440; + + int res4 = stotal(k2); + assert_eq(res4, 1100); + + int res5 = defer_definition(13, 35); + assert_eq(res5, 48); + + int res6 = defer_definition_2(13, 35); + assert_eq(res6, 48); } \ No newline at end of file diff --git a/test/pil2/vadcop/std_sum.pil b/test/pil2/vadcop/std_sum.pil index 9f4c204..233333a 100644 --- a/test/pil2/vadcop/std_sum.pil +++ b/test/pil2/vadcop/std_sum.pil @@ -39,7 +39,7 @@ private function check_id_and_cols(int opid, int cols_count, int provide) { // FIX: dynamic arrays not ready int opids_count = 0; int opids[100]; - expr gsum = 0; // Resulting sum of every subproof and every air. + expr gsum = 0; // Resulting sum of every subproof and every air. // Declared as expression (unknown at runtime), but used as field element. } @@ -230,12 +230,32 @@ private function PIOP_proof() { } private function check_was_completed() { + /* for (int opid in proof.std.piop.opids) { - if (proof.std.piop.`id${opid}`.require == 0) { + // if (proof.std.piop.`id${opid}`.require == 0) { + // error(`PIOP #${opid} defined without require`); + // } + // if (proof.std.piop.`id${opid}`.provide == 0) { + // error(`PIOP #${opid} defined without provide`); + // } + use proof.std.piop.`id${opid}`; + if (require == 0) { error(`PIOP #${opid} defined without require`); } - if (proof.std.piop.`id${opid}`.provide == 0) { + if (provide == 0) { error(`PIOP #${opid} defined without provide`); } } + */ + for (int index = 0; index < proof.std.piop.opids_count; ++index) { + int opid = proof.std.piop.opids[index]; + use proof.std.piop.`id${opid}`; + if (require == 0) { + error(`PIOP #${opid} defined without require`); + } + if (provide == 0) { + error(`PIOP #${opid} defined without provide`); + } + } + } \ No newline at end of file From 5864a08fbcded6331111a69b3230f788fc6772b0 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 7 Nov 2023 12:00:49 +0100 Subject: [PATCH 22/33] WIP, continue testing std --- src/assert.js | 2 +- src/builtin/assert_eq.js | 3 +- src/builtin/assert_not_eq.js | 4 +- src/builtin/defined.js | 2 + src/builtin/error.js | 6 +- src/builtin/is_array.js | 3 +- src/builtin/length.js | 15 +- src/builtin/println.js | 6 +- src/compiler_legacy.js | 882 ------------------ src/constraints.js | 5 +- src/containers.js | 7 + src/context.js | 11 + src/debug_console.js | 3 + src/expression.js | 275 ++++-- src/expression_factory.js | 1 + src/expression_items/array_of.js | 3 + src/expression_items/expression_item.js | 3 + src/expression_items/expression_list.js | 18 +- src/expression_items/function_call.js | 2 +- src/expression_items/int_value.js | 6 + src/expression_items/proof_item.js | 2 +- src/expression_items/stack_item.js | 5 +- src/expression_items/string_template.js | 19 +- src/expression_items/string_value.js | 3 + src/expressions.js | 6 + src/function.js | 9 +- src/indexable.js | 9 +- src/multi_array.js | 2 + src/processor.js | 84 +- src/reference.js | 10 +- src/references.js | 8 +- src/subproof.js | 1 + test/pil2/features/compressed.pil | 96 ++ test/pil2/std2/std_mset_lookup_range.pil | 307 ++++++ test/pil2/vadcop-fibonacci-std/fibonacci.pil | 3 +- test/pil2/vadcop-fibonacci-std/module.pil | 2 +- test/pil2/vadcop-fibonacci-std2/fibonacci.pil | 24 + test/pil2/vadcop-fibonacci-std2/module.pil | 15 + test/pil2/vadcop/std_sum.pil | 50 +- 39 files changed, 866 insertions(+), 1046 deletions(-) delete mode 100644 src/compiler_legacy.js create mode 100644 test/pil2/features/compressed.pil create mode 100644 test/pil2/std2/std_mset_lookup_range.pil create mode 100644 test/pil2/vadcop-fibonacci-std2/fibonacci.pil create mode 100644 test/pil2/vadcop-fibonacci-std2/module.pil diff --git a/src/assert.js b/src/assert.js index 557c155..1386bc8 100644 --- a/src/assert.js +++ b/src/assert.js @@ -8,7 +8,7 @@ function assertLog(condition, info) { } function assertReturnInstanceOf(value, cls, info) { - _assert(value instanceof cls); + assertLog(value instanceof cls, [value, info]); return value; } module.exports = { diff --git a/src/builtin/assert_eq.js b/src/builtin/assert_eq.js index 075b658..039e898 100644 --- a/src/builtin/assert_eq.js +++ b/src/builtin/assert_eq.js @@ -1,6 +1,7 @@ const Function = require("../function.js"); const Expression = require('../expression.js'); const Context = require('../context.js'); +const IntValue = require('../expression_items/int_value.js'); const {assert, assertLog} = require('../assert.js'); module.exports = class AssertEq extends Function { constructor () { @@ -22,6 +23,6 @@ module.exports = class AssertEq extends Function { return 0n; } exec(s, mapInfo) { - return mapInfo; + return new IntValue(mapInfo); } } diff --git a/src/builtin/assert_not_eq.js b/src/builtin/assert_not_eq.js index 1b3dfb5..40b06d5 100644 --- a/src/builtin/assert_not_eq.js +++ b/src/builtin/assert_not_eq.js @@ -1,4 +1,6 @@ const Function = require("../function.js"); +const IntValue = require('../expression_items/int_value.js'); + module.exports = class AssertNotEq extends Function { constructor (parent) { super(parent, {funcname: 'assert_not_eq'}); @@ -15,7 +17,7 @@ module.exports = class AssertNotEq extends Function { return 0n; } exec(s, mapInfo) { - return mapInfo; + return new IntValue(mapInfo); } } diff --git a/src/builtin/defined.js b/src/builtin/defined.js index 3c3ed86..6f6665b 100644 --- a/src/builtin/defined.js +++ b/src/builtin/defined.js @@ -12,6 +12,7 @@ module.exports = class Defined extends Function { throw new Error('Invalid number of parameters'); } const arg0 = s.args[0]; + console.log('DEFINED', arg0); let value = false; try { if (arg0) { @@ -34,6 +35,7 @@ module.exports = class Defined extends Function { return res; } exec(s, mapInfo) { + console.log('DEFINED', mapInfo); return mapInfo; } } diff --git a/src/builtin/error.js b/src/builtin/error.js index 95ac6fd..6770437 100644 --- a/src/builtin/error.js +++ b/src/builtin/error.js @@ -1,4 +1,6 @@ const Function = require("../function.js"); +const IntValue = require('../expression_items/int_value.js'); + module.exports = class Error extends Function { constructor (parent) { super(parent, {funcname: 'error', args: [], returns: [] }); @@ -24,6 +26,8 @@ module.exports = class Error extends Function { caller = e.stack.split('\n').slice(1).join('\n'); } console.log(caller);*/ - console.log(`\x1B[1;35m[${s.debug}] ERROR ${mapInfo.join(' ')}\x1B[0m`); + console.log(`\x1B[1;35mERROR ${mapInfo.join(' ')}\x1B[0m`); + EXIT_HERE; + return new IntValue(0n); } } diff --git a/src/builtin/is_array.js b/src/builtin/is_array.js index 52f0ec8..cfc072c 100644 --- a/src/builtin/is_array.js +++ b/src/builtin/is_array.js @@ -1,4 +1,5 @@ const Function = require("../function.js"); +const IntValue = require('../expression_items/int_value.js'); module.exports = class IsArray extends Function { constructor (parent) { @@ -21,6 +22,6 @@ module.exports = class IsArray extends Function { return 0n; } exec(s, mapInfo) { - return mapInfo; + return new IntValue(mapInfo); } } diff --git a/src/builtin/length.js b/src/builtin/length.js index 1621e92..1142f3f 100644 --- a/src/builtin/length.js +++ b/src/builtin/length.js @@ -1,6 +1,7 @@ const Function = require("../function.js"); const StringValue = require('../expression_items/string_value.js'); const IntValue = require('../expression_items/int_value.js'); +const util = require('util'); module.exports = class Length extends Function { constructor (parent) { super(parent, {funcname: 'length'}); @@ -10,16 +11,24 @@ module.exports = class Length extends Function { throw new Error('Invalid number of parameters'); } const arg0 = s.args[0]; - const item = arg0.eval(); + const item = arg0.evalAsItem(); + console.log(util.inspect(item, false, null, true)); if (item instanceof StringValue) { return {result: BigInt(item.length)}; } - if (arg0 && arg0.isReference()) { + console.log(item); + console.log(item.array); + if (item && item.array) { + console.log(util.inspect(item, false, null, true)); + console.log(BigInt(item.array.getLength(0))); return {result: item.array ? BigInt(item.array.getLength(0)) : 0n}; } + console.log('OHH, NOOO!!!'); return {result: 0n}; } exec(s, mapInfo) { - return new IntValue(mapInfo.result); + const res = new IntValue(mapInfo.result); + console.log('LENGTH', res); + return res; } } diff --git a/src/builtin/println.js b/src/builtin/println.js index 605f732..7e954fb 100644 --- a/src/builtin/println.js +++ b/src/builtin/println.js @@ -1,4 +1,5 @@ const Function = require("../function.js"); +const IntValue = require('../expression_items/int_value.js'); module.exports = class Println extends Function { constructor (parent) { super(parent, {funcname: 'println', args: [], returns: [] }); @@ -11,7 +12,7 @@ module.exports = class Println extends Function { continue; } - const value = this.expressions.e2value(arg); + const value = arg.eval(); texts.push(value); } return texts; @@ -24,6 +25,7 @@ module.exports = class Println extends Function { caller = e.stack.split('\n').slice(1).join('\n'); } console.log(caller);*/ - console.log(`\x1B[1;35m[${s.debug}] ${mapInfo.join(' ')} (DEEP:${this.scope.deep})\x1B[0m`); + console.log(`\x1B[1;35mPRINTLN ${mapInfo.join(' ')}\x1B[0m`); + return new IntValue(0); } } diff --git a/src/compiler_legacy.js b/src/compiler_legacy.js deleted file mode 100644 index e8e3d09..0000000 --- a/src/compiler_legacy.js +++ /dev/null @@ -1,882 +0,0 @@ -// import {Expressions} from './expressions.js'; - -const path = require("path"); -const fs = require("fs"); -const pil_parser = require("../build/pil_parser.js"); -const { check } = require("yargs"); -const Scalar = require("ffjavascript").Scalar; -const Expressions = require("./expressions.js"); -const Definitions = require("./definitions.js"); -const References = require("./references.js"); -const Indexable = require("./indexable.js"); -const Ids = require("./ids.js"); -const Constraints = require("./constraints.js"); -const Processor = require("./processor.js"); -const { mainModule } = require("process"); - - -const oldParseError = pil_parser.Parser.prototype.parseError; - -class SkipNamespace extends Error { - constructor(namespace, name = false) { - super(name ? `Pol ${namespace}.${name} must be skipped` : `Namespace ${namespace} must be skipped`); - this.namespace = namespace; - this.name = name; - } -} - -class Compiler { - - constructor(Fr) { - this.Fr = Fr; - this.references = new References(Fr); - this.globalConstraints = new Constraints(Fr); - this.constraints = new Constraints(Fr); - this.constants = new Definitions(Fr); - this.publics = new Ids(Fr); - this.prover = new Ids(Fr); - this.expressions = new Expressions(Fr, this, this.references, this.publics, this.constants); - this.globalExpressions = new Expressions(Fr, this, this.references, this.publics, this.constants); - this.processor = new Processor(Fr, this, this.references, this.expressions); - } - - initContext() { - this.subproofs = {}; - this.nWitnessCols = 0; - this.nFixedCols = 0; - this.nIm = 0; - this.nQ = 0; - this.nPublic = 0; - this.polIdentities = []; - this.plookupIdentities = []; - this.permutationIdentities = []; - this.connectionIdentities = []; - this.namespace = "Global"; - this.includedFiles = {}; - this.namespaces = true; - this.skippedNamespaces = {}; - this.skippedPols = {}; - this.includePaths = (this.config && this.config.includePaths) ? (Array.isArray(this.config.includePaths) ? this.config.includePaths: [this.config.includePaths]): []; - this.relativeFileName = ''; - } - async compile(fileName, config = {}) { - const isMain = true; - this.initContext(); - - if (config) { - this.config = config; - if (this.config.namespaces) { - this.namespaces = {}; - for (const name of this.config.namespaces) { - this.namespaces[name] = 0; - } - } - if (this.config.defines && typeof this.config.defines === 'object') { - for (const name in this.config.defines) { - this.constants.define(name, this.Fr.e(this.config.defines[name])); - } - } - } else { - this.config = {}; - } - const ansiColor = this.config.color ? (x) => '\x1b['+x+'m' : (x) => ''; - - await this.parseSource(fileName, true); - console.log('\x1b[1;35m==== CONSTANTS ===='); - this.constants.dump(); - console.log('\x1b[0m'); - this.checkNotFoundNamespaces(); - this.checkUndefinedPols(); - this.simplifyAll(); - // this.checkUnusedExpressions(); - this.checkExpressionsDegree(); - this.reduceExpressions(); - return this.contextToJson(); - } - instanceParser(src, fullFileName) { - this.srcLines = src.split(/(?:\r\n|\n|\r)/); - - const myErr = function (str, hash) { - str = fullFileName + " -> " + str; - oldParseError(str, hash); - }; - pil_parser.Parser.prototype.parseError = myErr; - - let parser = new pil_parser.Parser(); - const parserPerformAction = parser.performAction; - const productions = parser.productions_; - let compiler = this; - parser.performAction = function (yytext, yyleng, yylineno, yy, yystate, $$, _$ ) { - console.log(yystate); - const result = parserPerformAction.apply(this, arguments); - const first = _$[$$.length - 1 - productions[yystate][1]]; - const last = _$[$$.length - 1]; - if (typeof this.$ !== 'object') { - if (!this.$) { - console.log(`STRANGE THINK IN STATE ${yystate} `+(typeof this.$)); - this.$ = {}; - } - else { - return result; - } - } - this.$.debug = `${compiler.relativeFileName} ${first.first_line}:${first.first_column}`; - if (typeof last.last_line != 'undefined' && last.last_line != first.first_line) { - this.$.debug += ` ${last.last_line}`; - } - if (typeof last.last_column != 'undefined') { - this.$.debug += `:${last.last_column}`; - } - /* - this.$.first_line = first.first_line; - this.$.first_column = first.first_column; - this.$.last_line = last.last_line || first.first_line; - this.$.last_column = last.last_column || first.first_column;*/ - return result; - } - return parser; - } - async parseSource(fileName, isMain = false) { - - const [src, fileDir, fullFileName, relativeFileName] = await this.loadSource(fileName, isMain); - - this.relativeFileName = relativeFileName; - this.fileDir = fileDir; - - const parser = this.instanceParser(src, fullFileName); - const sts = parser.parse(src); - - for (let i=0; i '+s.locator); - this.fileName = s.fileName = relativeFileName; - this.line = s.first_line; - console.log('S'); - console.log(s); - this.sourceRef = `${s.fileName}:${s.first_line}`; - - let skip = false; - let poldef = false; - let insideIncludedDomain = false; - - const ctxExprLen = this.expressions.length; - try { - this.checkNamespace(this.namespace); - insideIncludedDomain = true; - await this.parseStatement(s); - } catch (err) { - if (err instanceof SkipNamespace) { - skip = true; - } else { - throw err; - } - } - if (!skip) continue; - - if (insideIncludedDomain) { - let verboseInfo = ''; - if (this.config.verbose) { - verboseInfo = ':\n' + ansiColor(36) + srcLines.slice(s.first_line-1, Math.min(s.first_line+3, s.last_line)).join('\n'); - const lineStrLines = s.last_line - s.first_line + 1; - if (lineStrLines > 3) verboseInfo += " ..."; - verboseInfo += ansiColor(0) +'\n'; - } - console.log(`NOTE: ${this.relativeFileName}:${s.first_line} was ignored${verboseInfo}`); - } - - if (poldef) { - console.log(`adding ${poldef} to exclude`); - this.skippedPols[poldef] = true; - } - while (ctxExprLen < this.expressions.length) { - this.expressions.pop(); - } - } - } - async parseStatements(statements) { - for (const s of statements) { - const res = await this.parseStatement(s); - if (typeof res === 'boolean') { - return res; - } - } - } - async parseStatement(s) { - const method = ('do_'+s.type).replace(/[-_][a-z]/g, (group) => group.slice(-1).toUpperCase()); - console.log(`[${s.type}] ===> ${method}`); - if (!(method in this)) { - console.log('==== ERROR ===='); - console.log(s); - this.error(s, `Invalid line type: ${s.type}`); - } - if (this[method].constructor.name === 'AsyncFunction') { - console.log(`CALLING ASYNC FUNCTION ${method}`) - return await this[method](s); - } - console.log(`REGULAR CALLING FUNCTION ${method}`) - return this[method](s); - } - doWitnessColDeclaration(s) { - this.nWitnessCols = this.colDeclaration(s, 'witness', this.nWitnessCols); - } - doFixedColDeclaration(s) { - this.nFixedCols = this.colDeclaration(s, 'fixed', this.nFixedCols); - } - doColDeclaration(s) { - this.nIm = this.colDeclaration(s, 'im', this.nIm, true); - } - colDeclaration(s, type, nextId, reserveExpressions = false) { - console.log('*********'); - console.log(s); - for (const col of s.items) { - const colname = this.getFullName(col);; - console.log(`COL_DECLARATION(${colname}) type:${type} nextId:${nextId}`); - let ref = this.references.get(colname); - if (ref !== null) { - this.error(s, `${colname} already defined on ${ref.sourceRef}`); - } - // TODO: multidimensional-array - let len = (col.type === 'array') ? this.getExprNumber(col.expLen, s, `${colname} array size`) : 1; - const refId = reserveExpressions ? this.expressions.reserve(len) : nextId; - ref = { - type, - id: refId, - colDeg: this.colDeg, - sourceRef: s.sourceRef, - isArray: (col.type === 'array'), - }; - if (col.type === 'array') { - ref.len = len; - } - nextId += len; - this.references.define(colname, ref); - /// TODO: INIT / SEQUENCE - } - return nextId; - } - addExpression(expr) - { - this.addFilename(expr, this.relativeFileName); - return this.expressions.insert(expr); - } - updateExpression(id, expr) - { - this.addFilename(expr, this.relativeFileName); - return this.expressions.update(id, expr); - } - async doInclude(s) { - console.log(`doInclude ======${s.file.value}`); - console.log(s); - console.log([this.fileDir, s.fileName]); - const includeFile = this.asString(s.file); - const fullFileNameI = this.config.includePaths ? s.file : path.resolve(this.fileDir, includeFile); - if (!this.includedFiles[fullFileNameI]) { // If a file included twice just ignore - console.log(`doInclude ======${s.file.value}============== PROCESS`); - this.includedFiles[fullFileNameI] = true; - const previous = [this.namespace, this.cwd, this.relativeFileName, this.fileDir ]; - - this.namespace = false; - this.cwd = this.fileDir; - await this.parseSource(fullFileNameI, false); - - [this.namespace, this.cwd, this.relativeFileName, this.fileDir ] = previous; - - // TODO -> review this part - // if (pendingCommands.length>0) this.error(s, "command not allowed before include"); - // lastLineAllowsCommand = false; - } else { - console.log(`doInclude ======${s.file.value}============== IGNORE`); - } - console.log('doInclude END'); - return true; - } - async doNamespace(s) { - const subproof = s.subproof ?? false; - const namespace = s.namespace; - if (subproof !== false && !(subproof in this.subproofs)) { - this.error(s, `subproof ${s.subproof} hasn't been defined`); - } - - // TODO: verify if namespace just was declared in this case subproof must be the same - const previous = [this.namespace, this.subproof ]; - this.namespace = namespace; - this.subproof = subproof; - console.log(s); - await this.parseStatements(s.statements); - [this.namespace, this.subproof ] = previous; - } - doSubproofDefinition(s) { - const subproof = s.name ?? false; - console.log(`doSubproofDefinition ====== ${subproof}`); - if (subproof === false) { - this.error(s, `subproof not defined correctly`); - } - const subproofInfo = this.subproofs[subproof]; - if (subproofInfo !== undefined) { - this.error(s, `subproof ${subproof} has been defined previously on ${subproofInfo.sourceRef}`); - } - let rows = []; - // TO-DO: eval expressions; - this.subproofs[subproof] = { - sourceRef: this.sourceRef, - rows - }; - } - doPolDefinition(s) { - const polname = this.namespace + "." + s.name; - s.expression.poldef = polname; - const eidx = this.addExpression(s.expression); - let ref = this.references.get(polname); - if (ref !== null) { - this.error(s, `${polname} already defined on ${ref.sourceRef}`); - } - ref = { - type: 'imP', - id: eidx, - polDeg: this.polDeg, - sourceRef: s.sourceRef, - }; - this.references.define(polname, ref); - this.nIm++; - } - setPol(s) { -// const polname = this.namespace + "." + s.name; -// let ref = this.references.get(polname); - const [polname, ref, id] = this.expressions.resolveReference(s); - - if (ref.type === 'var') { - ref.value = this.expressions.e2num(s.expression); - this.references.set(polname, ref); - } else { - if (this.expressions.get(id) !== null) { - this.error(s, `multiple initializations of ${polref}`); - } - s.expression.poldef = polname; - this.updateExpression(id, s.expression); - } - } - doConstraint(s) { - console.log('********** doConstraint ********** (s.expression:)'); - let constraint = {op: 'sub', values: [s.left, s.right]}; - console.log(s); - this.expressions.toString(constraint); - let expr = this.expressions.evaluate(constraint, {update: true, Fr: this.Fr}); - console.log('********** doConstraint ********** (expr)'); - this.expressions.toString(expr); - const eidx = this.addExpression(expr); - this.constraints.push({fileName: this.relativeFileName, namespace: this.namespace, line: s.first_line, e: eidx}); - } - composePlPeIdentity(s) { - const pu = { - fileName: this.relativeFileName, - namespace: this.namespace, - line: s.first_line, - f: [], - t: [], - selF: null, - selT: null - } - s.f.forEach(expr => pu.f.push(this.addExpression(expr))); - if (s.selF) { - pu.selF = this.addExpression(s.selF); - } - s.t.forEach(expr => pu.t.push(this.addExpression(expr))); - if (s.selT) { - pu.selT = this.addExpression(s.selT); - } - if (pu.f.length != pu.t.length ) { - this.error(s, `${s.type} with diferent number of elements`); - } - return pu; - } - doPlookupIdentity(s) { - this.plookupIdentities.push(this.composePlPeIdentity(s)); - } - doPermutationIdentity(s) { - this.permutationIdentities.push(this.composePlPeIdentity(s)); - } - doConnectionIdentity(s) { - const ci = { - fileName: this.relativeFileName, - namespace: this.namespace, - line: s.first_line, - pols: [], - connections: [], - } - s.pols.forEach(expr => ci.pols.push(this.addExpression(expr))); - s.connections.forEach(expr => ci.connections.push(this.addExpression(expr))); - if (ci.pols.length != ci.connections.length ) { - this.error(s, `connection with diferent number of elements`); - } - this.connectionIdentities.push(ci); - } - getExprNumber(expr, s, title) { - console.log(expr); - const se = this.expressions.simplifyExpression(expr); - if (se.op !== 'number') { - this.error(s, title + ' is not constant expression'); - } - return Number(se.value); - } - getReferenceArrayOffset(s, pol, polname) { - if (!this.references.isDefined(polname)) { - this.error(s, `polynomial ${polname} not defined`); - } - const ref = this.references.get(polname); - - if (pol.idxExp && !ref.isArray) { - this.error(s, `${polname} is not an Array`); - } - if (!pol.idxExp && ref.isArray) { - console.log([pol, ref]); - this.error(s, `${polname}: index of an array not specified`); - } - const offset = ref.isArray ? this.getExprNumber(pol.idxExp, s, 'Index') : 0; - return [ref, offset]; - } - doFunctionDefinition(s) { - // this.functions.define() - } - doPublicDeclaration(s) { - if (this.publics.isDefined(s.name)) { - this.error(s, `name already defined ${s.name}`); - } - const polname = (s.pol.namespace === 'this' ? this.namespace : s.pol.namespace) + '.' + s.pol.name; - const [ref, offset] = this.getReferenceArrayOffset(s, s.pol, polname); - const idx = this.getExprNumber(s.idx, s, 'Index of a public'); - this.publics.define(s.name, { - polType: ref.type, - polId: Number(ref.id) + offset, - idx, - id: this.nPublic++ - }); - } - doConstantDefinition(s) { - if (this.config.defines && s.name in this.config.defines) { - console.log(`NOTICE: Ignore constant definition ${s.name} on ${this.relativeFileName}:${s.first_line} because it was pre-defined`); - return; - } - if (this.constants.isDefined(s.name)) { - this.error(s, `name already defined ${s.name}`); - } - this.constants.define(s.name, this.getExprNumber(s.value, s, `constant ${s.name} definition`)); - } - doCode(s) { - return this.processor.execute(s.statments); - } - async loadSource(fileName, isMain) { - let fullFileName, fileDir, src; - let relativeFileName = ''; - let includePathIndex = 0; - if (isMain && this.config.compileFromString) { - relativeFileName = fullFileName = "(string)"; - fileDir = ''; - src = fileName; - } - else { - let includePaths = [...this.includePaths]; - let directIncludePathIndex; - const cwd = this.cwd ? this.cwd : process.cwd(); - - if (this.config.includePathFirst) { - directIncludePathIndex = includePaths.length; - includePaths.push(cwd); - } - else { - directIncludePathIndex = 0; - includePaths.unshift(cwd); - } - do { - fullFileName = path.resolve(includePaths[includePathIndex], fileName); - if (fs.existsSync(fullFileName)) break; - ++includePathIndex; - } while (includePathIndex < includePaths.length); - - fileDir = path.dirname(fullFileName); - - if (includePathIndex != directIncludePathIndex) { - relativeFileName = fileName; - } - else { - if (isMain) { - relativeFileName = path.basename(fullFileName); - this.basePath = fileDir; - } else { - if (fullFileName.startsWith(this.basePath)) { - relativeFileName = fullFileName.substring(this.basePath.length+1); - } else { - relativeFileName = fullFileName; - } - } - } - console.log(`LOADING FILE ${fullFileName} .............`) - src = await fs.promises.readFile(fullFileName, "utf8") + "\n"; - console.log('END LOADING ...'); - } - console.log('################ BEGIN SOURCE #########################'); - console.log(src); - console.log('################ END SOURCE #########################'); - return [src, fileDir, fullFileName, relativeFileName]; - } - - reduceExpressions() { - for (const pol of this.polIdentities) { - this.expressions.reduceTo2(pol.e); - } - for (const plpe of [this.plookupIdentities, this.permutationIdentities]) { - for (const pol of plpe) { - for (const f of pol.f) { - this.expressions.reduceTo1(f); - } - if (pol.selF) { - this.expressions.reduceTo1(pol.selF); - } - for (const t of pol.t) { - this.expressions.reduceTo1(t); - } - if (pol.selT) { - this.expressions.reduceTo1(pol.selT); - } - } - } - for (const pol of this.connectionIdentities) { - for (const p of pol.pols) { - this.expressions.reduceTo1(p); - } - for (const co of pol.connections) { - this.expressions.reduceTo1(co); - } - } - } - error (l, err) { - if (err instanceof Error) { - err.message = `ERROR ${l.fileName}:${l.first_line}: ${err.message}` - throw(err); - } else { - const msg = `ERROR ${l.fileName}:${l.first_line}: ${err}`; - throw new Error(msg); - } - } - expressionToJson(e, deps) { - let main = false; - if (!deps) { - deps = []; - main = true; - } - const out = { - op: e.op - } - out.deg = e.deg; - if (e.op == 'pol') { - const polname = e.namespace + '.' + e.name - const [ref, offset] = this.getReferenceArrayOffset(e, e, polname); - out.id = Number(ref.id) + offset; - if (ref.type === 'cmP') { - out.op = 'cm'; - } else if (ref.type === 'constP') { - out.op = 'const'; - } else if (ref.type === 'imP') { - // TODO: array support on temporal - if (!main) { - deps.push(ref.id); - } - out.op = 'exp' - } - out.next = e.next; - } - if (e.op == "public") { - const ref = this.publics.get(e.name); - out.id = ref.id; - out.op = 'public'; - } - if (typeof e.idQ !== 'undefined') { - out.idQ = e.idQ; - } - if (typeof e.values !== 'undefined') { - out.values = e.values.map(value => this.expressionToJson(value, deps)); - } - if (typeof e.value !== 'undefined') { - out.value = e.value; - } - if (typeof e.const !== 'undefined') { - out.const = e.const; - } - if (main && deps.length>0) { - out.deps = deps; - } - return out; - } - contextToJson() { - let out = { - nCommitments: this.nCommitments, - nQ: this.nQ, - nIm: this.nIm, - nConstants: this.nConstants, - publics: [], - references: {}, - expressions: [], - polIdentities: [], - plookupIdentities: [], - permutationIdentities: [], - connectionIdentities: [] - }; - - for (const [name,ref] of this.references.keyValues()) { - out.references[name] = { - type: ref.type, - id: ref.id, - polDeg: ref.polDeg, - isArray: ref.isArray ? true:false }; - if (ref.isArray) { - out.references[name].len = ref.len; - } - } - - for (const [name, pub] of this.publics.keyValues()) { - out.publics[pub.id] = pub; - out.publics[pub.id].name = name; - } - - for (const expr of this.expressions) { - out.expressions.push(this.expressionToJson(expr)); - } - - for (const pi of this.polIdentities) { - out.polIdentities.push({ - e: pi.e, - fileName: pi.fileName, - line: pi.line - }); - } - - for (const ptype of ['plookupIdentities', 'permutationIdentities']) { - for (const p of this[ptype]) { - out[ptype].push({ - f: p.f, - t: p.t, - selF: p.selF, - selT: p.selT, - fileName: p.fileName, - line: p.line}); - } - } - - for (const ci of this.connectionIdentities) { - out.connectionIdentities.push({ - pols: ci.pols, - connections: ci.connections, - fileName: ci.fileName, - line: ci.line }); - } - - return out; - } - - addFilename(exp, fileName) { - exp.fileName = fileName; - if (exp.namespace === "this") exp.namespace = this.namespace; - else if (exp.namespace) this.checkNamespace(exp.namespace); - - if (exp.name) this.checkSkippedPols(exp.namespace, exp.name); - if (exp.values) { - for(let i=0; i this.namespaces[namespace] === 0); - if (notFoundNamespaces.length) { - throw new Error('ERROR: namespaces not found: '+notFoundNamespaces.join(', ')); - } - } - } - checkUndefinedPols() { - let undefined = 0; - let names = []; - for (const [name, ref] of this.references.keyValues()) { - if (ref.type !== 'imP') continue; - const len = ref.isArray ? ref.len : 1; - let fromId = ref.id; - let reported = false; - for (let index = 0; index < len; ++index ) { - if (this.expressions.get(fromId + index) !== null) continue; - ++undefined; - if (ref.isArray) console.log(`ERROR: Undefined temporal pol ${name}[${index}]`) - else console.log(`ERROR: Undefined temporal pol ${name}`) - if (reported) continue; - names.push(name); - reported = true; - } - } - if (undefined > 0) { - throw new Error(`found ${undefined} undefined pols (${names.join(',')})`); - } - } - checkUnusedExpressions() { - for (const expr of this.expressions) { - if (!expr.used) { - console.log(expr); - if (this.config.disableUnusedError) { - console.log(`WARNING: Unused expresion ${expr.poldef} on ${expr.fileName}:${expr.first_line}`); - } else { - this.error(expr, `Unused expression ${expr.poldef} `); - } - } - if (expr.deg>2) { - this.error(expr, `Degree ${expr.deg} greater than 2`); - } - } - } - checkExpressionsDegree(limit=2) { - for (const expr of this.expressions) { - if (expr.deg <= limit) continue; - this.error(expr, `Degree ${expr.deg} greater than ${limit}`); - } - } - getFullName(e) { - if (e.name === 'RESET') { - console.log(['E', e, this.namespace, this.subproof]); - } - const ns = (((e.namespace ?? 'this') === 'this') ? this.namespace : e.namespace); - const sp = (((e.subproof ?? 'this') === 'this') ? this.subproof : e.subproof); - - let name = ''; - if (sp !== '') { - name += sp + '::'; - } - if (ns !== '') { - name = ns + '.'; - } - name += e.name; - console.log(`${e.name} ==> ${name}`) - return name; - } - asString(s) { - if (typeof s === 'string') return s; - if (typeof s === 'bigint') return ''+s; - if (typeof s.type === 'string') { - return s.value; - } - if (typeof s.type === 'template') { - // TODO: resolve template ??? - return s.value; - } - this.error(s, "invalid string"); - } -} - -module.exports = async function compile(Fr, fileName, ctx, config = {}) { - - let compiler = new Compiler(Fr); - return await compiler.compile(fileName, config); -} diff --git a/src/constraints.js b/src/constraints.js index 2ce4ca3..741914f 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -55,7 +55,10 @@ module.exports = class Constraints { if (right.asIntDefault(false) !== 0n) { left.insert('sub', right); } - // left.simplify(); + // const dumpId = Date.now(); + // left.dump(`XXXXXXXXX-${dumpId}-1`) + // left.instance().dump(`XXXXXXXXX-${dumpId}-2`); + left.simplify(); const exprId = Context.expressions.insert(left); return this.constraints.push({exprId, sourceRef, boundery}) - 1; } diff --git a/src/containers.js b/src/containers.js index 29d8e6d..9d23145 100644 --- a/src/containers.js +++ b/src/containers.js @@ -47,6 +47,13 @@ module.exports = class Containers { } throw new Error(`unsetProperty was called with invalid property ${property}`); } + clearScope(proofScope) { + console.log(`CLEAR-SCOPE.CONTAINERS.IN ${proofScope}`, Object.keys(this.containers).map(name => [name, this.containers[name].scope])); + this.containers = Object.keys(this.containers) + .filter(name => this.containers[name].scope !== proofScope) + .reduce((containers, name) => { containers[name] = this.containers[name]; return containers; }, {}); + console.log(`CLEAR-SCOPE.CONTAINERS.OUT ${proofScope}`, Object.keys(this.containers).map(name => [name, this.containers[name].scope])); + } create(name, alias = false) { if (this.current !== false) { diff --git a/src/context.js b/src/context.js index 61a1d93..78da4ae 100644 --- a/src/context.js +++ b/src/context.js @@ -12,6 +12,8 @@ module.exports = class Context { this.stack = []; this.config = {debug: {}}; this.uses = []; + this.subproofName = false; + this.airName = false; } static get expressions() { return this._instance._processor.expressions; @@ -37,6 +39,15 @@ module.exports = class Context { static get references() { return this._instance._processor.references; } + static get proofLevel() { + if (this.airName) { + return `AIR:${this.airName}`; + } + if (this.subproofName) { + return `SUBPROOF:${this.subproofName}`; + } + return 'PROOF'; + } setNamespace(namespace, subproof) { this.namespace = namespace; if (typeof subproof !== 'undefined') { diff --git a/src/debug_console.js b/src/debug_console.js index 23f6b60..98194e3 100644 --- a/src/debug_console.js +++ b/src/debug_console.js @@ -1,4 +1,5 @@ module.exports = class DebugClass { + static logid = 0; constructor (options = {}) { this.originalMethod = console.log; this.maxSourceRefLen = options.maxSourceRefLen ?? 20; @@ -30,8 +31,10 @@ module.exports = class DebugClass { if (initiator === false) { this.originalMethod.apply(console, args); } else { + ++DebugClass.logid; initiator = initiator.split(':').slice(0,2).join(':').replace('.js',''); initiator = initiator.length > this.maxSourceRefLen ? ('...' + initiator.substring(-this.maxSourceRefLen+3)) : initiator.padEnd(this.maxSourceRefLen); + initiator = initiator + DebugClass.logid.toString(16).toUpperCase().padStart(10, ' ')+'L'; this.originalMethod.apply(console, [`\x1B[30;104m${initiator} \x1B[0m`, ...args]); } } diff --git a/src/expression.js b/src/expression.js index 5c1e7e4..69d1c40 100644 --- a/src/expression.js +++ b/src/expression.js @@ -80,17 +80,40 @@ class Expression extends ExpressionItem { return { op: stackPos.op, operands: stackPos.operands.map(operand => assertExpressionItem(operand.clone()))}; } -/* - cloneDeep(e, label = '') { - const res = cloneDeep(e); - return res; - } -*/ + applyNext(value) { this.stack.map(stack => stack.operands.map(operand => assertExpressionItem(operand.applyNext(value)))); } + insertStack(expressionToInsert, stackIndex) { const delta = expressionToInsert.stack.length; + + // + // Example1: Example2: + // Insert D on stackIndex = 0 Insert D on stackIndex = 1 + // + // | C | | | | C | + // | C | | B | | C | | B | + // | B | ----> | A | | B | ----> | D | + // | A | (D,0) | D | | A | (D,1) | A | + // └───┘ └───┘ └───┘ └───┘ + // + // + // length-1 ┌───────┐ ┐ + // │ │ │ moved-block (stackIndex, length - 1) + // ├───────┤ ┘ + // │ │ <--- expressionToInsert + // │ │ (delta positions) + // stackIndex |───────┤ ┐ + // │ │ │ non-moved-block (0 .. stackIndex - 1) + // 0 └───────┘ ┘ + // + + // All stack references use relative offsets (absolute = current_pos - offset). + // Loop over stack references of moved-block to update stack references that + // reference an non-moved-block element. This offset must be increased in delta + // positions (size of expression inserted) + for (let index = stackIndex; index < this.stack.length; ++index) { for (const operand of this.stack[index].operands) { if (operand instanceof ExpressionItems.StackItem === false) continue; @@ -100,14 +123,29 @@ class Expression extends ExpressionItem { } } } + + // + // _ ┌───────┐ ┐ + // / │ B │ │ moved-block + // / ├───────┤ ┘ + // length-1 ┌───────┐ / │ │ + // │ B │ / │ │ + // stackIndex |───────┤ |───────┤ ┐ + // │ A │ ----- │ A │ │ non-moved-block + // 0 └───────┘ └───────┘ ┘ + // + + // moving B to leave space to insert expression for (let index = this.stack.length - 1; index >= stackIndex; --index) { this.stack[index + delta] = this.stack[index]; } + + // clone and copy stack elements of expression to insert for (let index = 0; index < delta; ++index) { - console.log(index); - console.log(expressionToInsert.stack[index]); this.stack[index + stackIndex] = this.cloneStackPos(expressionToInsert.stack[index]); } + + // TO REVIEW this.fixedRowAccess = this.fixedRowAccess || expressionToInsert.fixedRowAccess; return 1; } @@ -181,6 +219,8 @@ class Expression extends ExpressionItem { return (ope.type === OP_RUNTIME); }*/ insertOne (op, b = false) { + console.log(`\x1B[44m======================== INSERT ONE (${op}) =================================\x1B[0m`); + console.log(util.inspect(b, false, null, true)); assert(b === false || b instanceof Expression); const aIsEmpty = this.stack.length === 0; const bIsEmpty = b === false || b.stack.length === 0; @@ -223,11 +263,18 @@ class Expression extends ExpressionItem { } insert (op, bs) { + console.log(`\x1B[41m======================== INSERT (${op}) =================================\x1B[0m`); + this.dump(); + console.log(util.inspect(bs, false, null, true)); if (!Array.isArray(bs)) { - return this.insertOne(op, bs); + const res = this.insertOne(op, bs); + res.dump(); + return res; } if (bs.length === 1) { - return this.insertOne(op, bs[0]); + const res = this.insertOne(op, bs[0]); + res.dump(); + return res; } // verify that all bs are expressions assert(bs.reduce((isExpression, b) => isExpresion = isExpression && b instanceof Expression, true)); @@ -405,12 +452,12 @@ class Expression extends ExpressionItem { } // stackResults[pos][0] contains result of this stack position, // in stackResults[pos][1] contains a results array of this stack position operands - instance() { + instance(options) { console.log(Context.sourceRef); this.dump("#############"); let cloned = this.clone(); - const options = {instance: true} - let stackResults = cloned.evaluateOperands(options); + options = {...options, instance: true} + let stackResults = options.stackResults ?? cloned.evaluateOperands(options); // cloned.extendExpressions(options); cloned.evaluateFullStack(stackResults, options); cloned.dump('PRE-SIMPLIFY'); @@ -421,50 +468,75 @@ class Expression extends ExpressionItem { return cloned; } evalAsValue(options) { - return this.eval({...options, onlyAsValue: true}); +// return this.eval({...options, onlyAsValue: true}); + let res = this.eval(options); + if (res.isAlone()) { + res = res.getAloneOperand(); + } + return (res instanceof ExpressionItems.ValueItem || res instanceof ExpressionItems.StringValue) ? res : ExpressionItems.NonRuntimeEvaluableItem.get(); } eval(options = {}) { + return this.instance(options); +/* console.trace('EVAL '+this.toString()); if (this.stack.length === 0) { return this; } let stackResults = this.evaluateOperands(options); this.evaluateFullStack(stackResults, options); - if (!options.onlyAsValue && stackResults[0][0] instanceof ExpressionItems.NonRuntimeEvaluableItem) { - const res = this.instance(); - return res; - } const res = stackResults[this.stack.length-1][0]; - return res; + if (!options.onlyAsValue && res instanceof ExpressionItems.NonRuntimeEvaluableItem) { + return this.instance({...options, stackResults}); + } + return res;*/ + } + stackResultsToString(stackResults) { + return stackResults.map((x, index) => `#${index} ${x[0] ?? 'null'} ${x[1].map(o => o ? o.toString() : o).join(',')}`).reverse().join('\n'); } evaluateFullStack(stackResults, options) { - this.evaluateStackPos(stackResults, this.stack.length - 1, options); + const evaluateId = Date.now(); + this.dump(`evaluateFullStack #${evaluateId} BEGIN`); + console.log("\n", this.stackResultsToString(stackResults)); + // console.log(util.inspect(stackResults, false, null, true)); + this.evaluateStackPos(stackResults, this.stack.length - 1, {...options, evaluateId}); + this.dump(`evaluateFullStack #${evaluateId} END`); } evaluateStackPos(stackResults, stackIndex, options = {}) { const st = this.stack[stackIndex]; const results = stackResults[stackIndex]; + const _debugLabel = `#${options.evaluateId ?? 0} S${stackIndex}(${st.op})`; // if stackResult is evaluated return value; if (results[0] !== null) { + console.log(`evaluateStackPos ${_debugLabel}`, results[0]); return results[0]; } + // console.log([results, st.operands.length, st]); let values = results[1]; for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { + const _operandDebugLabel = `${_debugLabel} ${operandIndex}]`; const operand = st.operands[operandIndex]; assertLog(operand instanceof ExpressionItem, [st.op, st.operands.length, operand]); - if ((values[operandIndex] ?? null) != null) { + const resultAvailable = (values[operandIndex] ?? null) != null; + if (resultAvailable) { + console.log(`evaluateStackPos ${_operandDebugLabel} ${values[operandIndex]}`) continue; } + if (operand instanceof ExpressionItems.StackItem) { values[operandIndex] = this.evaluateStackPos(stackResults, stackIndex - operand.getOffset()); + console.log(`evaluateStackPos STACK ${_operandDebugLabel} ${values[operandIndex]} ${stackIndex - operand.getOffset()}`, stackResults); } else { // console.log(operand); values[operandIndex] = operand.eval(options); + console.log(`evaluateStackPos NO-STACK ${_operandDebugLabel} ${values[operandIndex]}`, operand); } +/* if (options.instance && values[operandIndex] && values[operandIndex] instanceof ExpressionItems.NonRuntimeEvaluableItem === false && + values[operandIndex] instanceof ExpressionItems) if (options.instance) { - } + }*/ } // console.log(values); @@ -481,6 +553,14 @@ class Expression extends ExpressionItem { value = ExpressionItems.NonRuntimeEvaluableItem.get(); } else { value = this.applyOperation(st.op, values); + console.log(`evaluateStackPos/applyOperation ${_debugLabel} `); + console.log(util.inspect(values, false, null, true)); + console.log(util.inspect(value, false, null, true)); + if (options.instance) { + st.op = false; + st.operands = [value]; + console.log('ST.OPERANDS=[', value); + } } return (results[0] = value); } @@ -554,13 +634,16 @@ class Expression extends ExpressionItem { // First search on class of first operand, if not found, try to cast first operand to class of second // operand and search on class of second operand (*) // (*) only if two operands and operation is commutative - while (!equals && operationInfo.args == 2) { - const casting = this.castingItemMethod(types[0]); - if (typeof values[1][casting] === 'function') { + let iarg = 0; + while (!equals && operationInfo.args == 2 && iarg < operationInfo.args) { + const casting = this.castingItemMethod(types[iarg]); + methods.push(casting); + const icasting = iarg ? 0:1; + if (typeof values[icasting][casting] === 'function') { const method = this.operatorToMethod(operation); - methods.push(`${types[0]}.${method}`); + methods.push(`> ${types[iarg]}.${method}`); try { - const [executed, result] = this.applyOperatorMethod(method, [values[0], values[1][casting]()]); + const [executed, result] = this.applyOperatorMethod(method, values.map((x, index) => index === icasting ? x[casting](): x)); if (executed) { return result; } @@ -570,16 +653,8 @@ class Expression extends ExpressionItem { throw e; } } - if (onlyOneLoop) { - break; - } - } - values = values.reverse(); - types = types.reverse(); - reversed = !reversed; - if (reversed == false) { - break; } + ++iarg; } throw new Error(`Operation ${operation} not was defined by types ${types.join(',')} [${methods.join(', ')}]`); @@ -608,10 +683,10 @@ class Expression extends ExpressionItem { } // stack references not replaced // expression references not extended (inserted) - console.log([typeof value, value]); + /* console.log([typeof value, value]); if (value instanceof Expression) { value.dump(); - } + }*/ assert(value instanceof ExpressionItems.ExpressionItem); if (value instanceof ExpressionItems.StackItem) { return value; @@ -621,14 +696,9 @@ class Expression extends ExpressionItem { return ExpressionItems.NonRuntimeEvaluableItem.get(); } else if (value instanceof ExpressionItems.ReferenceItem) { const res = Context.runtime.eval(value, {}); - console.log(util.inspect(value, false, 10, true)); - console.log(res); - console.log(res.eval()); return res; } else if (value instanceof ExpressionItems.FunctionCall) { - console.log(util.inspect(value, false, 10, true)); const res = value.eval(); - console.log(res); return res; } else { console.log(value); @@ -652,7 +722,13 @@ class Expression extends ExpressionItem { return result; } evalAsInt(options = {}) { - const value = this.evalAsValue(options); + let value = this.evalAsValue(options); + if (value instanceof ExpressionItems.NonRuntimeEvaluableItem) { + debugger; + value = this.evalAsValue(options); + } + console.log(value); + console.log(this.dump()); const res = value.asIntDefault(false); if (res === false) { console.log(value); @@ -660,6 +736,13 @@ class Expression extends ExpressionItem { } return res; } + evalAsBool(options = {}) { + return this.evalAsInt(options) ? true : false; + } + evalAsItem(options) { + const res = this.eval(options); + return res.isAlone() ? res.cloneAloneOperand() : res; + } getArrayResult(results, indexes, options) { console.log(results); console.log(indexes); @@ -688,25 +771,39 @@ class Expression extends ExpressionItem { // when evaluates single operands, StackItem is a reference to stack position // and it could be evaluated when all operands are left-to-right evaluated - if (operand instanceof ExpressionItems.StackItem) continue; + if (operand instanceof ExpressionItems.StackItem) { + operandResults.push(null); + continue; + } // console.log(`CALL OPERAND ${stpos}/${this.stack.length} ${operandIndex}/${st.operands.length} ${operand}`); + + // optimization to get stackResults, to avoid calculate two times when + // insert into stack the expression (1) const result = operand.eval(options); operandResults.push(result); if (options.instance && result !== null) { + this.dump(`AAAA.IN stpos:${stpos}`); if (result instanceof Expression) { - this.dump('THIS BEFORE INSERTSTACK'); - result.dump('RESULT BEFORE INSERTSTACK'); - const stackOffset = this.insertStack(result.instance(), stpos); - console.log(stackOffset); - st.operands[operandIndex] = new ExpressionItems.StackItem(stackOffset); - this.dump('THIS AFTER INSERTSTACK'); + // insert expression below current position + this.insertStack(result, stpos); + st.operands[operandIndex] = new ExpressionItems.StackItem(1); + + // evaluate result, optimization (1), and after insert it + const stackResultToInsert = result.evaluateOperands(options); + stackResults.unshift(...stackResultToInsert); + + // at this moment position was increased because some elements + // are added on below positions. + stpos += result.stack.length; + this.dump('AAAA.OUT1'); } else { - console.log(result); st.operands[operandIndex] = assertExpressionItem(result); + this.dump('AAAA.OUT2'); } } } } + console.log("\n", this.stackResultsToString(stackResults)); return stackResults; } _calculate(st, pos, stackResults) { @@ -810,10 +907,13 @@ class Expression extends ExpressionItem { let loop = 0; while (this.stack.length > 0) { let updated = false; + this.dump('PRE-SIMPLIFY-OPERATION'); for (const st of this.stack) { updated = this.simplifyOperation(st) || updated; } + this.dump('POST-SIMPLIFY-OPERATION'); this.compactStack(); + this.dump('POST-COMPACT'); if (!updated) break; } } @@ -857,6 +957,8 @@ class Expression extends ExpressionItem { // [mul, x, 0] ==> [0] if (st.op === 'mul') { st.op = false; + // firstZero => st.operands[0] = 0 + // !firstZero => second = 0 ==> st.operands[1] = 0 st.operands = [st.operands[firstZero ? 0:1]]; return true; } @@ -885,6 +987,14 @@ class Expression extends ExpressionItem { return true; } + if (st.op === 'sub' && secondValue !== false && secondValue < 0n) { + console.log(st); + st.op = 'add'; + st.operands[1] = new ExpressionItems.IntValue(-secondValue); + console.log(st); + return true; + } + // TODO: be carrefull with next, prior, inc, dec // x - x = 0 ??? // (x - (- y)) = x + y @@ -907,53 +1017,67 @@ class Expression extends ExpressionItem { // this method compact stack positions with one element where operation // was false, replace reference of this stack operation by directly value compactStack() { - let translate = []; - let stackIndex = 0; + let translationTable = []; + let newStackIndex = 0; let stackLen = this.stack.length; + this.dump('PRE-COMPACTSTACK'); for (let istack = 0; istack < stackLen; ++istack) { const st = this.stack[istack]; if (st.op === false) { const ope = st.operands[0]; - // two situations, for alone stack reference, use its reference and it must - // be purged - translate[istack] = ope instanceof ExpressionItems.StackItem ? [true, translate[ope.getAbsolutePos(istack)][1]] : [true, istack]; + // two situations for alone: + // 1 - stack reference, use its reference and purge + // 2 - single operand, use index and purge + translationTable[istack] = ope instanceof ExpressionItems.StackItem ? { purge: true, newAbsPos: translationTable[ope.getAbsolutePos(istack)].newAbsPos} : + { purge: true, newAbsPos: istack }; continue; } - translate[istack] = [false, stackIndex++]; + translationTable[istack] = { purge: false, newAbsPos: newStackIndex++ }; // foreach operand if it's a stack reference, must be replaced by // new reference or by copy of reference if it was alone (no operation) for (let iope = 0; iope < st.operands.length; ++iope) { if ((st.operands[iope] instanceof ExpressionItems.StackItem) === false) continue; const absolutePos = st.operands[iope].getAbsolutePos(istack); - const [purge, newAbsolutePos] = translate[absolutePos]; + const translation = translationTable[absolutePos]; + console.log({istack, absolutePos, iope, translation}); assert(absolutePos < istack); - if (purge && this.stack[newAbsolutePos].op === false) { + if (translation.purge && this.stack[absolutePos].op === false) { // if purge and referenced position was alone, it is copied (duplicated) - this.stack[istack].operands[iope] = assertExpressionItem(this.stack[newAbsolutePos].operands[0].clone()); + this.dump('XXXX'); + this.stack[istack].operands[iope] = assertExpressionItem(this.stack[absolutePos].operands[0].clone()); + this.dump('YYYY'); } else { - // stackIndex - 1 is new really istack after clear simplified stack positions + // newStackIndex - 1 is new really istack after clear simplified stack positions // calculate relative position (offset) - const newOffset = (stackIndex - 1) - newAbsolutePos; + const newOffset = (newStackIndex - 1) - translation.newAbsPos; assert(newOffset > 0); this.stack[istack].operands[iope].setOffset(newOffset); } } } + // special case if top of stack is alone operator, it means + // that this is the result of expression. + const topStack = this.stack[stackLen - 1]; + if (topStack.op === false && (topStack.operands[0] instanceof ExpressionItems.StackItem) === false) { + this.stack = [this.stack[stackLen - 1]]; + return true; + } + console.log(translationTable); // DEBUG: - // translate.forEach((value, index) => console.log(`#${index} => ${value}`)); + // translationTable.forEach((value, index) => console.log(`#${index} => ${value}`)); // move stackpositions to definitive positions, from end to begin to avoid // overwriting, updating last position used to remove rest of stack positions let lastPosUsed = false; for (let istack = 0; istack < stackLen; ++istack) { - const [purge, absoluteNewPos] = translate[istack]; - if (purge) continue; + const translation = translationTable[istack]; + if (translation.purge) continue; - this.stack[absoluteNewPos] = this.stack[istack]; - lastPosUsed = absoluteNewPos; + this.stack[translation.newAbsPos] = this.stack[istack]; + lastPosUsed = translation.newAbsPos; } if (lastPosUsed !== false) { this.stack.splice(lastPosUsed + 1); @@ -1002,18 +1126,17 @@ class Expression extends ExpressionItem { const operationInfo = (stackValue && typeof stackValue.dump === 'function') ? stackValue.dump() : stackValue; let info = (Expression.dumpScope ?? '') + `\x1B[38;5;214m#${index === false?'':index} ${stackValue}`; for (const operand of stackPos[operandsProperty]) { - const operandInfo = this.dumpOperand(operand, index); + const operandInfo = this.dumpOperand(operand, index, options); info = info + ' [\x1B[38;5;76m' + operandInfo +'\x1B[38;5;214m]'; } console.log(info+'\x1B[0m'); } - dumpOperand(op, pos) { + dumpOperand(op, pos, options = {}) { const cType = '\x1B[38;5;76m'; const cProp = '\x1B[38;5;250m'; const cValue = '\x1B[38;5;40m'; - const options = {cType, cProp, cValue, pos}; if (op instanceof ExpressionItem) { - return op.dumpItem(options); + return op.dumpItem({...options, cType, cProp, cValue, pos}); } if (op === null) return 'null'; EXIT_HERE; @@ -1070,7 +1193,7 @@ class Expression extends ExpressionItem { return this.stack.length === 0; } asBool() { - let value = this.eval(); + let value = this.evalAsValue(); // check if empty expression if (this.isEmpty()) { return false; @@ -1090,7 +1213,7 @@ class Expression extends ExpressionItem { return new ExpressionItems.IntValue(this.asInt()); } asInt() { - let value = this.eval(); + let value = this.evalAsValue(); // check if empty expression if (this.isEmpty()) { return 0n; @@ -1108,11 +1231,11 @@ class Expression extends ExpressionItem { return this._asDefault(this.asIntItem, defaultValue); } asString() { - const value = this.eval(); + const value = this.evalAsValue(); if (this.isEmpty()) { return ''; } - assert((value instanceof Expression) === false); + assertLog((value instanceof Expression) === false, value); if (typeof value.asString === 'function') { return value.asString(); } diff --git a/src/expression_factory.js b/src/expression_factory.js index ef39df9..33fec26 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -86,6 +86,7 @@ module.exports = class ExpressionFactory { let res; if (obj.template) { res = new StringTemplate(obj.value); + console.log('TEMPLATE #####) '+obj.value); delete obj.template; } else { diff --git a/src/expression_items/array_of.js b/src/expression_items/array_of.js index 2007409..12f7e0f 100644 --- a/src/expression_items/array_of.js +++ b/src/expression_items/array_of.js @@ -12,6 +12,9 @@ module.exports = class ArrayOf extends RuntimeItem { this._array = array.clone(); console.log(array.constructor.name, array, this._array); } + toString(options) { + return super.toString(options)+'['+this._array.lengths.join('],[')+']'; + } get array() { return this._array; } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 58d2800..fdb9003 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -177,6 +177,9 @@ class ExpressionItem { results.next = this.evalNext(options); return results.final ? results.final : results.inside; } + evalAsItem(options) { + return this.clone(); + } } module.exports = ExpressionItem; \ No newline at end of file diff --git a/src/expression_items/expression_list.js b/src/expression_items/expression_list.js index a546cc5..a3e340b 100644 --- a/src/expression_items/expression_list.js +++ b/src/expression_items/expression_list.js @@ -1,6 +1,7 @@ const Exceptions = require('../exceptions.js'); const {assert, assertLog} = require('../assert.js'); const ExpressionItem = require('./expression_item.js'); +const MultiArray = require('../multi_array.js'); class ExpressionList extends ExpressionItem { constructor(items, debug = {}) { @@ -11,8 +12,12 @@ class ExpressionList extends ExpressionItem { for (const item of items) { this.items.push(item.clone()); } + this.array = new MultiArray([this.items.length]); this._ns_ = 'ExpressionItem'; } + dump() { + return '[' + this.items.map(x => x.toString()).join(',')+']'; + } cloneInstance() { return new ExpressionList(this.items, this.debug); } @@ -22,7 +27,18 @@ class ExpressionList extends ExpressionItem { this.indexes = [this.items.length]; } evalInside(options = {}) { - return this.items.map(x => x.eval(options)); + return new ExpressionList(this.items.map(x => x.eval(options))); + } + getItem(indexes) { + const index = indexes[0]; + if (index < 0 && index >= this.items.length) { + throw new Error(`Out of bounds, try to access index ${index} but list only has ${this.items.length} elements`); + } + const item = this.items[index]; + if (indexes.length === 1) { + return item; + } + return item.getItem(indexes.slice(1)); } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 8ca6e03..902ab7a 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -37,7 +37,7 @@ module.exports = class FunctionCall extends RuntimeItem { if (Context.sourceTag === 'basic_functions.pil:12') debugger; const definition = Context.references.get(this.name, options); const res = Context.processor.executeFunctionCall(this.name, this); - console.log(res); + console.log(this.name, res); return res; } } diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index 7549d2e..3fd8404 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -35,6 +35,12 @@ class IntValue extends ValueItem { asInt() { return this.value; } + asIntItem() { + return this.clone(); + } + asIntDefault(defaultValue) { + return this.value; + } asNumber() { return Number(this.value); } diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 195099d..5aa5915 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -1,5 +1,6 @@ const ExpressionItem = require("./expression_item.js"); module.exports = class ProofItem extends ExpressionItem { + static createWithId = true; constructor (id) { super(); this.id = id; @@ -29,7 +30,6 @@ module.exports = class ProofItem extends ExpressionItem { return false; } cloneUpdate(source) { - console.log(['PROOFITEM.CLONEUPDATE', source.rowOffset]); super.cloneUpdate(source); if (source.rowOffset) { this.rowOffset = source.rowOffset.clone(); diff --git a/src/expression_items/stack_item.js b/src/expression_items/stack_item.js index d30a556..e2abf29 100644 --- a/src/expression_items/stack_item.js +++ b/src/expression_items/stack_item.js @@ -18,7 +18,10 @@ module.exports = class StackItem extends ExpressionItem { cloneInstance() { return new StackItem(this.offset); } - dump(options) { + dump(options = {}) { + if (typeof options.pos == 'number') { + return `StackItem(#${options.pos- this.offset}/${this.offset})` + } return `StackItem(${this.offset})`; } eval(options = {}) { diff --git a/src/expression_items/string_template.js b/src/expression_items/string_template.js index e065c0b..34bbf6d 100644 --- a/src/expression_items/string_template.js +++ b/src/expression_items/string_template.js @@ -4,14 +4,21 @@ const StringValue = require("./string_value.js"); const Context = require('../context.js'); class StringTemplate extends StringValue { + constructor (value = '') { + assertLog(typeof value === 'string', value); + super(value); + } evalTemplate(options) { - console.log('BEFORE TEMPLATE'); - const res = new StringValue(Context.processor.evaluateTemplate(this.value)); - console.log('AFTER TEMPLATE'); - return res; + return new StringValue(Context.processor.evaluateTemplate(this.value)); + } + cloneInstance() { + return new StringTemplate(this.value); + } + dump(options) { + return '`'+this.value+'`'; } toString(options) { - return '"'+this.evalTemplate(options)+'"'; + return this.evalTemplate(options); } getValue() { return this.evalTemplate(); @@ -22,7 +29,7 @@ class StringTemplate extends StringValue { asStringItem() { return this.evalTemplate(); } - eval(options = {}) { + evalInside(options = {}) { return this.evalTemplate(options); } } diff --git a/src/expression_items/string_value.js b/src/expression_items/string_value.js index 3e23423..291c280 100644 --- a/src/expression_items/string_value.js +++ b/src/expression_items/string_value.js @@ -10,6 +10,9 @@ class StringValue extends RuntimeItem { return true; } toString(options) { + return this.value; + } + dump(options) { return '"'+this.value+'"'; } getValue() { diff --git a/src/expressions.js b/src/expressions.js index bcd0727..d0468c6 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -288,13 +288,17 @@ module.exports = class Expressions { return Context.references.getTypeInfo(names, e.__indexes, options); } e2num(e, s, title = '') { + DEPRECATED; return this.e2types(e, s, title, ['number','bigint']); } e2number(e, s, title = '') { + DEPRECATED; let res = this.e2types(e, s, title, ['number','bigint'], false); return Number(res); } e2types(e, s, title, types, toBigInt = true) { + DEPRECATED; + // TODO: review specify PRE/POST on expression conversion ==> refactorize !!! let res = e; if (res instanceof Expression) { @@ -324,9 +328,11 @@ module.exports = class Expressions { return this.getValueTypes(e, s, title, ['number','bigint','string']); } e2value(e, s, title = '') { + DEPRECATED; return this.e2types(e, s, title, ['number','bigint','string']); } e2bool(e, s, title = '') { + DEPRECATED; let res = this.e2types(e, s, title, ['number','bigint','string']); if (typeof res === 'string') { return res !== ''; diff --git a/src/function.js b/src/function.js index 24bd616..a410804 100644 --- a/src/function.js +++ b/src/function.js @@ -45,8 +45,9 @@ module.exports = class Function { evalArguments(args) { let eargs = []; for (const arg of args) { - eargs.push(arg.eval()); + eargs.push(arg.evalAsItem()); } + console.log('ARGUMENTS '+eargs.map(x => x.toString()).join(',')); return eargs; } // mapArgument was called before enter on function visibility scope because @@ -200,15 +201,15 @@ module.exports = class Function { console.log(value); // REVIEW: use arg.type, but perphaps we need to do a casting if (name === 'cols') { -// debugger; + debugger; } let lengths = []; if (value.array) { lengths = value.array.lengths; } else if (Array.isArray(value)) { - lengths = [value.lenght]; + lengths = [value.length]; } - + console.log('KKK2KKK', name, lengths, value.constructor.name, value.toString()); Context.references.declare(name, arg.type, lengths, {}, value); // TODO: arrays. diff --git a/src/indexable.js b/src/indexable.js index b895dcc..20c6d2e 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -93,7 +93,10 @@ module.exports = class Indexable { return res.value.clone(); } if (typeof res.value === 'undefined') { - return new this.expressionItemClass(); + if (this.expressionItemClass.createWithId) { + return new this.expressionItemClass(id); + } + return new this.expressionItemClass(); } assertLog(typeof this.expressionItemClass.createFrom === 'function', [this.type, this.constructor.name, this.expressionItemClass, res, res.value]); return this.expressionItemClass.createFrom(res.value); @@ -123,8 +126,8 @@ module.exports = class Indexable { const item = this.get(id); console.log(item); console.log(value.constructor.name); - if (value && typeof value.toString === 'function') console.log(value.toString()); - else console.log(value); + // if (value && typeof value.toString === 'function') console.log(value.toString()); + // else console.log(value); assertLog(item && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); item.setValue(value); /* diff --git a/src/multi_array.js b/src/multi_array.js index b9d09ba..6f6b19b 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -5,6 +5,8 @@ class MultiArray { constructor (lengths, options = {}) { // baseOffset is accumulated offset, means parentOffset + new offset. this.baseOffset = options.baseOffset ?? 0; + assertLog(Array.isArray(lengths), lengths); + assertLog(lengths.every(x => typeof x === 'number'), lengths); this.initOffsets(lengths); // if parentInitizalized means need to extract diff --git a/src/processor.js b/src/processor.js index aef8116..f99c2f4 100644 --- a/src/processor.js +++ b/src/processor.js @@ -42,6 +42,7 @@ module.exports = class Processor { this.compiler = parent; this.trace = true; this.Fr = Fr; + this.prime = Fr.p; this.references = new References(); this.scope = new Scope(); this.runtime = new Runtime(); @@ -158,6 +159,7 @@ module.exports = class Processor { // TODO: use a constant this.references.declare('N', 'int', [], { global: true, sourceRef: this.sourceRef }); this.references.declare('BITS', 'int', [], { global: true, sourceRef: this.sourceRef }); + this.references.declare('PRIME', 'int', [], { global: true, sourceRef: this.sourceRef }); this.references.declare('__SUBPROOF__', 'string', [], { global: true, sourceRef: this.sourceRef }); this.scope.pushInstanceType('proof'); this.sourceRef = '(execution)'; @@ -304,8 +306,8 @@ module.exports = class Processor { this.scope.pop(); --this.functionDeep; this.callstack.pop(); - console.log(`END CALL ${name}`) - return res; + console.log(`END CALL ${name}`, res); + return typeof res === 'undefined' ? new ExpressionItems.IntValue() : res; } this.error({}, `Undefined function ${name}`); } @@ -322,7 +324,6 @@ module.exports = class Processor { // TODO: move to assign class const indexes = this.decodeIndexes(st.name.indexes) const names = this.context.getNames(st.name.name); - console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> EXEC-ASSIGN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'); // if (st.value.type === 'sequence') { if (st.value instanceof ExpressionItems.ExpressionList) { const sequence = new Sequence(this, st.value, ExpressionItems.IntValue.castTo(this.references.get('N'))); @@ -344,6 +345,7 @@ module.exports = class Processor { } console.log(st.value); this.assign.assign(names, indexes, st.value); + console.log(`ASSIGN ${st.name.name} = ${st.value.toString()} \x1B[0;90m[${Context.sourceTag}]\x1B[0m`); // this.references.set(st.name.name, [], this.expressions.eval(st.value)); } execHint(s) { @@ -386,8 +388,9 @@ module.exports = class Processor { if (cond.type === 'else' && icond !== (s.conditions.length-1)) { throw new Error('else only could be on last position'); } + console.log(cond); - if (typeof cond.expression !== 'undefined' && this.expressions.e2bool(cond.expression) !== true) { + if (typeof cond.expression !== 'undefined' && cond.expression.evalAsBool() !== true) { continue; } this.scope.push(); @@ -432,16 +435,22 @@ module.exports = class Processor { return result; } execFor(s) { + console.log('EXEC-FOR'); let result; this.scope.push(); this.execute(s.init, `FOR ${this.sourceRef} INIT`); let index = 0; - while (this.expressions.e2bool(s.condition)) { + // while (this.expressions.e2bool(s.condition)) { + while (true) { + const loopCond = s.condition.eval().asBool(); + console.log('FOR.CONDITION', loopCond, s.condition.toString(), s.condition); + if (!loopCond) break; // if only one statement, scope will not create. // if more than one statement, means a scope_definition => scope creation result = this.execute(s.statements, `FOR ${this.sourceRef} I:${index}`); ++index; if (result instanceof BreakCmd) break; + console.log('INCREMENT', s.increment); this.execute(s.increment); } this.scope.pop(); @@ -595,7 +604,7 @@ module.exports = class Processor { assert(e.type === 'expression_list'); let values = []; for (const value of e.values) { - values.push(this.e2value(value)); + values.push(value.evalAsInt()); } return values; } @@ -649,13 +658,16 @@ module.exports = class Processor { executeSubproof(subproofName, subproof) { this.currentSubproof = subproof; this.scope.pushInstanceType('subproof'); + this.context.subproofName = subproofName; for (const airRows of subproof.rows) { this.rows = airRows; console.log(`BEGIN AIR ${subproofName} (${airRows}) #${this.airId}`); + // TODO: context is global? const air = new Air(this.Fr, this.context, airRows); const airName = subproofName + (subproof.rows.length > 1 ? `_${air.bits}`:''); + Context.airName = airName; subproof.airs.define(airName, air); // TO-DO loop with different rows @@ -664,6 +676,7 @@ module.exports = class Processor { // create built-in constants this.references.set('N', [], air.rows); this.references.set('BITS', [], air.bits); + this.references.set('PRIME', [], this.prime); this.references.set('__SUBPROOF__', [], subproofName); /* this.references.set('N', [], new ExpressionItems.IntValue(air.rows)); @@ -693,11 +706,14 @@ module.exports = class Processor { this.scope.popInstanceType(['witness', 'fixed', 'im']); this.context.pop(); console.log(`END AIR ${subproofName} (${airRows}) #${this.airId}`); + Context.airName = false; ++this.airId; } this.finalSubproofScope(); this.scope.popInstanceType(); this.currentSubproof = false; + Context.subproofName = false; + this.references.clearScope('subproof'); ++this.subproofId; } finalAirScope() { @@ -706,6 +722,7 @@ module.exports = class Processor { clearAirScope(label = '') { this.references.clearType('fixed', label); this.references.clearType('witness', label); + this.references.clearScope('air'); this.expressions.clear(label); } finalSubproofScope() { @@ -715,10 +732,12 @@ module.exports = class Processor { this.callDelayedFunctions('proof', 'final'); } callDelayedFunctions(scope, event) { + console.log(this.delayedCalls); if (typeof this.delayedCalls[scope] === 'undefined' || typeof this.delayedCalls[scope][event] === 'undefined') { return false; } for (const fname in this.delayedCalls[scope][event]) { + console.log(`CALL DELAYED(${scope},${event}) FUNCTION ${fname}`); this.execCall({ op: 'call', function: {name: fname}, args: [] }); } } @@ -815,8 +834,8 @@ module.exports = class Processor { this.delayedCalls[scope][event][fname].sourceRefs.push(this.context.sourceRef); } execExpr(s) { - console.log(s.expr); - this.expressions.eval(s.expr); + s.expr.eval(); + // this.expressions.eval(s.expr); } decodeNameAndLengths(s) { return [s.name, this.decodeLengths(s)]; @@ -825,7 +844,7 @@ module.exports = class Processor { let values = []; if (indexes) { for (const index of indexes) { - values.push(this.expressions.e2number(index)); + values.push(Number(index.evalAsInt())); } } return values; @@ -888,20 +907,21 @@ module.exports = class Processor { } else { throw new Error(`Constraint definition on invalid scope (${scopeType}) ${this.context.sourceRef}`); } - console.log(`\x1B[1;36;44m${prefix}CONSTRAINT > ${expr.toString({hideClass:true, hideLabel:false})} === 0 (${this.sourceRef})\x1B[0m`); - console.log(`\x1B[1;36;44m${prefix}CONSTRAINT (RAW)> ${expr.toString({hideClass:true, hideLabel:true})} === 0 (${this.sourceRef})\x1B[0m`); + console.log(`\x1B[1;36;44m${prefix}CONSTRAINT [${Context.proofLevel}] > ${expr.toString({hideClass:true, hideLabel:false})} === 0 (${this.sourceRef})\x1B[0m`); + console.log(`\x1B[1;36;44m${prefix}CONSTRAINT [${Context.proofLevel}] (RAW) > ${expr.toString({hideClass:true, hideLabel:true})} === 0 (${this.sourceRef})\x1B[0m`); } execVariableIncrement(s) { // REVIEW used only inside loop (increment) in other cases was an expression const name = s.name; const value = this.references.get(name, []); // REVIEW: could be an expression (if expression x+1+1 = x+2) - console.log(s.pre, s.post, value.getValue()); - this.references.set(name, [], value.getValue() + s.pre + s.post); + const intValue = value.getValue(); + console.log(`INCREMENT ${s.name} = ${intValue} + ${s.pre + s.post} = ${intValue + s.pre + s.post}`); + // console.log(s.pre, s.post, value.getValue()); + this.references.set(name, [], intValue + s.pre + s.post); } execVariableDeclaration(s) { - console.log('VARIABLE DECLARATION '+this.context.sourceRef+' init:'+s.init); - console.log(s); + console.log('VARIABLE DECLARATION '+Context.sourceRef+' init:'+s.init); const init = typeof s.init !== 'undefined'; // console.log(s); const count = s.items.length; @@ -917,42 +937,26 @@ module.exports = class Processor { const scope = s.scope ?? false; let initValue = null; if (init) { - console.log([name, s.vtype, Context.sourceRef]); + console.log(name, s.vtype, Context.sourceRef); switch (s.vtype) { case 'expr': - // s.init[index].expr.dump('INIT1 '+name); - console.log(s.init[index]); - // initValue = s.init[index].eval(); - console.log('CALL #2.1'); initValue = s.init[index].eval(); - console.log('CALL #2.1E'); - console.log(initValue); - console.log('CALL #2.1F'); - // initValue.dump('INIT2 '+name); break; case 'int': - console.log(s); - console.log('CALL #2.2'); - console.log(s.init[index]); - const _v = s.init[index].eval(); - console.log(_v); - console.log('CALL #2.2E'); - initValue = new ExpressionItems.IntValue(_v); - console.log('CALL #2.2F'); + initValue = s.init[index].eval().asIntItem(); break; case 'string': - console.log('CALL #2.3'); initValue = new ExpressionItems.StringValue(this.expressions.e2value(s.init[index])); - console.log('CALL #2.3E'); break; } + console.log(name, s.vtype, initValue.toString ? initValue.toString() : initValue); } - console.log('CALL #_3'); - console.log(initValue); - console.log('CALL #3'); this.references.declare(name, s.vtype, lengths, { scope, sourceRef, const: s.const ?? false }, initValue); - console.log('CALL #3E'); - // if (initValue !== null) this.references.set(name, [], initValue); + if (initValue !== null) { + const initValueText = typeof initValue.toString === 'function' ? initValue.toString() : initValue; + console.log(`ASSIGN(DECL) ${name} = ${initValueText} \x1B[0;90m[${Context.sourceTag}]\x1B[0m`); + // this.references.set(name, [], initValue); + } } } execConstantDefinition(s) { @@ -1034,6 +1038,6 @@ module.exports = class Processor { return new ReturnCmd(res); } e2value(e, s, title) { - return this.expressions.e2value(e, s, title); + return e.evalAsValue(); } } diff --git a/src/reference.js b/src/reference.js index da2d1b9..1333220 100644 --- a/src/reference.js +++ b/src/reference.js @@ -1,6 +1,7 @@ const {assert, assertLog} = require('./assert.js'); const MultiArray = require("./multi_array.js"); const ArrayOf = require('./expression_items/array_of.js'); +const Context = require('./context.js'); /** * @property {MultiArray} array @@ -63,7 +64,11 @@ class Reference { let _indexes = [...indexes]; _indexes.push(index); if (level + 1 === this.array.dim) { - this.setOneItem(value.getItem(_indexes), _indexes, options); + if (Array.isArray(value)) { + this.setOneItem(value[_indexes[level]], _indexes, options); + } else { + this.setOneItem(value.getItem(_indexes), _indexes, options); + } continue; } this.setArrayLevel(level+1, _indexes, value, options); @@ -80,7 +85,7 @@ class Reference { const id = this.getId(indexes); if (this.const) { // TODO: more info - throw new Error('setting a const element'); + throw new Error(`setting ${this.name} a const element on ${Context.sourceRef}`); } this.instance.set(id, value); } @@ -127,6 +132,7 @@ class Reference { res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator)); } } else if (evaluatedIndexes.length > 0) { + console.log(this); throw new Error('try to access to index on non-array value'); } if (res === false) { diff --git a/src/references.js b/src/references.js index 39fd27a..b6baa82 100644 --- a/src/references.js +++ b/src/references.js @@ -78,6 +78,9 @@ module.exports = class References { delete this.references[name]; } } + clearScope(proofScope) { + this.containers.clearScope(proofScope); + } isReferencedType(type) { return type.at(0) === '&' } @@ -165,7 +168,7 @@ module.exports = class References { assert(!name.includes('.object')); const nameInfo = this.decodeName(name); - console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} []${lengths.length} scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}[type: ${initValue instanceof Object ? initValue.constructor.name : typeof initValue}]`, options); + console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} ${lengths.length ? '[' + lengths.join(',') + '] ': ''}scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}[type: ${initValue instanceof Object ? initValue.constructor.name : typeof initValue}]`, options); let [array, size] = Reference.getArrayAndSize(lengths); @@ -408,7 +411,8 @@ module.exports = class References { return reference; } isVisible(def) { - return !def.scopeId || def.type === 'constant' || def.type === 'function' || + console.log('ISVISIBLE', (def.constructor ?? {name: '_'}).name, def); + return !def.scopeId || !this.hasScope(def.type) || ['constant', 'function', 'witness', 'fixed'].includes(def.type) || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } /** diff --git a/src/subproof.js b/src/subproof.js index 0adf5ff..9ec86ea 100644 --- a/src/subproof.js +++ b/src/subproof.js @@ -28,6 +28,7 @@ module.exports = class Subproof { if (!this.insideFirstAir) { const spvNonDeclared = Object.keys(this.spvDeclaredInsideThisAir).filter(name => this.spvDeclaredInsideThisAir[name] === false); if (spvNonDeclared.length > 0) { + console.log(spvNonDeclared); throw new Error(``); } } diff --git a/test/pil2/features/compressed.pil b/test/pil2/features/compressed.pil new file mode 100644 index 0000000..830a3ee --- /dev/null +++ b/test/pil2/features/compressed.pil @@ -0,0 +1,96 @@ +subproof Compress(2**23) { + col witness a,b,c,d; + challenge stage(2) alpha; + // challenge stage(2) beta; + + expr e = a; + println("e=",e); + for (int i = 0; i < 3; i = i + 1) { + e = e * alpha + b; + println("e=",e); + } + e = e * 24 + c; + println("e=",e); + e = 0; + + expr cols[10]; + cols[0] = a; + cols[1] = b; + cols[2] = c; + // println(cols[0], cols[1], cols[2]); + + // FAIL e = (e + cols[0])*alpha; + // expr k = (e + cols[0])*alpha; + // println("e,k=",k); + + for (int icol = 0; icol < 3; icol = icol + 1) { + // FAIL e = (e + cols[icol])*alpha; + e = (e + cols[icol])*alpha; + // OK e = (e + alpha)*cols[icol]; + println("e=",e); + } + +/* + int opid = 73; + expr cols_compressed = 0; + println("cols", cols); + println("length(cols)", length(cols)); + println("cols[0]", cols[0]); + for (int icol = 0; icol < length(cols); icol = icol + 1) { + println("cols_compressed", cols_compressed, "icol", icol, "cols[icol]", cols[icol]); + expr pcols_compressed = cols_compressed; + cols_compressed = (pcols_compressed + cols[icol]) * 18; + println("cols_compressed (out)", cols_compressed); + } + + println("KKKKKK cols_compressed", cols_compressed); + // the opid is added to avoid soundness issues between different PIOP checks + cols_compressed = (cols_compressed + opid) + beta; + cols_compressed === 20; + + cols_compressed = 0; +// println("cols_compressed", cols_compressed, "icol", icol, "cols[icol]", cols[icol]); + cols_compressed = (cols_compressed + cols[0]) * 18; + //println("cols_compressed (out)", cols_compressed); + + //icol = icol + 1; + // println("cols_compressed", cols_compressed, "icol", icol, "cols[icol]", cols[icol]); + cols_compressed = (cols_compressed + cols[1]) * 18; + // println("cols_compressed (out)", cols_compressed); + + // icol = icol + 1; + // println("cols_compressed", cols_compressed, "icol", icol, "cols[icol]", cols[icol]); + cols_compressed = (cols_compressed + cols[2]) * 18; + // println("cols_compressed (out)", cols_compressed); + + cols_compressed = (cols_compressed + opid) + beta; + // println("cols_compressed (out)", cols_compressed); + + cols_compressed === 30; +*/ +/* + + function compress_cols(int opid, expr cols[]): expr { + expr cols_compressed = 0; + println("cols", cols); + println("length(cols)", length(cols)); + println("cols[0]", cols[0]); +// for (int icol = length(cols) - 1; icol >= 0; icol = icol - 1) { + for (int icol = 0; icol < length(cols); icol = icol + 1) { + println("cols_compressed", cols_compressed, "icol", icol, "cols[icol]", cols[icol]); + cols_compressed = (cols_compressed + cols[icol]) * 18; + println("cols_compressed (out)", cols_compressed); + // cols_compressed = cols_compressed + cols[icol]; + } + + println("KKKKKK cols_compressed", cols_compressed); + // the opid is added to avoid soundness issues between different PIOP checks + cols_compressed = (cols_compressed + opid) + beta; + cols_compressed === 17; + return cols_compressed; + } + + expr result = compress_cols(13, [a, b, c]); + println("result=", result); +*/ +} \ No newline at end of file diff --git a/test/pil2/std2/std_mset_lookup_range.pil b/test/pil2/std2/std_mset_lookup_range.pil new file mode 100644 index 0000000..9b87f0b --- /dev/null +++ b/test/pil2/std2/std_mset_lookup_range.pil @@ -0,0 +1,307 @@ +private function init_challenges() { + if (!defined(std_alpha)) { + challenge stage(2) std_alpha; + } + if (!defined(std_beta)) { + challenge stage(2) std_beta; + } +} +/* +function multiset_assumes(int opid, expr cols[]) { + piop_update(0, 0, opid, 1, cols); +} + +function multiset_proves(int opid, expr cols[]) { + piop_update(1, 0, opid, 1, cols); +} +*/ +function multiset_assumes(int opid, expr sel, expr cols[]) { + piop_update(0, 0, opid, sel, cols); +} + +function multiset_proves(int opid, expr sel, expr cols[]) { + piop_update(1, 0, opid, sel, cols); +} + +/* +function lookup_assumes(int opid, expr cols[]) { + piop_update(0, 1, opid, 1, cols); +} + +function lookup_proves(int opid, expr cols[]) { + piop_update(1, 1, opid, 1, cols); +} +*/ + +// Right now, we assumes that the user proves the multiplicity counter. +// However, we could let the user to only give us the selector and the columns, and we compute the multiplicity counter. +function lookup_assumes(int opid, expr mul_count, expr cols[]) { + piop_update(0, 1, opid, mul_count, cols); +} + +function lookup_proves(int opid, expr mul_count, expr cols[]) { + piop_update(1, 1, opid, mul_count, cols); +} + +/* +// To support vector range checks, we would need to compute a table of all permutations of the range [min,max-1]. +function range_check(int opid, expr cols[], int min, int max) { + for (int i = 0; i < length(cols); i = i + 1) { + piop_update(0, 1, opid, 1, cols[i]); + } + + col fixed RANGE = [min,min+1..+..max-1]; // QUESTION: Does this still work if max - min > N? + // col witness mul_count = compute_multiplicities(cols, RANGE); + piop_update(1, 1, opid, mul_count, RANGE); +} +*/ + +function range_check(int opid, expr sels[], expr cols[], int min, int max) { + for (int i = 0; i < length(cols); i = i + 1) { + piop_update(0, 1, opid, sels[i], cols[i]); + } + + col fixed RANGE = [min,min+1..+..max-1]; + // col witness mul_count = compute_multiplicities(cols, RANGE); + piop_update(1, 1, opid, mul_count, RANGE); +} + +// QUESTION: Can the following O(n³) algorithm be implemented faster? +/** + * Given columns C₀,...,Cₙ₋₁, and a range, computes the multiplicity counter: + · mul_count[i] = Σⱼ |{k : Cⱼ[k] = range[i]}| + * @param cols + * @param range + */ +private function compute_multiplicities(expr cols[], expr range) { + expr mul_count[length(range)] = 0; // [0,0,...,0] + for (int i = 0; i < length(range); i = i + 1) { + for (int j = 0; j < length(cols); j = j + 1) { + for (int k = 0; k < length(cols[j]); k = k + 1) { + if (cols[j][k] == range[i]) { + mul_count[i] = mul_count[i] + 1; + } + } + } + } + // Note: We do not need to normalize the result, since a range has no repeated elements. + return mul_count; +} + +/** + * Verifies the number of columns of same PIOP check (assumes, proves) is the same. + * @param opid (unique) identifier of the PIOP check + * @param cols_count number of columns of the PIOP check + * @param proves 1 if proves, 0 if assumes + */ +private function check_opid_and_cols(int proves, int type, int opid, int cols_count) { + + if (cols_count < 1) { + error(`The number of columns of PIOP #${opid} must be at least 1`); + } + + container proof.std.piop alias piop { + // FIX: dynamic arrays not ready + int opids_count = 0; + int opids[100]; + expr gsum = 0; // Resulting sum of every subproof and every air. + // Declared as expression (unknown at runtime), but used as field element. + } + + container subproof.std.piop { + subproofval aggregate(sum) gsum_result; + } + + container air.std.piop { + // FIX: dynamic arrays not ready + int gsum_assumes_count = 0; + expr gsum_assumes_sel[100]; + expr gsum_assumes[100]; + + int gsum_proves_count = 0; + expr gsum_proves_type[100]; + expr gsum_proves_sel[100]; + expr gsum_proves[100]; + } + + container proof.std.piop.`id${opid}` alias piopid { + int cols; + int proves = 0; + int assumes = 0; + } + + if (piopid.cols == 0) { + // first time called + piopid.cols = cols_count; + // add opid on a list to verify at final + piop.opids[piop.opids_count] = opid; + piop.opids_count = piop.opids_count + 1; + } else if (piopid.cols != cols_count) { + error(`The number of columns of PIOP #${opid} must be ${piopid.cols}`); + } + + if (proves) { + piopid.proves = piopid.proves + 1; + } else { + piopid.assumes = piopid.assumes + 1; + } +} + +/** + * Given columns C₁,...,Cₙ, reduces the vector PIOP to a single column PIOP. + * @param opid (unique) identifier of the PIOP + * @param cols columns of the PIOP + * @return [opid + C₁·α + C₂·α² + ... + Cₙ·αⁿ] + β + */ +private function compress_cols(int opid, expr cols[]): expr { + expr cols_compressed = 0; + for (int icol = length(cols) - 1; icol >= 0; icol = icol - 1) { + cols_compressed = (cols_compressed + cols[icol]) * std_alpha; + } + + // the opid is added to avoid soundness issues between different PIOP checks + cols_compressed = (cols_compressed + opid) + std_beta; + return cols_compressed; +} + +/** + * Given columns C₀,...,Cₙ₋₁, and multiplicity counter M, it 1] defines the constraints at the air level, 2] updates the values at the subproof level, and 3] updates the constraints at the proof level. + * @param proves boolean indicating if updating a proves or a assumes + * @param type if 1, it is a lookup or a range check; if 0, it is a multiset + * @param opid (unique) identifier of the PIOP + * @param sel selector of the PIOP + * @param cols columns of the PIOP + */ +private function piop_update(int proves, int type, int opid, expr sel, expr cols[]) { + // verify if correct opid and cols + check_opid_and_cols(proves, type, opid, length(cols)); + + init_challenges(); + + // selected vector to simple column reduction + expr cols_compressed = compress_cols(opid, cols); + + use air.std.piop; + if (proves) { + // adding all sums of proves called in this air + gsum_proves_type[gsum_proves_count] = type; + gsum_proves_sel[gsum_proves_count] = sel; + gsum_proves[gsum_proves_count] = cols_compressed; + gsum_proves_count = gsum_proves_count + 1; + } else { + // adding all sums of assumes called in this air + gsum_assumes_sel[gsum_assumes_count] = sel; + gsum_assumes[gsum_assumes_count] = cols_compressed; + gsum_assumes_count = gsum_assumes_count + 1; + } + + // QUESTION: Should the user proves the multiplicity counter? Or we should compute it? + // 0] computes the multiplicity counter for lookups and range checks + // on final air compute_multiplicities_lookup_range(); + + // 1] look for repeated proves/assumes's in both lookups and range checks and, if found, optimize + // on final air lookup_range_proves_batch(); + + // 2] define constraints at the air level + on final air PIOP_air(); + + // 3] update values at the subproof level + on final subproof PIOP_subproof(); + + // 4] update constraints at the proof level + on final proof PIOP_proof(); +} +/* +// QUESTION: Can the following O(n²) algorithm be implemented faster? +// Given the proves, it "merges" the repeated ones through their associated multiplicity counters. +private function lookup_range_proves_batch() { + use air.std.piop; + + // int len = length(gsum_proves); + int len = gsum_proves_count; + + for (int i = 0; i < len; i = i + 1) { + for (int j = 0; j < len; j = j + 1) { + if (i == j) continue; + // It two proves are the same, add their multiplicity counters to one and remove the other + if (gsum_proves[j] == gsum_proves[i] && gsum_proves_type[j] == 1) { + gsum_proves_sel[i] = gsum_proves_sel[i] + gsum_proves_sel[j]; + + gsum_proves[j] = gsum_proves[len-1]; + gsum_proves_sel[j] = gsum_proves_sel[len-1]; + gsum_proves.pop(); // QUESTION: Will array pop be implemented? + gsum_proves_sel.pop(); + } + } + } +} +*/ + +private function PIOP_air() { + use air.std.piop; + + col witness stage(2) gsum; + + // mt1 mt2 mt3 mf1 mf2 mf3 + // gsum === 'gsum * (1 - L1) + ------- + ------- + ------- - ------- - ------- - ------- + // t1 t2 t3 f1 f2 f3 + + col fixed L1 = [1,0...]; + + expr LHS = 1; + expr RHS1 = 0; + // for (int i = 0; i < length(gsum_proves); i = i + 1) { + for (int i = 0; i < gsum_proves_count; i = i + 1) { + LHS = LHS * gsum_proves[i]; + + expr tmp = gsum_proves_sel[i]; + // for (int j = 0; j < length(gsum_proves); j = j + 1) { + for (int j = 0; j < gsum_proves_count; j = j + 1) { + if (j != i) tmp = tmp * gsum_proves[j]; + } + RHS1 = RHS1 + tmp; + } + + expr RHS2a = LHS; + expr RHS2b = 0; + // for (int i = 0; i < length(gsum_assumes); i = i + 1) { + for (int i = 0; i < gsum_assumes_count; i = i + 1) { + LHS = LHS * gsum_assumes[i]; + RHS1 = RHS1 * gsum_assumes[i]; + + expr tmp = gsum_assumes_sel[i]; + // for (int j = 0; j < length(gsum_assumes); j = j + 1) { + for (int j = 0; j < gsum_assumes_count; j = j + 1) { + if (j != i) tmp = tmp * gsum_assumes[j]; + } + RHS2b = RHS2b + tmp; + } + + expr RHS2 = RHS2a * RHS2b; + expr RHS = RHS1 - RHS2; + + (gsum - 'gsum * (1 - L1)) * LHS === RHS; + L1' * (gsum - subproof.std.piop.gsum_result) === 0; +} + +private function PIOP_subproof() { + proof.std.piop.gsum = proof.std.piop.gsum + subproof.std.piop.gsum_result; +} + +private function PIOP_proof() { + check_was_completed(); + + proof.std.piop.gsum === 0; +} + +private function check_was_completed() { + for (int opid in proof.std.piop.opids) { + use proof.std.piop.`id${opid}`; + if (assumes == 0) { + error(`PIOP #${opid} defined without assumes`); + } + if (proves == 0) { + error(`PIOP #${opid} defined without proves`); + } + } +} \ No newline at end of file diff --git a/test/pil2/vadcop-fibonacci-std/fibonacci.pil b/test/pil2/vadcop-fibonacci-std/fibonacci.pil index 94f979a..0d46e4f 100644 --- a/test/pil2/vadcop-fibonacci-std/fibonacci.pil +++ b/test/pil2/vadcop-fibonacci-std/fibonacci.pil @@ -16,7 +16,8 @@ subproof aggregate Fibonacci(2**16, 2**18) { (b' - a) * (1 - L1') === 0; L1 * (b - in1) === 0; L1 * (a - in2) === 0; - + L1' * (a - out) === 0; + // multiset_require(MODULE_ID, 1, [a*a + b*b, a' * (1 - L1'2) + out * L1'2]) multiset_require(MODULE_ID, 1, [a*a + b*b, a']) }; diff --git a/test/pil2/vadcop-fibonacci-std/module.pil b/test/pil2/vadcop-fibonacci-std/module.pil index a3c1551..420d39e 100644 --- a/test/pil2/vadcop-fibonacci-std/module.pil +++ b/test/pil2/vadcop-fibonacci-std/module.pil @@ -11,5 +11,5 @@ subproof Module(2**16) { x === q * mod + x_mod; - multiset_provide(MODULE_ID, 1, [x, q, x_mod]); + multiset_provide(MODULE_ID, 1, [x, x_mod]); } \ No newline at end of file diff --git a/test/pil2/vadcop-fibonacci-std2/fibonacci.pil b/test/pil2/vadcop-fibonacci-std2/fibonacci.pil new file mode 100644 index 0000000..b63b722 --- /dev/null +++ b/test/pil2/vadcop-fibonacci-std2/fibonacci.pil @@ -0,0 +1,24 @@ +include "../std2/std_mset_lookup_range.pil" +include "module.pil"; + +public mod; +public in1; +public in2; +public out; + +subproof aggregate Fibonacci(2**16, 2**18) { + + subproofval aggregate(sum) gsum_fibonacci; + + col fixed L1 = [1,0...]; + col witness a,b; + + (b' - a) * (1 - L1') === 0; + L1 * (b - in1) === 0; + L1 * (a - in2) === 0; + L1' * (a - out) === 0; + + multiset_assumes(MODULE_ID, 1, [a*a + b*b, a']) +}; + + diff --git a/test/pil2/vadcop-fibonacci-std2/module.pil b/test/pil2/vadcop-fibonacci-std2/module.pil new file mode 100644 index 0000000..0a3c378 --- /dev/null +++ b/test/pil2/vadcop-fibonacci-std2/module.pil @@ -0,0 +1,15 @@ +const int MODULE_ID = 1; + +subproof Module(2**16) { + + subproofval aggregate(sum) gsum_module; + + col fixed L1 = [1,0...]; + col witness x, q, x_mod; + + // TODO: verify range checks and x_mod < mod + x === q * mod + x_mod; + + + multiset_proves(MODULE_ID, 1, [x, x_mod]); +} \ No newline at end of file diff --git a/test/pil2/vadcop/std_sum.pil b/test/pil2/vadcop/std_sum.pil index 233333a..e4c94b6 100644 --- a/test/pil2/vadcop/std_sum.pil +++ b/test/pil2/vadcop/std_sum.pil @@ -8,18 +8,22 @@ private function init_challenges() { } function multiset_require(int opid, expr sel, expr cols[]) { + println("multiset_require =="); piop_update(0, opid, sel, cols); } function multiset_provide(int opid, expr sel, expr cols[]) { + println("multiset_provide =="); piop_update(1, opid, sel, cols); } function lookup_require(int opid, expr sel, expr cols[]) { + println("lookup_require =="); piop_update(0, opid, sel, cols); } function lookup_provide(int opid, expr sel, expr cols[]) { + println("lookup_provide =="); piop_update(1, opid, sel, cols); } @@ -31,6 +35,7 @@ function lookup_provide(int opid, expr sel, expr cols[]) { */ private function check_id_and_cols(int opid, int cols_count, int provide) { + println(cols_count); if (cols_count < 1) { error(`The number of columns of PIOP #${opid} must be at least 1`); } @@ -66,10 +71,12 @@ private function check_id_and_cols(int opid, int cols_count, int provide) { if (piopid.cols == 0) { // first time called piopid.cols = cols_count; + println("COLS:CHECK", "opid", opid, "cols_count", cols_count); // add opid on a list to verify at final piop.opids[piop.opids_count] = opid; ++piop.opids_count; } else if (piopid.cols != cols_count) { + println("COLS:CHECK", "opid", opid, "piopid.cols", piopid.cols, "cols_count", cols_count); error(`The number of columns of PIOP #${opid} must be ${piopid.cols}`); } @@ -87,14 +94,19 @@ private function check_id_and_cols(int opid, int cols_count, int provide) { * @return [opid + C₁·α + C₂·α² + ... + Cₙ·αⁿ] + β */ function compress_cols(int opid, expr cols[]): expr { - expr cols_compressed = 0; - for (int icol = length(cols) - 1; icol >= 0; --icol) { - cols_compressed = (cols_compressed + cols[icol]) * std_alpha; + expr cols_compressed_ = 0; + println("cols", cols); + println("length(cols)", length(cols)); + println("cols[0]", cols[0]); + for (int icol = length(cols) - 1; icol >= 0; icol = icol - 1) { + println("KKKKKK cols_compressed_", cols_compressed_, "icol", icol, "cols[icol]", cols[icol]); + cols_compressed_ = (cols_compressed_ + cols[icol]) * std_alpha; } + println("KKKKKK cols_compressed_", cols_compressed_); // the opid is added to avoid soundness issues between different PIOP checks - cols_compressed = (cols_compressed + opid) + std_beta; - return cols_compressed; + cols_compressed_ = (cols_compressed_ + opid) + std_beta; + return cols_compressed_; } /** @@ -106,28 +118,35 @@ function compress_cols(int opid, expr cols[]): expr { */ function piop_update(int provide, int opid, expr mul_count, expr cols[]) { // verify if correct opid and cols + println("opid", opid); + println("cols", cols); + println("length(cols)", length(cols)); check_id_and_cols(opid, length(cols), provide); init_challenges(); // selected vector to simple column reduction expr cols_compressed = compress_cols(opid, cols); - + println("PIOP_UDATE.COLS_COMPRESSED=", cols_compressed); use air.std.piop; if (provide) { // adding all sums of provide called in this air gsum_provide_mul_count[gsum_provide_count] = mul_count; gsum_provide[gsum_provide_count] = cols_compressed; - ++gsum_provide_count; + println("PIOP_UDATE.COLS_COMPRESSED(gsum_provide[gsum_provide_count)=", gsum_provide[gsum_provide_count], "gsum_provide_count", gsum_provide_count); + gsum_provide_count = gsum_provide_count + 1; + println("gsum_provide_count=", gsum_provide_count); } else { // adding all sums of require called in this air gsum_require_mul_count[gsum_require_count] = mul_count; gsum_require[gsum_require_count] = cols_compressed; - ++gsum_require_count; + println("PIOP_UDATE.COLS_COMPRESSED(gsum_require[gsum_require_count)=", gsum_require[gsum_require_count], "gsum_require_count", gsum_require_count); + gsum_require_count = gsum_require_count + 1; + println("gsum_require_count=", gsum_require_count); } // 0] look for repeated provide/require's and, if so, optimize - on final air PIOP_batch(); + // on final air PIOP_batch(); // 1] define constraints at the air level on final air PIOP_air(); @@ -184,8 +203,10 @@ private function PIOP_air() { expr LHS = 1; expr RHS1 = 0; // for (int i = 0; i < length(gsum_provide); ++i) { + println("LHS= gsum_provide_count=", gsum_provide_count); for (int i = 0; i < gsum_provide_count; ++i) { LHS = LHS * gsum_provide[i]; + println("LHS=",LHS,"i=", i, "gsum_provide[i]=", gsum_provide[i]); RHS1 = RHS1 + gsum_provide_mul_count[i]; // for (int j = 0; j < length(gsum_provide); ++j) { @@ -200,15 +221,16 @@ private function PIOP_air() { expr RHS2a = LHS; expr RHS2b = 0; // for (int i = 0; i < length(gsum_require); ++i) { - for (int i = 0; i < gsum_require_count; ++i) { + for (int i = 0; i < gsum_require_count; i = i + 1) { LHS = LHS * gsum_require[i]; RHS1 = RHS1 * gsum_require[i]; RHS2b = RHS2b + gsum_require_mul_count[i]; // for (int j = 0; j < length(gsum_require); ++j) { - for (int j = 0; j < gsum_require_count; ++j) { - if (j == i) continue; - RHS2b = RHS2b * gsum_require[j]; + for (int j = 0; j < gsum_require_count; j = j + 1) { + if (j != i) { + RHS2b = RHS2b * gsum_require[j]; + } } } @@ -247,7 +269,7 @@ private function check_was_completed() { } } */ - for (int index = 0; index < proof.std.piop.opids_count; ++index) { + for (int index = 0; index < proof.std.piop.opids_count; index = index + 1) { int opid = proof.std.piop.opids[index]; use proof.std.piop.`id${opid}`; if (require == 0) { From 3499539dbfdcb17ad8b5fe0b1ead9f185fe4e2a8 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 7 Nov 2023 23:50:25 +0100 Subject: [PATCH 23/33] WIP debugging pilout generation --- src/containers.js | 1 + src/expression.js | 109 +- src/expression_legacy.js | 1199 ----------------- ...xpression_pack.js => expression_packer.js} | 58 +- src/expressions.js | 12 +- src/processor.js | 10 +- src/proto_out.js | 6 +- src/references.js | 19 +- src/subproof.js | 17 +- test/pil2/std2/std_mset_lookup_range.pil | 12 + .../pil2/vadcop-fibonacci-proofman/module.pil | 2 +- 11 files changed, 131 insertions(+), 1314 deletions(-) delete mode 100644 src/expression_legacy.js rename src/{expression_pack.js => expression_packer.js} (66%) diff --git a/src/containers.js b/src/containers.js index 9d23145..6d6791d 100644 --- a/src/containers.js +++ b/src/containers.js @@ -75,6 +75,7 @@ module.exports = class Containers { // const nameInfo = this.decodeName(name).scope; ; this.containers[name] = {scope: this.parent.getNameScope(name), alias, references: {}}; + console.log(this.containers[name]); this.current = name; return true; } diff --git a/src/expression.js b/src/expression.js index ed42260..56a2322 100644 --- a/src/expression.js +++ b/src/expression.js @@ -15,6 +15,7 @@ const NATIVE_REFS = ['witness', 'fixed', 'public', 'challenge', 'subproofvalue', const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; const Exceptions = require('./exceptions.js'); +const ExpressionPacker = require('./expression_packer.js'); // TODO: StackPos as class @@ -1195,18 +1196,18 @@ class Expression extends ExpressionItem { } return ope.toString(options); } - packAlone(container, options) { - this.operandPack(container, this.getAloneOperand(), 0, options); - return container.pop(1)[0]; - } pack(container, options) { - if (this.isAlone()) { - return this.packAlone(container, options); - } - let top = this.stack.length-1; - return this.stackPosPack(container, top, options); + const packer = new ExpressionPacker(container, this); + this.dump('PRE-PACK'); + return packer.pack(options); } - stackPosPack(container, pos, options) { +/* packAlone(container, options) { + return this.expressionPack.packAlone(container, options); + } + pack(container, options) { + return Context.expressions.pack(container, options); + }*/ +/* stackPosPack(container, pos, options) { const st = this.stack[pos]; if (st.op === false) { this.operandPack(container, st.operands[0], pos, options); @@ -1234,63 +1235,43 @@ class Expression extends ExpressionItem { } operandPack(container, ope, pos, options) { - switch (ope.type) { - case OP_VALUE: - container.pushConstant(ope.value); - break; - - case OP_ID_REF: - this.referencePack(container, ope.refType, ope.id, ope.next, ope.stage, options); - break; - - case OP_STACK: - // TODO: expression == false; - const eid = this.stackPosPack(container, pos-ope.offset, options); - if (eid !== false) { // eid === false => alone operand - container.pushExpression(eid); - } - break; - - default: - console.log(ope); - throw new Error(`Invalid reference ${ope.type} on packed expression`); + if (ope instanceof ExpressionItems.ValueItem) { + container.pushConstant(ope.getValue()); } - - } - referencePack(container, type, id, next, stage, options) { - switch (type) { - case 'im': - container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); - break; - - case 'witness': - container.pushWitnessCol(id, next ?? 0, stage ?? 1); // TODO: stage - break; - - case 'fixed': - container.pushFixedCol(id, next ?? 0); - break; - - case 'public': - container.pushPublicValue(id); - break; - - case 'challenge': - container.pushChallenge(id, stage ?? 1); - break; - - case 'subproofvalue': - container.pushSubproofValue(id); - break; - - case 'proofvalue': - container.pushProofValue(id); - break; - - default: - throw new Error(`Invalid reference type ${type} to pack`); + else if (ope instanceof Expression) { + container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); + } + else if (ope instanceof ExpressionItems.WitnessCol) { + container.pushWitnessCol(ope.id, ope.next ?? 0, stage ?? 1); // TODO: stage + } + else if (ope instanceof ExpressionItems.FixedCol) { + container.pushFixedCol(ope.id, ope.next ?? 0); + } + else if (ope instanceof ExpressionItems.Public) { + container.pushPublicValue(ope.id); + } + else if (ope instanceof ExpressionItems.Challenge) { + container.pushChallenge(ope.id, stage ?? 1); + } + else if (ope instanceof ExpressionItems.Subproofval) { + container.pushSubproofValue(ope.id); + } + else if (ope instanceof ExpressionItems.Proofval) { + container.pushProofValue(ope.id); + } + else if (ope instanceof ExpressionItems.StackItem) { + // TODO: expression == false; + const eid = this.stackPosPack(container, pos-ope.offset, options); + if (eid !== false) { // eid === false => alone operand + container.pushExpression(eid); + } + } + else { + console.log(ope); + throw new Error(`Invalid reference ${ope.type} on packed expression`); } } +*/ resolve() { const res = this.eval(); if (res instanceof Expression) { diff --git a/src/expression_legacy.js b/src/expression_legacy.js deleted file mode 100644 index c7adbac..0000000 --- a/src/expression_legacy.js +++ /dev/null @@ -1,1199 +0,0 @@ -const util = require('util'); -const {cloneDeep} = require('lodash'); -const {assert} = require("chai"); -const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); -const PilItem = require('./pil_item.js'); - -const OP_VALUE = 0; -const OP_ID_REF = 1; -const OP_STACK = 2; -const OP_RUNTIME = 3; -const NATIVE_REFS = ['witness', 'fixed', 'public', 'challenge', 'subproofvalue', 'proofvalue', 'publictable']; -const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; -const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; - -class ExpressionStackEvaluating {}; -class InstanceArray extends Error {}; -module.exports = class Expression { - - // op (string) - // operands (array) - - // op_type --> (OP_CONST, OP_NAME_REF, OP_ID_REF, OP_STACK) - // name (string) - // indexes (array) --> be carrefull with clone - // value (bingint) - // offset (number) - - static parent; - // TODO: add all operations as if, - static operations = { - mul: { type: 'arith', label: '*', prec: 96, args: 2, handle: (a, b) => a * b, handleFr: (Fr, a, b) => Fr.mul(a, b)}, - add: { type: 'arith', label: '+', prec: 10, args: 2, handle: (a, b) => a + b, handleFr: (Fr, a, b) => Fr.add(a, b)}, - sub: { type: 'arith', label: '-', prec: 11, args: 2, handle: (a, b) => a - b, handleFr: (Fr, a, b) => Fr.sub(a, b)}, - pow: { type: 'arith', label: '**', prec: 98, args: 2, handle: (a, b) => a ** b, handleFr: (Fr, a, b) => Fr.pow(a, b)}, - neg: { type: 'arith', label: '-', prec: 102, args: 1, handle: (a) => -a, handleFr: (Fr, a) => Fr.neg(a, b)}, - div: { type: 'arith', label: '/', prec: 94, args: 2, handle: (a, b) => a / b}, - mod: { type: 'arith', label: '%', prec: 92, args: 1, handle: (a, b) => a % b}, - gt: { type: 'cmp', label: '>', prec: 76, args: 2, handle: (a, b) => (a > b ? 1n : 0n)}, - ge: { type: 'cmp', label: '>=', prec: 72, args: 2, handle: (a, b) => (a >= b ? 1n : 0n)}, - lt: { type: 'cmp', label: '<', prec: 78, args: 2, handle: (a, b) => (a < b ? 1n : 0n)}, - le: { type: 'cmp', label: '<=', prec: 74, args: 2, handle: (a, b) => (a <= b ? 1n : 0n)}, - eq: { type: 'cmp', label: '==', prec: 66, args: 2, handle: (a, b) => (a == b ? 1n : 0n)}, - ne: { type: 'cmp', label: '!=', prec: 64, args: 2, handle: (a, b) => (a != b ? 1n : 0n)}, - and: { type: 'logical', label: '&&', prec: 46, args: 2, handle: (a, b) => (a && b ? 1n : 0n)}, - or: { type: 'logical', label: '||', prec: 44, args: 2, handle: (a, b) => (a || b ? 1n : 0n)}, - shl: { type: 'bit', label: '<<', prec: 86, args: 2, handle: (a, b) => (a << b ? 1n : 0n)}, - shr: { type: 'bit', label: '>>', prec: 84, args: 2, handle: (a, b) => (a >> b ? 1n : 0n)}, - band: { type: 'bit', label: '&', prec: 58, args: 2, handle: (a, b) => (a & b ? 1n : 0n)}, - bor: { type: 'bit', label: '|', prec: 56, args: 2, handle: (a, b) => (a | b ? 1n : 0n)}, - bxor: { type: 'bit', label: '^', prec: 54, args: 2, handle: (a, b) => (a ^ b ? 1n : 0n)}, - not: { type: 'logical', label: '!', prec: 100, args: 1, handle: (a) => (a ? 0n : 1n)}, - } - - constructor () { - this.stack = []; - this.fixedRowAccess = false; - } - - static setParent (parent) { - Expression.parent = parent; - } - - clone() { - let cloned = new Expression(); - cloned.fixedRowAccess = this.fixedRowAccess; - cloned.pushStack(this); - return cloned; - } - - pushStack(e) { - if (!(e instanceof Expression)) { - throw new Error(`pushStack parameter must be an Expression`); - } - const count = e.stack.length; - for (let index = 0; index < count; ++index) { - this.stack.push(this.cloneDeep(e.stack[index], 'pushStack')); - } - return count; - } - - cloneDeep(e, label = '') { - const res = cloneDeep(e); - return res; - } - - next(dnext) { - for (let stack of this.stack) { - for (let ope of stack.operands) { - switch (ope.type) { - case OP_VALUE: - case OP_STACK: - break; - case OP_ID_REF: - const pnext = Number(ope.next); - ope.next = ope.next ? pnext + Number(dnext) : Number(dnext); - break; - case OP_RUNTIME: - throw new Error(`Instance first do next operation`); - } - } - } - } - insertStack(e, pos) { - const delta = e.stack.length; - for (let index = pos; index < this.stack.length; ++index) { - for (const ope of this.stack[index].operands) { - if (ope.type === OP_STACK && (index - ope.offset) < pos) { - ope.offset += delta; - } - } - } - for (let index = this.stack.length - 1; index >= pos; --index) { - this.stack[index + delta] = this.stack[index]; - } - for (let index = 0; index < delta; ++index) { - this.stack[index + pos] = this.cloneDeep(e.stack[index]); - } - this.fixedRowAccess = this.fixedRowAccess || e.fixedRowAccess; - return 1; - } - cloneOperand(operator) { - return cloneDeep(operator); - } - - cloneAlone() { - return this.cloneOperand(this.stack[0].operands[0]); - } - - isAlone () { - return this.stack.length === 1 && this.stack[0].op === false; - } - pushAloneIndex(index) { - assert(this.isAlone()); - let operand = this.getAloneOperand(); - if (typeof operand.indexes === 'undefined') { - operand.indexes = []; - operand.__indexes = []; - operand.dim = 0; - } - operand.indexes.push(index); - operand.__indexes.push(index); - ++operand.dim; - } - popAloneIndex() { - assert(this.isAlone()); - let operand = this.getAloneOperand(); - --operand.dim; - operand.indexes.pop(); - return operand.__indexes.pop(); - } - getAloneOperand () { - return this.stack[0].operands[0]; - } - cloneAloneOperand () { - return cloneDeep(this.getAloneOperand()); - } - - isReference () { - // TODO: review if best place? - // TODO: review if next/prior - return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference' ); - } - - // OP_VALUE (value) - // OP_ID_REF (id, refType, next) refType = [im,witness,fixed,prover,public,((expression))] At end need to calculate next of expression - // OP_STACK (offset) NOTE: absolute_index = current_index - offset; - // OP_RUNTIME (data) - - _set (operand) { - if (this.stack.length) { - throw new Error(`Set only could be used with empty stack`); - } - this.stack.push({op: false, operands: [cloneDeep(operand)]}); - } - - setIdReference (id, refType, next) { - assert(typeof refType === 'string'); - this._set({type: OP_ID_REF, id, refType, next}); - } - - setValue (value) { - if (typeof value === 'object') { - throw new Error(`object(${value.constructor.name}) as value not allowed`); - } - this._set({type: OP_VALUE, value}); - } - - setRuntime (value) { - if (value.type) { - throw new Error(`setRuntime value has a not allowed type property`); - } - this._set({type: OP_RUNTIME, ...value}); - } - - isRuntime () { - return this.stack.some(st => this.isRuntimeStackPos(st)); - } - isRuntimeStackPos(st) { - return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(ope => this.isRuntimeOperand(ope))); - } - isRuntimeOperand(ope) { - return (ope.type === OP_RUNTIME); - } - insertOne (op, b) { - const aIsEmpty = this.stack.length === 0; - const bIsEmpty = b.stack.length === 0; - - if (bIsEmpty) { - throw new Error(`insert without operands`); - } - const aIsAlone = this.isAlone(); - const bIsAlone = b.isAlone(); - if (bIsAlone) { // aIsAlone => !aIsEmpty - if (aIsAlone) { - this.stack[0].op = op; - this.stack[0].operands.push(b.cloneAlone()); - return this; - } - let operandA = aIsEmpty ? [] : [{type: OP_STACK, offset: 1}]; - this.stack.push({op, operands: [...operandA, b.cloneAlone()]}); - return this; - } - - // !aIsAlone (aIsEmpty?) && !bIsAlone - const count = this.pushStack(b); - if (aIsEmpty) { - this.stack.push({op, operands: [{type: OP_STACK, offset: 1}]}); - return this; - } - this.stack.push({op, operands: [{type: OP_STACK, offset: count + 1}, {type: OP_STACK, offset: 1}]}); - return this; - } - - insert (op, ...bs) { - if (bs.length === 1) { - return this.insertOne(op, bs[0]); - } - const anyEmptyB = bs.some((b) => b.stack.length === 0); - const aIsEmpty = this.stack.length === 0; - - // this.runtime = this.runtime || NATIVE_OPS.indexOf(op) < 0 || bs.some((b) => b.runtime); - - if (anyEmptyB) { - throw new Error(`insert without operands`); - } - const aIsAlone = this.isAlone(); - const allBsAreAlone = bs.reduce((res, b) => res && b.isAlone(), true); - - let elem = {op, operands: []}; - if (aIsAlone && allBsAreAlone) { - this.stack[0].op = op; - for (const b of bs) { - this.stack[0].operands.push(b.cloneAlone()); - } - return this; - } - - let counts = []; - for (const b of bs) { - counts.push(b.isAlone() ? 0 : this.pushStack(b)); - } - counts.push(1); - for (let index = counts.length - 2; index >= 0; --index) { - counts[index] += counts[index + 1]; - } - - if (!aIsEmpty) { - elem = {op, operands: [{type: OP_STACK, offset: counts[0]}]}; - } - let index = 0; - for (const b of bs) { - elem.operands.push(b.isAlone() ? b.cloneAlone() : {type: OP_STACK, offset: counts[++index]}); - } - this.stack.push(elem); - return this; - } - evaluateAloneReference() { - assert(this.isAlone()); - let operand = this.getAloneOperand(); - if (operand.type === OP_RUNTIME || operand.op === 'reference') { - const res = this.evaluateRuntime(operand, true); - if (!(res instanceof Expression)) { - operand.__value = res; - } - } - return operand.__value; - } - evaluateOperandValue(ope, pos, deeply, instance = false) { - console.log(deeply); - console.log(ope); - - if (deeply) { - if (ope.type === OP_STACK) { - const stackPos = pos-ope.offset; - this.evaluateStackPosValue(stackPos); // TODO: cache and infinite-loops - ope.__value = this.stack[stackPos].__value; - } - } else if (ope.type === OP_VALUE ) { - ope.__value = ope.value; - - } else if (ope.type === OP_ID_REF ) { - ope.__value = new NonRuntimeEvaluable(); - - } else if (ope.type === OP_RUNTIME ) { - let res = this.evaluateRuntime(ope, deeply); - console.log(res); - console.log(instance); - // BUG: if type was an expression not apply value !! - // if (!(res instanceof Expression)) { - if (instance) { - console.log(res); - if (res instanceof Expression && res.isAlone()) { - res = res.getAloneOperand(); - } - console.log(res); - if (res instanceof Expression) { - res.dump(); - console.log(ope); - ope.__value = res; - } else { - assert(!(res instanceof Expression)); - Object.keys(ope).forEach(key => delete ope[key]); - if (typeof res === 'bigint') { - ope.type = OP_VALUE; - ope.value = res; - delete ope.op; - } else { - if (res.value) { - res = res.value; - } - if (res.refType) { - console.log(res); - // assert(NATIVE_REFS.includes(res.type)); - assert(NATIVE_REFS.includes(res.refType)); - ope.type = OP_ID_REF; - ope.refType = res.refType; - ope.id = res.id; - if (res.next) ope.next = res.next; - assert(typeof ope.id === 'number'); - delete ope.op; - } else if (res.array) { - throw new InstanceArray(); - } else { - console.log(res); - EXIT_HERE; - } - } - } - } else { - ope.__value = res; - } - } - } - assertInstanced() { - try { - for (let ist = 0; ist < this.stack.length; ++ist) { - const st = this.stack[ist]; - assert(VALID_NATIVE_OPS.includes(st.op), `invalid operation ${st.op} on stackpos ${ist}`); - for (let iope = 0; iope < st.operands.length; ++iope) { - const ope = st.operands[iope]; - const ref = `operand #${iope} of stackpos ${ist}`; - assert([OP_STACK, OP_VALUE, OP_ID_REF].includes(ope.type), `${ref} has invalid type ${ope.type}`); - switch (ope.type) { - case OP_STACK: - assert(typeof ope.offset === 'number', `invalid offset type (${typeof ope.offset}) on ${ref}`); - assert(ope.offset > 0, `invalid offset value (${ope.offset}) on ${ref}`); - break; - - case OP_VALUE: - assert(typeof ope.value === 'bigint', `invalid value type (${typeof ope.offset}) on ${ref}`); - break; - - case OP_ID_REF: - assert(NATIVE_REFS.includes(ope.refType), `invalid refType (${ope.refType}) on ${ref}`) - assert(typeof ope.id === 'number', `invalid ope.id type (${typeof ope.id}) on ${ref}`); - break; - - } - if (ope.indexes) { - const indexesType = typeof ope.indexes; - assert(indexesType === 'array', `${ref} has invalid indexes type ${indexesType}`); - for (let index = 0; index < ope.indexes.length; ++index) { - const indexType = typeof ope.indexes[index]; - assert(indexType === 'number', `${ref} has invalid index[${index}] type ${indexType}`); - } - } - } - } - } catch (e) { - this.dump(); - throw e; - } - } - evaluateRuntime(op, deeply = false) { - let res = Expression.parent.evalRuntime(op, this, deeply); - return res; - } - instanceValues() { - for (let se of this.stack) { - for (let index = 0; index < se.operands.length; ++index) { - if (se.operands[index].type !== OP_RUNTIME) continue; - const value = se.operands[index].__value; - if (typeof value === 'bigint') { - se.operands[index] = {type: OP_VALUE, value: value}; - continue; - } - if (typeof value === 'object' && value.type && - ['constant','witness', 'fixed', 'im', 'public', 'expr', 'challenge','subproofvalue', 'proofvalue'].includes(value.type)) { - let ope = {}; - if (value.array) { - // incomplete reference, is a subarray. - ope.type = OP_RUNTIME; - ope.array = value.array; - ope.op = 'idref'; - } else { - ope.type = OP_ID_REF; - ope.array = false; - } - if (typeof value.value === 'undefined' || value.value === null) { - ope.id = value.id; - } else { - ope.id = typeof value.value === 'object' ? value.value.id : value.value; - } - assert(typeof value.type === 'string'); - ope.refType = value.type; - if (value.next) ope.next = value.next; - if (value.prior) ope.next = value.prior; - if (typeof value.row !== 'undefined') { - ope.row = value.row; - } - se.operands[index] = ope; - continue; - } - console.log(value); - console.log(se.operands[index]); -// value.dump(); - throw new Error('Invalid value'); - } - } - } - getReference() { - if (!this.isAlone()) { - throw new Error(`Invalid expression by reference`); - } - let dope = this.cloneAloneOperand(); - if (dope.next || dope.prior) { - throw new Error(`Invalid expression by reference`); - } - this.evaluateIndexes(dope); - return dope; - } - isArray() { - // only a reference could be and array. - if (!this.isReference() || this.stack[0].operands[0].next || this.stack[0].operands[0].prior) return false; - - let ref = this.getReference(); - console.log(ref); - EXIT_HERE; - - } - _instance() { - let dup = this.clone(); - const options = {instance: true} - let stackResults = dup._evaluateOperands(options); - dup._extendExpressions(options); - dup._evaluteFullStack(stackResults, options); - } - _evaluate(value, options) { - // stack references not replaced - // expression references not extended (inserted) - } - _evaluates(values, options) { - // do array of evaluates, for example to evaluate - // indexes o call arguments, this method call n times - // evaluations - if (typeof values === 'undefined') { - return 0; - } - assert (Array.isArray(values)); - let result = []; - for (const value of values) { - result.push(this._evaluate(value, options)); - } - return result; - } - getArrayResult(results, indexes, options) { - // this method take one of results using indexes - } - _evaluateOperands(options) { - // evaluation must be from left to right (l2r) operands, inside operand - // also evaluation is l2r: prior, value, arguments (l2r), indexes (l2r) - // at end of this operand evaluation, must manage increment/decrement - // options. - - // stackResults is used to store operand evaluations needed by full stack - // evaluation. - - let stackResults = []; - for (let stpos = 0; stpos < this.stack.length; ++stpos) { - if (!options.instance) { - // prepare stack of results - stackResults.push([]); - } - for (let ope of this.stack[stpos].operands) { - let next = 0; - // if no prior defined priorValue was 0 - let priorValue = this._evaluate(ope.prior, options); - - let result = this._evaluateOperandValue(ope, stackResults, options); - let indexes = this._evaluates(ope.indexes, options); - if (indexes.length) { - // TODO: fixed access - result = this.getArrayResult(result, indexes, options); - } - // if no prior defined nextValue was 0 - let nextValue = this._evaluate(ope.next, options); - - // prior and next are excl - if (priorValue && nextValue) { - throw new Error(`prior and next for same operand it's ambiguous`); - } - next = nextValue - priorValue; - if (!options.instance) { - // store operand result - stackResults[stpos].push([]); - } - } - } - } - evaluateOperandValue(ope, pos, deeply, instance = false) { - console.log(deeply); - console.log(ope); - - if (deeply) { - if (ope.type === OP_STACK) { - const stackPos = pos-ope.offset; - this.evaluateStackPosValue(stackPos); // TODO: cache and infinite-loops - ope.__value = this.stack[stackPos].__value; - } - } else if (ope.type === OP_VALUE ) { - ope.__value = ope.value; - - } else if (ope.type === OP_ID_REF ) { - ope.__value = new NonRuntimeEvaluable(); - - } else if (ope.type === OP_RUNTIME ) { - let res = this.evaluateRuntime(ope, deeply); - console.log(res); - console.log(instance); - // BUG: if type was an expression not apply value !! - // if (!(res instanceof Expression)) { - if (instance) { - console.log(res); - if (res instanceof Expression && res.isAlone()) { - res = res.getAloneOperand(); - } - console.log(res); - if (res instanceof Expression) { - res.dump(); - console.log(ope); - ope.__value = res; - } else { - assert(!(res instanceof Expression)); - Object.keys(ope).forEach(key => delete ope[key]); - if (typeof res === 'bigint') { - ope.type = OP_VALUE; - ope.value = res; - delete ope.op; - } else { - if (res.value) { - res = res.value; - } - if (res.refType) { - console.log(res); - // assert(NATIVE_REFS.includes(res.type)); - assert(NATIVE_REFS.includes(res.refType)); - ope.type = OP_ID_REF; - ope.refType = res.refType; - ope.id = res.id; - if (res.next) ope.next = res.next; - assert(typeof ope.id === 'number'); - delete ope.op; - } else if (res.array) { - throw new InstanceArray(); - } else { - console.log(res); - EXIT_HERE; - } - } - } - } else { - ope.__value = res; - } - } - } - instance(simplify = false) { - let dup = this.clone(); - try { - dup.dump(); - dup.evaluateOperands(true, true); - dup.instanceExpressions(); - dup.dump(); - const top = dup.stack.length-1; - dup.evaluateStackPosValue(top, true); - dup.instanceValues(); - if (simplify) { - console.log('=== SIMPLIFY ==='); - dup.dump(); - dup.simplify(); - dup.assertInstanced(); - dup.dump(); - } - dup.dump(); - } catch (e) { - // It isn't possible instance an array, because not was an expression, it's an - // array of expressions - if (e instanceof InstanceArray) { - throw new Error('Instancing an array'); - } - throw e; - } - return dup; - } - eval(deeply = false) { - if (this.stack.length === 0) { - return this; - } - if (this.stack[0].op === false) { - delete this.stack[0].operands[0].__value; - } - this.evaluateOperands(deeply); - this.evaluateStackPosValue(this.stack.length-1); - return this.stack[this.stack.length-1].__value ?? this; - } - evaluateStackPosValue(pos, instance = false) { - const st = this.stack[pos]; - - this.evaluateStackPosOperands(pos, true, instance); - - delete st.__value; - const res = this.calculate(st); - if (res !== null) { - st.__value = res; - } - } - _calculate(st, pos, stackResults) { - if (st.op === false) { - return stackResults[pos][0]; - } - - if (st.operands.some((x, index) => (typeof x === 'object' && x.type !== OP_VALUE && typeof stackResults[pos][index] !== 'bigint'))) { - return null; - } - - const opfunc = Expression.operations[st.op] ?? false; - if (opfunc === false) { - throw new Error(`NOT FOUND OPERATION (${st.op})`); - } - - try { - return opfunc.handle.apply(this, stackResults[pos]); - } catch (e) { - console.log([{op: st.op},...stackResults[pos]]); - throw e; - } - } - - calculate(st) { - if (st.op === false) { - return st.operands[0].__value; - } - - if (st.operands.some(x => (typeof x === 'object' && x.type !== OP_VALUE && typeof x.__value !== 'bigint'))) { - return null; - } - - const opfunc = Expression.operations[st.op] ?? false; - if (opfunc === false) { - throw new Error(`NOT FOUND OPERATION (${st.op})`); - } - - const values = st.operands.map(x => x.type === 0 ? x.value : x.__value); - try { - return opfunc.handle.apply(this, values); - } catch (e) { - console.log([{op: st.op},...values]); - throw e; - } - } - isRuntimeCalculable(e) { - const te = typeof e; - if (te === 'string' || te === 'number' || te === 'bigint' /* || te === 'fe' */) { - return true; - } - if (te === 'object' && e.type) { - if (e.type === 'witness' && e.type === 'fixed') return false; - } - } - // this method instance the expression references to include them inside - // TODO: view how these affects to optimization. - instanceExpressions() { - let pos = 0; - while (pos < this.stack.length) { - let nextPos = true; - for (let ope of this.stack[pos].operands) { - // assert(ope.__value instanceof Expression === false); - if (ope.type !== OP_RUNTIME) continue; - console.log(ope); - if (ope.__value instanceof Expression) { - ope.type = OP_STACK; - const exprToInsert = ope.__value.instance(); - const next = typeof ope.next === 'number' ? ope.next : ope.__next; - if (next) exprToInsert.next(next); - ope.offset = this.insertStack(exprToInsert, pos); - nextPos = false; - break; - } - if (typeof ope.__value !== 'undefined' && !(ope.__value instanceof NonRuntimeEvaluable)) continue; - - // TODO: twice evaluations, be carefull double increment evaluations,etc.. - const res = this.evaluateRuntime(ope); - if (res.value && res.value.type === OP_ID_REF) { - ope.type = OP_ID_REF; - ope.refType = res.refType; - ope.id = res.id; - } else if (res instanceof Expression) { - ope.type = OP_STACK; - const exprToInsert = res.instance(); - const next = typeof ope.next === 'number' ? ope.next : ope.__next; - if (next) exprToInsert.next(next); - ope.offset = this.insertStack(exprToInsert, pos); - nextPos = false; - break; - } - } - if (nextPos) ++pos; - } - } - simplify() { - let loop = 0; - while (this.stack.length > 0) { - let updated = false; - for (const st of this.stack) { - updated = this.simplifyOperation(st) || updated; - } - this.compactStack(); - if (!updated) break; - } - } - simplifyRuntimeToValue(st) { - for (let index = 0; index < st.operands.length; ++index) { - const value = st.operands[index].__value; - if (['string', 'number', 'bigint'].includes(value)) { - st.operands[index] = {type: OP_VALUE, value}; - } - } - } - - // this method simplify trivial operations as 0 + x or 1 * x, also - // simplify operations between values, not only direct values also - // referenced and solved values (as runtime variable) - - simplifyOperation(st) { - if (st.op === false || st.operands.length > 2) { - return false; - } - - this.simplifyRuntimeToValue(st); - const firstValue = st.operands[0].type === OP_VALUE ? st.operands[0].value : false; - const secondValue = (st.operands.length > 1 && st.operands[1].type === OP_VALUE) ? st.operands[1].value : false; - - // [op,v1,v2] ==> [v1 op v2] - if (firstValue !== false && secondValue !== false) { - assert(!firstValue || (!firstValue.next && !firstValue.__next)); - assert(!secondValue || (!secondValue.next && !secondValue.__next)); - const res = this.calculate(st); - if (res === null) return false; - st.operands = [{type: OP_VALUE, value: res}]; - st.op = false; - delete st.__value; - delete st.__indexes; - delete st.__next; - return true; - } - - // [neg,value] ==> [false,-value] - if (st.op === 'neg' && firstValue !== false) { - assert(!firstValue.next && !firstValue.__next); - st.op = false; - st.operands[0].value = -st.operands[0].value; - return true; - } - - const firstZero = firstValue === 0n; - - if (firstZero || secondValue === 0n) { - // [mul, 0, x] ==> [0] - // [mul, x, 0] ==> [0] - if (st.op === 'mul') { - st.op = false; - st.operands = [st.operands[firstZero ? 0:1]]; - return true; - } - // [add, 0, x] ==> [x] - // [add, x, 0] ==> [x] - if (st.op === 'add') { - st.op = false; - st.operands = [st.operands[firstZero ? 1:0]]; - return true; - } - - // [sub, x, 0] ==> [x] - if (st.op === 'sub' && !firstZero) { - st.op = false; - return true; - } - } - - const firstOne = firstValue === 1n; - - // [mul, 1, x] ==> [x] - // [mul, x, 1] ==> [x] - if (st.op === 'mul' && (firstOne || secondValue === 1n)) { - st.op = false; - st.operands = [st.operands[firstOne ? 1:0]]; - return true; - } - - // TODO: be carrefull with next, prior, inc, dec - // x - x = 0 ??? - // (x - (- y)) = x + y - // (x + (- y)) = x - y - // v1 * x + v2 * x = (v1+v2) * x - // v1 * x - v2 * x = (v1-v2) * x - - // TODO: binary cols optimizations, each kind of optimization has a key to enable/disable - // this specific optimization. - // BC(y) ==> y * x + (1 - y) * z = y * (z - x) + x - - - // TODO: evaluate all expressions with different prime values (valid values as binary constraints 🤔) - // detect same expressions (as bigints or as fe, bigints same implies fe same 🤔). - // After, check matchs with other 100% sure method. - - return false; - } - - // this method compact stack positions with one element where operation - // was false, replace reference of this stack operation by directly value - compactStack() { - let translate = []; - let stackPos = 0; - let stackLen = this.stack.length; - for (let istack = 0; istack < stackLen; ++istack) { - const st = this.stack[istack]; - if (st.op === false) { - const ope = st.operands[0]; - // two situations, for alone stack reference, use its reference and it must - // be purged - translate[istack] = ope.type === OP_STACK ? [true, translate[istack - ope.offset][1]] : [true, istack]; - continue; - } - - translate[istack] = [false, stackPos++]; - - // foreach operand if it's a stack reference, must be replaced by - // new reference or by copy of reference if it was alone (no operation) - for (let iope = 0; iope < st.operands.length; ++iope) { - if (st.operands[iope].type !== OP_STACK) continue; - const absolutePos = istack - st.operands[iope].offset; - const [purge, newAbsolutePos] = translate[absolutePos]; - assert(absolutePos < istack); - if (purge && this.stack[newAbsolutePos].op === false) { - // if purge and referenced position was alone, it is copied (duplicated) - this.stack[istack].operands[iope] = cloneDeep(this.stack[newAbsolutePos].operands[0]); - } else { - // stackPos - 1 is new really istack after clear simplified stack positions - // calculate relative position (offset) - const newOffset = (stackPos - 1) - newAbsolutePos; - assert(newOffset > 0); - this.stack[istack].operands[iope].offset = newOffset; - } - } - - } - // DEBUG: - translate.forEach((value, index) => console.log(`#${index} => ${value}`)); - - // move stackpositions to definitive positions, from end to begin to avoid - // overwriting, updating last position used to remove rest of stack positions - let lastPosUsed = false; - for (let istack = 0; istack < stackLen; ++istack) { - const [purge, absoluteNewPos] = translate[istack]; - if (purge) continue; - - this.stack[absoluteNewPos] = this.stack[istack]; - lastPosUsed = absoluteNewPos; - } - if (lastPosUsed !== false) { - this.stack.splice(lastPosUsed + 1); - } else { - // all stack positions must be removed, but at least need position #0 - this.stack.splice(1); - } - - // return if expression was updated - return stackLen > this.stack.length; - } - evaluateOperands(deeply = false, instance = false) { - for (let index = 0; index < this.stack.length; ++index) { - this.evaluateStackPosOperands(index, deeply, instance); - } - } - evaluateStackPosOperands(pos, deeply, instance = false) { - console.log([this.stack, pos]); - for (let ope of this.stack[pos].operands) { - this.evaluateOperand(ope, pos, deeply, instance); - } - } - evaluateOperand(ope, pos, deeply, instance = false) { - if (!deeply) { - this.clearNext(ope); - this.evaluatePrior(ope); - this.evaluateIndexes(ope); - this.evaluateNext(ope); - // TODO: for optimizations - if (instance) { - // indexes not exists when instanced !!! - ope.next = ope.__next; - delete ope.__next; - } - } - this.evaluateOperandValue(ope, pos, deeply, instance); - if (instance) { - delete ope.indexes; - delete ope._indexes; - } - } - - clearNext(ope) { - ope.__next = 0; - } - evaluatePrior(ope) { - if (typeof ope.prior === 'undefined') { - return 0; - } - ope.__next = -this.evaluateContent(ope.prior); - return ope.__next; - } - - evaluateIndexes(ope) { - if (typeof ope.indexes === 'undefined') { - return []; - } - ope.__indexes = []; - for (let index of ope.indexes) { - ope.__indexes.push(this.evaluateContent(index)); - } - return ope.__indexes; - } - - evaluateNext(ope) { - if (typeof ope.next === 'undefined') { - return 0; - } - const nextValue = this.evaluateContent(ope.next); - if (nextValue && ope.__next !== 0) { - // it isn't possible by grammar - throw new Error(`next and prior are incompatible between them`); - } - if (nextValue) { - ope.__next = nextValue; - } - return ope.__next; - } - - evaluateContent(e) { - if (typeof e === 'bigint' || typeof e === 'number' || typeof e == 'string' || typeof e == 'boolean') { - return e; - } - if (e.op == 'reference') { - return this.evaluateReference(e); - } - if (e instanceof Expression) { - return e.eval(); - } - console.log(e); - EXIT_HERE; - } - - evaluateReference(e) { - return Expression.parent.evaluateReference(e); - } -/* evaluateRuntime(e) { - // function_call op:'call' function: arguments: - // positional_param op:'positional_param' position: - // casting op:'cast' cast: value: dim: ?? - }*/ - dump(title) { - // console.trace(); - let caller = ''; - try { - throw new Error(); - } catch (e) { - caller = e.stack.split('\n')[2].trim().substring(3); - } - title = title ? `(${title}) `:''; - console.log(`\x1B[38;5;214m|==========> DUMP ${title}${caller} <==========|\x1B[0m`); - for (let index = this.stack.length-1; index >=0; --index) { - const st = this.stack[index]; - let info =`\x1B[38;5;214m#${index} ${st.op}`; - for (const operand of st.operands) { - info = info + ' [\x1B[38;5;76m' + this.dumpOperand(operand,index)+'\x1B[38;5;214m]'; - } - console.log(info+'\x1B[0m'); - } - } - dumpOperand(op, pos) { - const cType = '\x1B[38;5;76m'; - const cProp = '\x1B[38;5;250m'; - const cValue = '\x1B[38;5;40m'; - switch (op.type) { - case OP_VALUE: - return `${cType}VALUE ${cValue}${op.value}`; - case OP_ID_REF: - // refType, [offset], next - const next = op.next ? `${cProp}next:${cValue}${op.next}`:''; - return `${cType}ID_REF ${cProp}refType:${cValue}${op.refType} ${cProp}id:${cValue}${op.id}${next}`; - case OP_STACK: - return `${cType}STACK ${cProp}pos:${cValue}${pos - op.offset}[-${op.offset}]`; - case OP_RUNTIME: - let props = '' - for (const prop in op) { - if (prop === '__yystate' || prop === 'debug' || prop === 'type') continue; - props = props + ` ${cProp}${prop}:${cValue}${op[prop]}`; - } - return `${cType}RUNTIME${props}`; - } - return `\x1B[1;31m¿¿${op.type}??\x1B[0m`; - } - // TODO: cache of next - instanceNext(next) { - let _next = this.instance(); - } - updateOperandNext(op, next) { - assert(op.type != RUNTIME); - - if (op.type === OP_ID_REF) { - op.next += next; - } - } - toString(options) { - let top = this.stack.length-1; - if (top < 0) { - return '(empty expression)'; - } - return this.stackPosToString(top ,0, options); - } - stackPosToString(pos, pprec, options) { - const st = this.stack[pos]; - if (typeof st === 'undefined') { - console.log(pos); - console.log(this.stack); - } - if (st.op === false) { - return this.operandToString(st.operands[0], pos, pprec, options); - } - const opinfo = Expression.operations[st.op]; - let res; - if (st.operands.length === 1) { - res = Expression.operations[st.op].label + this.operandToString(st.operands[0], pos, opinfo.prec, options); - - } else if (st.operands.length === 2) { - res = this.operandToString(st.operands[0], pos, opinfo.prec, options) + ' ' + Expression.operations[st.op].label + ' ' + - this.operandToString(st.operands[1], pos, opinfo.prec, options); - } else { - TODO_EXIT - } - if (pprec > opinfo.prec) { - res = '(' + res + ')'; - } - return res; - } - operandToString(ope, pos, pprec, options) { - switch (ope.type) { - - case OP_VALUE: - return ope.value.toString(); - case OP_ID_REF: - // refType, [offset], next - let res = (Expression.parent && (!options || !options.hideLabel))? Expression.parent.getLabel(ope.refType, ope.id, options) : false; - if (!res) { - res = `${ope.refType}@${ope.id}`; - } - if (ope.next < 0) res = `${ope.next==-1?'':-ope.next}'${res}`; - if (ope.next > 0) res = `${res}'${ope.next==1?'':ope.next}`; - return res; - case OP_STACK: - if ((pos - ope.offset ) < 0) { - console.log(`invalid offset ${pos - ope.offset} pos:${pos} offset:${ope.offset}`); - } - return this.stackPosToString(pos-ope.offset, pprec, options); - case OP_RUNTIME: - if (ope.op === 'reference' && ope.name) { - return `RUNTIME{${ope.name}}` - } - return `RUNTIME{${ope.op}(${ope.name??''})}`; - //console.log(ope); - - } - - } - pack(container, options) { - let top = this.stack.length-1; - return this.stackPosPack(container, top, options); - } - stackPosPack(container, pos, options) { - const st = this.stack[pos]; - if (st.op === false) { - this.operandPack(container, st.operands[0], pos, options); - return false; - } - for (const ope of st.operands) { - this.operandPack(container, ope, pos, options); - } - switch (st.op) { - case 'mul': - return container.mul(); - - case 'add': - return container.add(); - - case 'sub': - return container.sub(); - - case 'neg': - return container.neg(); - - default: - throw new Error(`Invalid operation ${st.op} on packed expression`); - } - } - - operandPack(container, ope, pos, options) { - switch (ope.type) { - case OP_VALUE: - container.pushConstant(ope.value); - break; - - case OP_ID_REF: - console.log(['PACK_OP_ID_REF',ope.refType, ope.id, ope.next]); - this.referencePack(container, ope.refType, ope.id, ope.next, options); - break; - - case OP_STACK: - // TODO: expression == false; - const eid = this.stackPosPack(container, pos-ope.offset, options); - if (eid !== false) { // eid === false => alone operand - container.pushExpression(eid); - } - break; - - default: - console.log(ope); - throw new Error(`Invalid reference ${ope.type} on packed expression`); - } - - } - referencePack(container, type, id, next, options) { - // TODO stage - switch (type) { - case 'im': - container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); - break; - - case 'witness': - container.pushWitnessCol(id, next); // TODO: stage - break; - - case 'fixed': - container.pushFixedCol(id, next); - break; - - case 'public': - container.pushPublicValue(id); - break; - - default: - throw new Error(`Invalid reference type ${type} to pack`); - } - } - resolve() { - const res = this.eval(); - if (res instanceof Expression) { - return res.instance(true); - } - return res; - } -} diff --git a/src/expression_pack.js b/src/expression_packer.js similarity index 66% rename from src/expression_pack.js rename to src/expression_packer.js index 3e0d604..95e252a 100644 --- a/src/expression_pack.js +++ b/src/expression_packer.js @@ -4,58 +4,58 @@ const ExpressionItems = require('./expression_items.js'); const Context = require('./context.js'); const { DefinitionItem } = require('./definition_items.js'); -module.exports = class ExpressionPack { - constructor() { - this.expression = false; +module.exports = class ExpressionPacker { + constructor(container = false, expression = false) { + this.set(container, expression); } - set(expression) { + set(container, expression) { + this.container = container; this.expression = expression; - return this; } - packAlone(container, options) { - this.operandPack(container, this.expression.getAloneOperand(), 0, options); - return container.pop(1)[0]; + packAlone(options) { + this.operandPack(this.expression.getAloneOperand(), 0, options); + return this.container.pop(1)[0]; } - pack(container, options) { + pack(options) { let top = this.expression.stack.length-1; - return this.stackPosPack(container, top, options); + return this.stackPosPack(top, options); } - stackPosPack(container, pos, options) { + stackPosPack(pos, options) { const st = this.expression.stack[pos]; if (st.op === false) { - this.operandPack(container, st.operands[0], pos, options); + this.operandPack(st.operands[0], pos, options); return false; } for (const ope of st.operands) { - this.operandPack(container, ope, pos, options); + this.operandPack(ope, pos, options); } switch (st.op) { case 'mul': - return container.mul(); + return this.container.mul(); case 'add': - return container.add(); + return this.container.add(); case 'sub': - return container.sub(); + return this.container.sub(); case 'neg': - return container.neg(); + return this.container.neg(); default: throw new Error(`Invalid operation ${st.op} on packed expression`); } } - operandPack(container, ope, pos, options) { + operandPack(ope, pos, options) { if (ope instanceof ExpressionItems.ValueItem) { - container.pushConstant(ope.value); + this.container.pushConstant(ope.value); } else if (ope instanceof ExpressionItems.ProofItem) { - this.referencePack(container, ope, options); + this.referencePack(ope, options); } else if (ope instanceof ExpressionItems.StackItem) { - const eid = this.stackPosPack(container, pos-ope.getOffset(), options); + const eid = this.stackPosPack(pos-ope.getOffset(), options); if (eid !== false) { // eid === false => alone operand - container.pushExpression(eid); + this.container.pushExpression(eid); } } else { const opeType = ope instanceof Object ? ope.constructor.name : typeof ope; @@ -63,7 +63,7 @@ module.exports = class ExpressionPack { } } - referencePack(container, ope, options) { + referencePack(ope, options) { // TODO stage expression // container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); // break; @@ -80,27 +80,27 @@ module.exports = class ExpressionPack { console.log(ope); // CURRENT ERROR: in this scope definition not available. console.log(def); - container.pushWitnessCol(id, ope.getRowOffset(), def.stage); + this.container.pushWitnessCol(id, ope.getRowOffset(), def.stage); } else if (ope instanceof ExpressionItems.FixedCol) { // container.pushFixedCol(id, next ?? 0); - container.pushFixedCol(id, ope.getRowOffset()); + this.container.pushFixedCol(id, ope.getRowOffset()); } else if (ope instanceof ExpressionItems.Public) { // container.pushPublicValue(id) - container.pushPublicValue(id); + this.container.pushPublicValue(id); } else if (ope instanceof ExpressionItems.Challenge) { // container.pushChallenge(id, stage ?? 1); - container.pushChallenge(id, def.stage); + this.container.pushChallenge(id, def.stage); } else if (ope instanceof ExpressionItems.Proofval) { // container.pushProofValue(id) - container.pushProofValue(id); + this.container.pushProofValue(id); } else if (ope instanceof ExpressionItems.Subproofval) { // container.pushSubproofValue(id) - container.pushSubproofValue(id); + this.container.pushSubproofValue(id); } else { throw new Error(`Invalid reference class ${ope.constructor.name} to pack`); } diff --git a/src/expressions.js b/src/expressions.js index 966645a..28b32de 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -3,14 +3,13 @@ const LabelRanges = require('./label_ranges.js'); const Expression = require('./expression.js'); const WitnessCol = require('./expression_items/witness_col.js'); const NonRuntimeEvaluable = require('./non_runtime_evaluable.js'); -const ExpressionPack = require('./expression_pack.js'); +const ExpressionPacker = require('./expression_packer.js'); const Context = require('./context.js'); module.exports = class Expressions { constructor () { this.expressions = []; this.packedIds = []; this.labelRanges = new LabelRanges(); - this.expressionPack = new ExpressionPack(); } clone() { let cloned = Object.assign(Object.create(Object.getPrototypeOf(this)), this); @@ -347,19 +346,20 @@ module.exports = class Expressions { } pack(container, options) { this.packedIds = []; + const packer = new ExpressionPacker(); for (let id = 0; id < this.expressions.length; ++id) { if (typeof this.packedIds[id] !== 'undefined') continue; // already packed this.expressions[id].dump('PACK-EXPRESSION '); - this.expressionPack.set(this.expressions[id]); - this.packedIds[id] = this.expressionPack.pack(container, options); + packer.set(container, this.expressions[id]); + this.packedIds[id] = packer.pack(options); // packedId === false, means directly was a alone term. } } getPackedExpressionId(id, container, options) { console.log(id, this.packedIds, this.packedIds[id]); if (container && typeof this.packedIds[id] === 'undefined') { - this.expressionPack.set(this.expressions[id]); - this.packedIds[id] = this.expressionPack.pack(container, options); + const packer = new ExpressionPacker(container, this.expressions[id]); + this.packedIds[id] = packer.pack(options); } return this.packedIds[id]; } diff --git a/src/processor.js b/src/processor.js index 619a117..376bf17 100644 --- a/src/processor.js +++ b/src/processor.js @@ -357,6 +357,11 @@ module.exports = class Processor { this.hints.define(name, res); } processHintData(hdata) { + if (hdata instanceof Expression) { + const value = hdata.eval(); + if (typeof value === 'bigint') return value; + return hdata.instance(); + } if (hdata.type === 'array') { let result = []; for (const item of hdata.data) { @@ -372,11 +377,6 @@ module.exports = class Processor { } return result; } - if (hdata instanceof Expression) { - const value = hdata.eval(); - if (typeof value === 'bigint') return value; - return hdata.instance(); - } console.log(hdata); EXIT_HERE; } diff --git a/src/proto_out.js b/src/proto_out.js index b7fda19..f12b9e9 100644 --- a/src/proto_out.js +++ b/src/proto_out.js @@ -469,8 +469,8 @@ module.exports = class ProtoOut { toHintField(hdata, options = {}) { const path = options.path ?? ''; // check if an alone expression to use and translate its single operand - if (hdata && typeof hdata.isAlone === 'function') { - const operand = hdata.packAlone(options.packed, options); + if (hdata && typeof hdata.pack === 'function') { + const operand = hdata.pack(options.packed, options); this.translate(operand); return { operand }; } @@ -504,7 +504,7 @@ module.exports = class ProtoOut { return { hintFieldArray: { hintFields: Array.isArray(result) ? result : [result] }}; } console.log(hdata); - throw new Error(`Invalid hint-data (type:${typeof data}) on cloneHint of ${path}`); + throw new Error(`Invalid hint-data (type:${typeof hdata}/${(hdata.constructor ?? {name:''}).name}) on cloneHint of ${path}`); } bint2uint8(value, bytes = 0) { let result = new Uint8Array(this.uint8size); diff --git a/src/references.js b/src/references.js index b6baa82..aee14f8 100644 --- a/src/references.js +++ b/src/references.js @@ -24,7 +24,10 @@ module.exports = class References { break; } } - return instance.get ? instance.get(item.id): false; + console.log(instance, item.id); + const res = instance.get ? instance.get(item.id): false; + console.log(res); + return res; } /* getDefinition(name, indexes) { const reference = this.getReference(name); @@ -130,7 +133,19 @@ module.exports = class References { } return [false, type]; } - checkAndGetContainer(nameInfo) { + getGlobalScope(name, useCurrentContainer = true) { + const res = this.decodeName(name); + if (res.absoluteScope) { + if (res.isProofScope) return 'proof'; + if (res.isSubproofScope) return 'subproof'; + if (res.isAirScope) return 'air'; + } + if (useCurrentContainer) { + this.containers.getCurrent(); + } + return false; + } + checkAndGetContainer(nameInfo){ const container = this.containers.getCurrent(); if (container && nameInfo.scope !== false) { throw new Error(`Static reference ${nameInfo.name} inside container not allowed`); diff --git a/src/subproof.js b/src/subproof.js index 9ec86ea..523c177 100644 --- a/src/subproof.js +++ b/src/subproof.js @@ -26,11 +26,14 @@ module.exports = class Subproof { } airEnd() { if (!this.insideFirstAir) { - const spvNonDeclared = Object.keys(this.spvDeclaredInsideThisAir).filter(name => this.spvDeclaredInsideThisAir[name] === false); - if (spvNonDeclared.length > 0) { - console.log(spvNonDeclared); - throw new Error(``); - } + /* const spvNonDeclared = Object.keys(this.spvDeclaredInsideThisAir).filter(name => this.spvDeclaredInsideThisAir[name] === false); + console.log(spvNonDeclared); + for (const name of spvNonDeclared) { + console.log(Context.references.getReference(name)); + console.log(Context.references.getReference(name+'__')); + // console.log(spvNonDeclared, Context.airName); + // throw new Error(``); + }*/ } this.insideFirstAir = false; this.insideAir = false; @@ -44,7 +47,11 @@ module.exports = class Subproof { // this.colDeclaration(s, 'subproofvalue', true, false, {aggregateType: s.aggregateType}); console.log(['SUBPROOFVALUE', name,lengths, data]); const res = Context.references.declare(name, 'subproofvalue', lengths, data); + console.log(Context.references.getNameScope(name)); + console.log(Context.references.containers.getCurrent()) + console.log(Context.references.containers.get(Context.references.containers.getCurrent())); this.spvDeclaredInFirstAir[name] = {res, lengths: [...lengths]}; + console.log(res); return res; } diff --git a/test/pil2/std2/std_mset_lookup_range.pil b/test/pil2/std2/std_mset_lookup_range.pil index 9b87f0b..49e5797 100644 --- a/test/pil2/std2/std_mset_lookup_range.pil +++ b/test/pil2/std2/std_mset_lookup_range.pil @@ -295,6 +295,7 @@ private function PIOP_proof() { } private function check_was_completed() { +/* for (int opid in proof.std.piop.opids) { use proof.std.piop.`id${opid}`; if (assumes == 0) { @@ -303,5 +304,16 @@ private function check_was_completed() { if (proves == 0) { error(`PIOP #${opid} defined without proves`); } + }*/ + + for (int index = 0; index < proof.std.piop.opids_count; index = index + 1) { + int opid = proof.std.piop.opids[index]; + use proof.std.piop.`id${opid}`; + if (assumes == 0) { + error(`PIOP #${opid} defined without require`); + } + if (proves == 0) { + error(`PIOP #${opid} defined without provide`); + } } } \ No newline at end of file diff --git a/test/pil2/vadcop-fibonacci-proofman/module.pil b/test/pil2/vadcop-fibonacci-proofman/module.pil index 08bd7a2..3a5c0ea 100644 --- a/test/pil2/vadcop-fibonacci-proofman/module.pil +++ b/test/pil2/vadcop-fibonacci-proofman/module.pil @@ -1,4 +1,4 @@ -constant MODULE_ID = 1; +const int MODULE_ID = 1; subproof Module(2**4) { From 2ada145d68b65aee9250cf1cd166c12842e21821 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Fri, 10 Nov 2023 10:47:59 +0100 Subject: [PATCH 24/33] fix bugs on pilout generation --- src/challenges.js | 14 +++ src/constraints.js | 3 +- src/definition_items/subproofval.js | 5 + src/expression_items/subproofval.js | 6 +- src/expression_packer.js | 5 +- src/indexable.js | 3 - src/label_ranges.js | 5 + src/packed_expressions.js | 31 +++--- src/processor.js | 141 +++++++++++++++++----------- src/proto_out.js | 43 +++++---- src/references.js | 3 +- src/subproof_values.js | 24 +++++ src/subproofs.js | 8 ++ 13 files changed, 193 insertions(+), 98 deletions(-) create mode 100644 src/challenges.js create mode 100644 src/subproof_values.js diff --git a/src/challenges.js b/src/challenges.js new file mode 100644 index 0000000..8c6f7df --- /dev/null +++ b/src/challenges.js @@ -0,0 +1,14 @@ +const Indexable = require("./indexable.js"); +const ChallengeItem = require("./expression_items/challenge.js"); +const ChallengeDefinition = require("./definition_items/challenge.js"); +module.exports = class Challenges extends Indexable { + constructor () { + super('challenge', ChallengeDefinition, ChallengeItem); + } + getEmptyValue(id, options) { + const subproofId = options.subproofId; + const relativeId = this.values.reduce((res, spv) => spv.subproofId === subproofId ? res + 1 : res, 0); + let definition = super.getEmptyValue(id, {relativeId, ...options}); + return definition; + } +} diff --git a/src/constraints.js b/src/constraints.js index 741914f..e84dd6d 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -16,7 +16,7 @@ module.exports = class Constraints { } get(id) { - return this.constraints[id]; + return {...this.constraints[id]}; } getExpr(id) { @@ -60,6 +60,7 @@ module.exports = class Constraints { // left.instance().dump(`XXXXXXXXX-${dumpId}-2`); left.simplify(); const exprId = Context.expressions.insert(left); + console.log(`DEFINE CONSTRAINT ${sourceRef}`); return this.constraints.push({exprId, sourceRef, boundery}) - 1; } diff --git a/src/definition_items/subproofval.js b/src/definition_items/subproofval.js index 431b491..792cee1 100644 --- a/src/definition_items/subproofval.js +++ b/src/definition_items/subproofval.js @@ -1,11 +1,16 @@ const ProofItem = require("./proof_item.js"); +const {assert, assertLog} = require('../assert.js'); module.exports = class Subproofval extends ProofItem { constructor (id, data = {}) { super(id); + const subproofId = data.subproofId ?? false; + assert(typeof data.subproofId === 'number'); + this.subproofId = subproofId; this.aggregateType = data.aggregateType; this.sourceRef = data.sourceRef; this.subproofId = data.subproofId; this.label = data.label; + this.relativeId = data.relativeId ?? false; } clone() { return new Subproofval(this.id, {aggregateType: this.aggregateType, diff --git a/src/expression_items/subproofval.js b/src/expression_items/subproofval.js index e576e2c..14c7cea 100644 --- a/src/expression_items/subproofval.js +++ b/src/expression_items/subproofval.js @@ -1,12 +1,12 @@ const ProofItem = require("./proof_item.js"); module.exports = class Subproofval extends ProofItem { - constructor (id, stage) { - super(id, stage); + constructor (id) { + super(id); } getTag() { return 'subproofvalue'; } cloneInstance() { - return new Subproofval(this.id, this.stage); + return new Subproofval(this.id); } } diff --git a/src/expression_packer.js b/src/expression_packer.js index 95e252a..9156983 100644 --- a/src/expression_packer.js +++ b/src/expression_packer.js @@ -24,7 +24,7 @@ module.exports = class ExpressionPacker { const st = this.expression.stack[pos]; if (st.op === false) { this.operandPack(st.operands[0], pos, options); - return false; + return this.container.pop(1)[0]; } for (const ope of st.operands) { this.operandPack(ope, pos, options); @@ -100,7 +100,8 @@ module.exports = class ExpressionPacker { } else if (ope instanceof ExpressionItems.Subproofval) { // container.pushSubproofValue(id) - this.container.pushSubproofValue(id); + const def = Context.references.getDefinitionByItem(ope); + this.container.pushSubproofValue(def.relativeId, def.subproofId); } else { throw new Error(`Invalid reference class ${ope.constructor.name} to pack`); } diff --git a/src/indexable.js b/src/indexable.js index 20c6d2e..81eb7a5 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -42,9 +42,6 @@ module.exports = class Indexable { return this.rtype; } getEmptyValue(id, data = {}) { - if (this.type === 'subproofvalue') { - console.log(['SUBPROOFVALUE-E', data]); - } if (this.definitionClass) { return new this.definitionClass(id, data); } diff --git a/src/label_ranges.js b/src/label_ranges.js index 30d72fe..8ec5d85 100644 --- a/src/label_ranges.js +++ b/src/label_ranges.js @@ -35,6 +35,11 @@ module.exports = class LabelRanges { } return cloned; } + dump() { + for (const range of this.ranges) { + console.log(`[${range.from}-${range.to}] ${range.label}`); + } + } *[Symbol.iterator]() { for (let index = 0; index < this.ranges.length; ++index) { diff --git a/src/packed_expressions.js b/src/packed_expressions.js index e26a5f6..6a1cb65 100644 --- a/src/packed_expressions.js +++ b/src/packed_expressions.js @@ -40,8 +40,8 @@ module.exports = class PackedExpressions { pushChallenge (idx, stage = 1) { this.values.push({challenge: {stage, idx}}); } - pushSubproofValue (idx) { - this.values.push({subproofValue: {idx}}); + pushSubproofValue (idx, subproofId) { + this.values.push({subproofValue: {idx, subproofId}}); } pushProofValue (idx) { this.values.push({proofValue: {idx}}); @@ -121,20 +121,21 @@ module.exports = class PackedExpressions { } } - getLabel(type, id, options) { - options = options ?? {}; - const labels = options.labels; - const labelsByType = options.labelsByType; - let label; - if (labelsByType && typeof labelsByType[type] === 'object' && typeof labelsByType[type].getLabel === 'function') { - label = labelsByType[type].getLabel(id, options); - } else if (typeof labels === 'object' && typeof labels.getLabel === 'function') { - label = labels.getLabel(type, id, options); + getLabel(type, id, options = {}) { + const labelSources = [(options.labelsByType ?? {})[type], options.labels]; + let args = [id, options]; + for (const labels of labelSources) { + if (labels) { + if (typeof labels === 'function') { + return labels.apply(null, args); + } + if (typeof labels.getLabel === 'function') { + return labels.getLabel.apply(labels, args); + } + } + args.unshift(type); } - if (!label) { - label = `${type}@${id}`; - } - return label; + return label = `${type}@${id}`; } *[Symbol.iterator]() { diff --git a/src/processor.js b/src/processor.js index 376bf17..2eeb35e 100644 --- a/src/processor.js +++ b/src/processor.js @@ -20,6 +20,7 @@ const PackedExpressions = require("./packed_expressions.js"); const ProtoOut = require("./proto_out.js"); const FixedCols = require("./fixed_cols.js"); const WitnessCols = require("./witness_cols.js"); +const SubproofValues = require("./subproof_values.js"); const Iterator = require("./iterator.js"); const Context = require("./context.js"); const Runtime = require("./runtime.js"); @@ -93,7 +94,7 @@ module.exports = class Processor { ExpressionItem.setManager(ExpressionItems.Proofval, this.proofvalues); this.references.register('proofvalue', this.proofvalues); - this.subproofvalues = new Indexable('subproofvalue', DefinitionItems.Subproofval, ExpressionItems.Subproofval); + this.subproofvalues = new SubproofValues(); ExpressionItem.setManager(ExpressionItems.Subproofval, this.subproofvalues); this.references.register('subproofvalue', this.subproofvalues); @@ -125,6 +126,9 @@ module.exports = class Processor { this.currentSubproof = false; this.sourceRef = '(init)'; + + this.proto = new ProtoOut(this.Fr); + this.proto.setupPilOut('noname'); } loadBuiltInClass() { const filenames = fs.readdirSync(__dirname + '/builtin'); @@ -181,53 +185,56 @@ module.exports = class Processor { // this.constraints.dump(packed); // this.fixeds.dump(); - let proto = new ProtoOut(this.Fr); - proto.setupPilOut('myFirstPil'); - let subproofId = 0; - proto.setSubproofvalues(this.subproofvalues.getPropertyValues(['id', 'aggregateType', 'subproofId'])); - proto.setPublics(this.publics); - proto.setProofvalues(this.proofvalues); - proto.setChallenges(this.challenges); - for (const subproofName of this.subproofs) { - const subproof = this.subproofs.get(subproofName); - proto.setSubproof(subproofName, subproof.aggregate); - let airId = 0; - for (const airName of subproof.airs) { - console.log(`SUBPROOF(${subproofName},${airName})`); - const air = subproof.airs.get(airName); - const bits = log2(Number(air.rows)); - proto.setAir(airName, air.rows); - proto.setFixedCols(air.fixeds); - proto.setWitnessCols(air.witness); - // expression: constraint, hint, operand (expression) - let packed = new PackedExpressions(); - // this.expressions.pack(packed); - air.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); - proto.setConstraints(air.constraints, packed, - { labelsByType: { - witness: air.witness.labelRanges, - fixed: air.fixeds.labelRanges }, - expressions: air.expressions - }); - proto.setSymbolsFromLabels(air.witness.labelRanges, 'witness', {airId, subproofId}); - proto.setSymbolsFromLabels(air.fixeds.labelRanges, 'fixed', {airId, subproofId}); - proto.setExpressions(packed); - proto.addHints(air.hints, packed, { - subproofId, - airId - }); - ++airId; - } - ++subproofId; - } + // let proto = new ProtoOut(this.Fr); + // proto.setupPilOut('myFirstPil'); + // let subproofId = 0; + // proto.setSubproofvalues(this.subproofvalues.getPropertyValues(['id', 'aggregateType', 'subproofId'])); + this.proto.setPublics(this.publics); + this.proto.setProofvalues(this.proofvalues); + this.proto.setChallenges(this.challenges); + // update challenge stage on expression, only for challenges with open-stage because + // only at end the stage of challenge is set. + // this.proto.updateOpenChallenges(); + + // for (const subproofName of this.subproofs) { + // const subproof = this.subproofs.get(subproofName); + // proto.setSubproof(subproofName, subproof.aggregate); + // let airId = 0; + // for (const airName of subproof.airs) { + // console.log(`SUBPROOF(${subproofName},${airName})`); + // const air = subproof.airs.get(airName); + // const bits = log2(Number(air.rows)); + // proto.setAir(airName, air.rows); + // proto.setFixedCols(air.fixeds); + // proto.setWitnessCols(air.witness); + // // expression: constraint, hint, operand (expression) + // let packed = new PackedExpressions(); + // // this.expressions.pack(packed); + // air.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); + // proto.setConstraints(air.constraints, packed, + // { labelsByType: { + // witness: air.witness.labelRanges, + // fixed: air.fixeds.labelRanges }, + // expressions: air.expressions + // }); + // proto.setSymbolsFromLabels(air.witness.labelRanges, 'witness', {airId, subproofId}); + // proto.setSymbolsFromLabels(air.fixeds.labelRanges, 'fixed', {airId, subproofId}); + // proto.setExpressions(packed); + // proto.addHints(air.hints, packed, { + // subproofId, + // airId + // }); + // ++airId; + // } + // ++subproofId; + // } let packed = new PackedExpressions(); - // this.expressions.pack(packed); this.globalExpressions.pack(packed); - proto.setGlobalConstraints(this.globalConstraints, packed); - proto.setGlobalExpressions(packed); - proto.setGlobalSymbols(this.references); - proto.encode(); - proto.saveToFile('tmp/pilout.ptb'); + this.proto.setGlobalConstraints(this.globalConstraints, packed); + this.proto.setGlobalExpressions(packed); + this.proto.setGlobalSymbols(this.references); + this.proto.encode(); + this.proto.saveToFile('tmp/pilout.ptb'); // stageWidths // expressions @@ -660,14 +667,17 @@ module.exports = class Processor { this.currentSubproof = subproof; this.scope.pushInstanceType('subproof'); this.context.subproofName = subproofName; + // proto.setSubproofvalues(this.subproofvalues.getPropertyValues(['id', 'aggregateType', 'subproofId'])); + const subproofId = this.proto.setSubproof(subproofName, subproof.aggregate); for (const airRows of subproof.rows) { + console.log(`BEGIN AIR ${subproofName} (${airRows})`); // #${this.airId}`); this.rows = airRows; - console.log(`BEGIN AIR ${subproofName} (${airRows}) #${this.airId}`); // TODO: context is global? const air = new Air(this.Fr, this.context, airRows); const airName = subproofName + (subproof.rows.length > 1 ? `_${air.bits}`:''); + const airId = this.proto.setAir(airName, airRows); Context.airName = airName; subproof.airs.define(airName, air); @@ -695,13 +705,35 @@ module.exports = class Processor { } this.finalAirScope(); subproof.airEnd(); - air.witness = this.witness.clone(); - air.fixeds = this.fixeds.clone(); - air.expressions = this.expressions.clone(); - air.constraints = this.constraints.clone(); - air.constraints.expressions = air.expressions; - air.hints = this.hints.clone(); - air.hints.expressions = air.expressions; + + // pilout generation + // setting id of proofitems used, be carefull with challenge (stage not defined) + + // const subproof = this.subproofs.get(subproofName); + // proto.setSubproof(subproofName, subproof.aggregate); + let packed = new PackedExpressions(); + this.proto.setFixedCols(this.fixeds); + this.proto.setWitnessCols(this.witness); + // this.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); + this.expressions.pack(packed, {instances: [this.fixeds, this.witness]}); + this.proto.setConstraints(this.constraints, packed, + { + labelsByType: { + witness: this.witness.labelRanges, + fixed: this.fixeds.labelRanges, + subproofvalue: (id, options) => this.subproofvalues.getRelativeLabel(subproofId, id, options) + }, + expressions: this.expressions + }); + this.proto.setSymbolsFromLabels(this.witness.labelRanges, 'witness', {airId, subproofId}); + this.proto.setSymbolsFromLabels(this.fixeds.labelRanges, 'fixed', {airId, subproofId}); + this.proto.setExpressions(packed); + this.proto.addHints(this.hints, packed, { + subproofId, + airId + }); + + // clearing air scope this.clearAirScope(airName); this.constraints = new Constraints(this.Fr, this.expressions); this.scope.popInstanceType(['witness', 'fixed', 'im']); @@ -711,6 +743,7 @@ module.exports = class Processor { ++this.airId; } this.finalSubproofScope(); + this.proto.setSubproofValues(this.subproofvalues.getAggreationTypesBySubproofId(subproofId)); this.scope.popInstanceType(); this.currentSubproof = false; Context.subproofName = false; diff --git a/src/proto_out.js b/src/proto_out.js index f12b9e9..612b2b9 100644 --- a/src/proto_out.js +++ b/src/proto_out.js @@ -133,6 +133,7 @@ module.exports = class ProtoOut { encode() { console.log(['PROTO.CHALLENGES', this.pilOut.numChallenges]); + fs.writeFileSync('tmp/pilout.pre.log', util.inspect(this.pilOut, false, null, false)); let message = this.PilOut.fromObject(this.pilOut); fs.writeFileSync('tmp/pilout.log', util.inspect(this.pilOut, false, null, false)); this.data = this.PilOut.encode(message).finish(); @@ -142,14 +143,20 @@ module.exports = class ProtoOut { fs.writeFileSync(filename, this.data); } setAir(name, rows) { + const airId = this.currentSubproof.airs.length; this.currentAir = {name, numRows: Number(rows)}; this.currentSubproof.airs.push(this.currentAir); + return airId; } setSubproof(name, aggregable = false) { // TODO: Add subproof value this.currentSubproof = {name, aggregable, airs: []}; const subproofId = this.pilOut.subproofs.length; this.pilOut.subproofs.push(this.currentSubproof); - this.currentSubproof.subproofvalues = this.spvId2Proto.filter(value => value[2] === subproofId).map(value => { return {aggType: SPV_AGGREGATIONS.indexOf(value[1])}}); + return subproofId; + } + setSubproofValues(aggregations) { + // this.currentSubproof.subproofvalues = this.spvId2Proto.filter(value => value[2] === subproofId).map(value => { return {aggType: SPV_AGGREGATIONS.indexOf(value[1])}}); + this.currentSubproof.subproofvalues = aggregations.map(aggregation => { return {aggType: SPV_AGGREGATIONS.indexOf(aggregation)}}); } // use for all subproof values, of all subproofs @@ -182,7 +189,7 @@ module.exports = class ProtoOut { _setSymbols(symbols, data = {}) { for(const [name, ref] of symbols) { const arrayInfo = ref.array ? ref.array : {dim: 0, lengths: []}; - const sym2proto = this.symbolType2Proto(ref.type, ref.locator); + const sym2proto = this.symbolType2Proto(ref.type, ref.locator, ref); let payout = { name, dim: arrayInfo.dim, @@ -195,7 +202,7 @@ module.exports = class ProtoOut { } } - symbolType2Proto(type, id) { + symbolType2Proto(type, id, ref) { switch(type) { case 'im': return {type: REF_TYPE_IM_COL, id}; @@ -211,8 +218,8 @@ module.exports = class ProtoOut { return {type: REF_TYPE_WITNESS_COL, id: protoId, stage}; } case 'subproofvalue': { - const [protoId, aggregation, subproofId] = this.spvId2Proto[id]; - return {type: REF_TYPE_SUBPROOF_VALUE, id: protoId, subproofId}; + const def = ref.instance.get(id); + return {type: REF_TYPE_SUBPROOF_VALUE, id: def.relativeId, subproofId: ref.data.subproofId}; } case 'proofvalue': return {type: REF_TYPE_PROOF_VALUE, id}; @@ -369,27 +376,19 @@ module.exports = class ProtoOut { ope.witnessCol.stage = stage; } break; - case 'subproofValue': { - // translate index of subproof because it's relative to subproof - const id = ope.subproofValue.idx; - const [protoId, aggregation, subproofId] = this.spvId2Proto[id] ?? [false,false,false]; - if (protoId === false) { - console.log(ope); - throw new Error(`Translate: Found invalid subproofvalue ${id}`); - } - ope.subproofValue.idx = protoId; - ope.subproofValue.subproofId = subproofId; - } + case 'subproofValue': + // subproof no need translate idx because put index from begining + // ope.subproofValue.aggType = SPV_AGGREGATIONS.indexOf(ope.subproofValue.aggType) break; case 'challenge': { - const id = ope.challenge.idx; + /* const id = ope.challenge.idx; const [protoId, stage] = this.challengeId2Proto[id] ?? [false, false]; if (protoId === false) { console.log(ope); throw new Error(`Translate: Found invalid subproofvalue ${id}`); } ope.challenge.idx = protoId; - ope.challenge.stage = stage; + ope.challenge.stage = stage;*/ } break; case 'constant': @@ -411,7 +410,7 @@ module.exports = class ProtoOut { for (const [index, constraint] of constraints.keyValues()) { const packedExpressionId = constraints.getPackedExpressionId(constraint.exprId, packed); let payload = { expressionIdx: { idx: packedExpressionId }, - debugLine: constraints.getDebugInfo(index, packed) }; + debugLine: '###'+constraints.getDebugInfo(index, packed) }; this.pilOut.constraints.push(payload); } } @@ -421,6 +420,7 @@ module.exports = class ProtoOut { let payload; console.log([index, constraint]); const debugLine = constraints.getDebugInfo(index, packed, options); + console.log(`DEBUGLINE: ${debugLine}`); const packedExpressionId = constraints.getPackedExpressionId(constraint.exprId, packed, options); switch (constraint.boundery) { case false: @@ -470,8 +470,11 @@ module.exports = class ProtoOut { const path = options.path ?? ''; // check if an alone expression to use and translate its single operand if (hdata && typeof hdata.pack === 'function') { + console.log('HINT', typeof hdata.toString() ? hdata.constructor.name + ' ==> ' + hdata.toString() : hdata); const operand = hdata.pack(options.packed, options); + console.log('HINT', operand); this.translate(operand); + console.log('HINT', operand); return { operand }; } if (typeof hdata === 'object' && hdata.constructor.name === 'ExpressionId') { @@ -487,6 +490,7 @@ module.exports = class ProtoOut { for (let index = 0; index < hdata.length; ++index) { result.push(this.toHintField(hdata[index], {...options, path: path + '[' + index + ']'})); } + console.log('HINT',result); return { hintFieldArray: { hintFields: Array.isArray(result) ? result : [result] }}; } if (typeof hdata === 'bigint' || typeof hdata === 'number') { @@ -501,6 +505,7 @@ module.exports = class ProtoOut { const value = this.toHintField(hdata[name], {...options, path: path + '.' + name}); result.push({...value, name}); } + console.log('HINT',result); return { hintFieldArray: { hintFields: Array.isArray(result) ? result : [result] }}; } console.log(hdata); diff --git a/src/references.js b/src/references.js index aee14f8..6596e91 100644 --- a/src/references.js +++ b/src/references.js @@ -15,10 +15,11 @@ module.exports = class References { this.visibilityStack = []; this.containers = new Containers(this); } - getDefinitionByItem(item, options) { + getDefinitionByItem(item, options = {}) { let instance = null; const instances = [...(options.instances ?? []), ...Object.values(this.types).map(x => x.instance)]; for (const _instance of instances) { + console.log(_instance); if (_instance.expressionItemClass === item.constructor) { instance = _instance; break; diff --git a/src/subproof_values.js b/src/subproof_values.js new file mode 100644 index 0000000..37a2f9d --- /dev/null +++ b/src/subproof_values.js @@ -0,0 +1,24 @@ +const Indexable = require("./indexable.js"); +const SubproofvalItem = require("./expression_items/subproofval.js"); +const SubproofvalDefinition = require("./definition_items/subproofval.js"); +module.exports = class SubproofValues extends Indexable { + + constructor () { + super('subproofvalue', SubproofvalDefinition, SubproofvalItem) + } + getRelativeLabel(subproofId, id, options) { + // TODO: arrays + const value = this.values.find(x => x.relativeId == id && x.subproofId == subproofId); + + return value ? value.label : `subproofvalue(${subproofId},${id})`; + } + getEmptyValue(id, options) { + const subproofId = options.subproofId; + const relativeId = this.values.reduce((res, spv) => spv.subproofId === subproofId ? res + 1 : res, 0); + let definition = super.getEmptyValue(id, {relativeId, ...options}); + return definition; + } + getAggreationTypesBySubproofId(subproofId) { + return this.values.filter(x => x.subproofId == subproofId).map(x => x.aggregateType); + } +} diff --git a/src/subproofs.js b/src/subproofs.js index 48d70d8..a966b8c 100644 --- a/src/subproofs.js +++ b/src/subproofs.js @@ -4,4 +4,12 @@ module.exports = class Subproofs extends Definitions { constructor () { super(); } + getEmptyValue(id, options) { + const subproofId = options.subproofId; + const relativeId = this.values.reduce((res, spv) => spv.subproofId === subproofId ? res + 1 : res, 0); + console.log(relativeId); + EXIT_HERE; + let definition = super.getEmptyValue(id, {relativeId, ...options}); + return definition; + } } From be0d73f7e8f2d49b5f5740795c6242ef9ae1b994 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 4 Jan 2024 09:51:59 +0100 Subject: [PATCH 25/33] WIP - translating etrog to pil2 --- src/expression_factory.js | 6 + test/pil2/zkevm-etrog/arith.pil | 4448 +++++++++++++++++++ test/pil2/zkevm-etrog/binary.pil | 130 + test/pil2/zkevm-etrog/binary_ops_table.pil | 85 + test/pil2/zkevm-etrog/bits2field.pil | 13 + test/pil2/zkevm-etrog/bits2field_sha256.pil | 13 + test/pil2/zkevm-etrog/climb_key.pil | 98 + test/pil2/zkevm-etrog/climb_key_table.pil | 12 + test/pil2/zkevm-etrog/config.pil | 1 + test/pil2/zkevm-etrog/global.pil | 23 + test/pil2/zkevm-etrog/keccakf.pil | 21 + test/pil2/zkevm-etrog/main.pil | 1005 +++++ test/pil2/zkevm-etrog/mem.pil | 57 + test/pil2/zkevm-etrog/mem_align.pil | 163 + test/pil2/zkevm-etrog/padding_kk.pil | 153 + test/pil2/zkevm-etrog/padding_kkbit.pil | 131 + test/pil2/zkevm-etrog/padding_pg.pil | 181 + test/pil2/zkevm-etrog/padding_sha256.pil | 167 + test/pil2/zkevm-etrog/padding_sha256bit.pil | 139 + test/pil2/zkevm-etrog/poseidong.pil | 120 + test/pil2/zkevm-etrog/rom.pil | 43 + test/pil2/zkevm-etrog/sha256f.pil | 27 + test/pil2/zkevm-etrog/storage.pil | 202 + test/pil2/zkevm-etrog/storage_rom.pil | 13 + 24 files changed, 7251 insertions(+) create mode 100644 test/pil2/zkevm-etrog/arith.pil create mode 100644 test/pil2/zkevm-etrog/binary.pil create mode 100644 test/pil2/zkevm-etrog/binary_ops_table.pil create mode 100644 test/pil2/zkevm-etrog/bits2field.pil create mode 100644 test/pil2/zkevm-etrog/bits2field_sha256.pil create mode 100644 test/pil2/zkevm-etrog/climb_key.pil create mode 100644 test/pil2/zkevm-etrog/climb_key_table.pil create mode 100644 test/pil2/zkevm-etrog/config.pil create mode 100644 test/pil2/zkevm-etrog/global.pil create mode 100644 test/pil2/zkevm-etrog/keccakf.pil create mode 100644 test/pil2/zkevm-etrog/main.pil create mode 100644 test/pil2/zkevm-etrog/mem.pil create mode 100644 test/pil2/zkevm-etrog/mem_align.pil create mode 100644 test/pil2/zkevm-etrog/padding_kk.pil create mode 100644 test/pil2/zkevm-etrog/padding_kkbit.pil create mode 100644 test/pil2/zkevm-etrog/padding_pg.pil create mode 100644 test/pil2/zkevm-etrog/padding_sha256.pil create mode 100644 test/pil2/zkevm-etrog/padding_sha256bit.pil create mode 100644 test/pil2/zkevm-etrog/poseidong.pil create mode 100644 test/pil2/zkevm-etrog/rom.pil create mode 100644 test/pil2/zkevm-etrog/sha256f.pil create mode 100644 test/pil2/zkevm-etrog/storage.pil create mode 100644 test/pil2/zkevm-etrog/storage_rom.pil diff --git a/src/expression_factory.js b/src/expression_factory.js index 33fec26..7342cbc 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -61,6 +61,12 @@ module.exports = class ExpressionFactory { delete obj.values; return elist; } + static fromAppend(obj) { + console.log('TODO !!! '); + let res = this.fromObject(obj.value); + delete obj.value; + return res; + } static fromReference(obj) { // if (obj.rowOffset) { // console.log('ROWOFFSET.FROMREFERENCE'); diff --git a/test/pil2/zkevm-etrog/arith.pil b/test/pil2/zkevm-etrog/arith.pil new file mode 100644 index 0000000..437a439 --- /dev/null +++ b/test/pil2/zkevm-etrog/arith.pil @@ -0,0 +1,4448 @@ + +/* + Equations: + + EQ0: A(x1) * B(y1) + C(x2) = D (y2) * 2 ** 256 + op (y3) - selEq[0] + + EQ1: s * x2 - s * x1 - y2 + y1 + (q0 * p1) lambda - ADD - selEq[1] + EQ2: 2 * s * y1 - 3 * x1 * x1 + (q0 * p1) lambda - DBL - selEq[2] + EQ3: s * s - x1 - x2 - x3 + (q1 * p1) x3 - selEq[3] + EQ4: s * x1 - s * x3 - y1 - y3 + (q2 * p1) y3 - selEq[3] + + EQ5: x1 * x2 - y1 * y2 - x3 + (q1 * p2) - selEq[4] + EQ6: y1 * x2 + x1 * y2 - y3 + (q2 * p2) - selEq[4] + + EQ7: x1 + x2 - x3 + (q1 * p2) - selEq[5] + EQ8: y1 + y2 - y3 + (q2 * p2) - selEq[5] + + EQ9: x1 - x2 - x3 + (q1 * p2) - selEq[6] + EQ10: y1 - y2 - y3 + (q2 * p2) - selEq[6] + + where p1 refers to the base field order of: + · Secp256k1: 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE FFFF FC2F + and p2 refers to the base field order of: + · BN254: 0x3064 4E72 E131 A029 B850 45B6 8181 585D 9781 6A91 6871 CA8D 3C20 8C16 D87C FD47 +*/ +include "global.pil"; + +namespace Arith(%N); + + pol constant BYTE2_BIT19; + pol constant SEL_BYTE2_BIT19; + pol constant GL_SIGNED_22BITS; + + pol commit x1[16]; + pol commit y1[16]; + pol commit x2[16]; + pol commit y2[16]; + pol commit x3[16]; + pol commit y3[16]; + + pol commit s[16]; + pol commit q0[16]; + pol commit q1[16]; + pol commit q2[16]; + + pol commit resultEq0; + pol commit resultEq1; + pol commit resultEq2; + + resultEq0 * (1 - resultEq0) = 0; + resultEq1 * (1 - resultEq1) = 0; + resultEq2 * (1 - resultEq2) = 0; + + // FEATURE: + // · Verify that the x1,x2 are different when adding different elliptic curve points (EQ1,EQ3,EQ4). + + // PRE: + // · x1,x2,y1,y2 are alias free for EQ[1..10] + + // In the first 16 clocks of 32-clock cycle we have: x2[0]-x1[0], x2[1]-x1[1], ..., x2[15]-x1[15] + // In the last 16 clocks of 32-clock cycle we set all values to 0. + pol xDeltaChunk = x2[0]*Global.CLK32[0] + x2[1]*Global.CLK32[1] + x2[2]*Global.CLK32[2] + x2[3]*Global.CLK32[3] + x2[4]*Global.CLK32[4] + x2[5]*Global.CLK32[5] + x2[6]*Global.CLK32[6] + x2[7]*Global.CLK32[7] + + x2[8]*Global.CLK32[8] + x2[9]*Global.CLK32[9] + x2[10]*Global.CLK32[10] + x2[11]*Global.CLK32[11] + x2[12]*Global.CLK32[12] + x2[13]*Global.CLK32[13] + x2[14]*Global.CLK32[14] + x2[15]*Global.CLK32[15] + - x1[0]*Global.CLK32[0] - x1[1]*Global.CLK32[1] - x1[2]*Global.CLK32[2] - x1[3]*Global.CLK32[3] - x1[4]*Global.CLK32[4] - x1[5]*Global.CLK32[5] - x1[6]*Global.CLK32[6] - x1[7]*Global.CLK32[7] + - x1[8]*Global.CLK32[8] - x1[9]*Global.CLK32[9] - x1[10]*Global.CLK32[10] - x1[11]*Global.CLK32[11] - x1[12]*Global.CLK32[12] - x1[13]*Global.CLK32[13] - x1[14]*Global.CLK32[14] - x1[15]*Global.CLK32[15]; + + // Inverse of current xDeltaChunk. Used to verify that xDeltaChunk is ≠ 0, i.e., when x1[i] ≠ x2[i]. + // This inverse only needs to be calculated one time by cycle. + pol commit xDeltaChunkInverse; + + // Intermediate pol to indicate that x1 is different from x2 in the current chunk. + // IMPORTANT: xChunkDifferent == 1 ==> x1[i] ≠ x2[i] + // xChunkDifferent == 0 does not imply anything, x1[i] ≠ x2[i] or x1[i] == x2[i]. + // xChunkDifferent was binary, only when xDeltaChunkInverse === inv(xDeltaChunk), its value is 1. + pol xChunkDifferent = xDeltaChunk * xDeltaChunkInverse; + + // Important, binary constraint + xChunkDifferent * (1 - xChunkDifferent) = 0; + + // xDeltaChunk xDeltaChunkInverse xChunkDifferent + // ----------- ------------------ ----------------------- + // 0 any 0 * any = 0 OK (A) + // x (≠ 0) 0 x * 0 = 0 OK (B) + // x (≠ 0) inv(x) x * inv(x) = 1 OK (C) + // x (≠ 0) y ≠ {inv(x),0} x * y = k (≠ 0,1) FAILS (D) + // + // (A) and (C) are the standard cases, but (B) was introduced to avoid calculate the inverse when + // it is not necessary. xChunkDifferent is well calculed because it's 1 only when x ≠ 0 and inverse + // it's calculated. + + // xAreDifferent is used to indicate that in current clock we knows that x1 and x2 are different + pol commit xAreDifferent; + + // Binary constraint + xAreDifferent * (1 - xAreDifferent) = 0; + + // In first clock of 16-clock cycle, xAreDifferent should not be considered + // Constraint to force next value of xAreDifferent + + xAreDifferent' = xAreDifferent * (1 - Global.CLK32[0] - Global.CLK32[16]) + xChunkDifferent; + + // xAreDifferent CLK0+CLK16 xChunkDifferent xAreDifferent' + // ------------- ---------- --------------- -------------- + // 0 0 0 0 OK + // 0 0 1 1 OK + // 0 1 0 1 OK + // 0 1 1 1 OK + // 1 0 0 1 OK + // 1 0 1 2 FAILS (A) + // 1 1 0 1 OK + // 1 1 1 1 OK + // + // xChunkDifferent = 0 ==> (x2[i] - x1[i]) = 0 + // xChunkDifferent = 1 ==> (x2[i] - x1[i]) ≠ 0 ==> x1 and x2 are different + // (A) forbidden, executor must control this situation, because expending an + // unnecessary inverse. + + (xAreDifferent - selEq[1]) * Global.CLK32[16] = 0; + + // COST: 2 commit, 2 im, 0 constant, 4 constraints + + + // FEATURE: + // + // Verify that the result of Secp256k1 addition (EQ1/EQ2,EQ3,EQ4) is free of aliases, i.e. that x3,y3 ∊ [0, p-1] + // Verify that the result of 𝔽p² = 𝔽p[u]/(u² + 1) multiplication, addition and subtraction (EQ5,EQ6 || EQ7,EQ8 || EQ9,EQ10) + // is free of aliases, i.e. that x3,y3 ∊ [0, p-1] + // + // Here, p refers, respectively, to the base field order of any of the following elliptic curves: + // + // Secp256k1: 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE FFFF FC2F + // BN254: 0x3064 4E72 E131 A029 B850 45B6 8181 585D 9781 6A91 6871 CA8D 3C20 8C16 D87C FD47 + // + // Strategy: Compare from the most significant chunk to the least significant chunk of x3 and y3 (A). On each chunk, + // chunkLtPrime indicates whether the chunk is smaller than the FPEC chunk. valueLtPrime indicates if any + // previous chunk was smaller than the FPEC chunk, which implies that x3 and y3 are smaller than prime. + // + // (A) In the first 16 clocks of 32-clock cycle, it is verified that x3 ∊ [0, p-1] + // In the last 16 clocks of 32-clock cycle, it is verified that y3 ∊ [0, p-1] + // + // k x chunks equals (B) ==> 1 x chunk lower ==> (15 - k) x any 16 bits value + // + // (B) I must verify that the chunks are equal or smaller, never greater at this point. If a malicious prover (MP) + // claims they are equal when they are actually smaller, that's its issue. At the end, there must be at least one + // smaller chunk to ensure a smaller value. + // + // k x chunks = chunkPrime ==> 1 x chunk ∊ [0, chunkPrime-1] ==> (15 - k) x chunk ∊ [0, 0xFFFF] + // + // CLK0 CLK1 CLK2 CLK3 CLK4 CLK5 CLK6 CLK7 CLK8 CLK9 CLK10 CLK11 CLK12 CLK13 CLK14 CLK15 + // chunkPrime(0..15) = [0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFF, 0xFC2F] + // chunkPrime(0..15) - 1 = [0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFD, 0xFFFE, 0xFC2E] + // chunkPrime(0..15) = [0x3064, 0x4e72, 0xe131, 0xa029, 0xb850, 0x45b6, 0x8181, 0x585d, 0x9781, 0x6a91, 0x6871, 0xca8d, 0x3c20, 0x8c16, 0xd87c, 0xfd47] + // chunkPrime(0..15) - 1 = [0x3063, 0x4e71, 0xe130, 0xa028, 0xb84f, 0x45b5, 0x8180, 0x585c, 0x9780, 0x6a90, 0x6870, 0xca8c, 0x3c1f, 0x8c15, 0xd87b, 0xfd46] + // + // different Secp256k1 prime chunks [0xFFFF, 0xFFFE, 0xFFFD, 0xFC2F, 0xFC2E] + // different BN254 prime chunks [0x3064, 0x4e72, 0xe131, 0xa029, 0xb850, 0x45b6, 0x8181, 0x585d, 0x9781, 0x6a91, 0x6871, 0xca8d, 0x3c20, 0x8c16, 0xd87c, 0xfd47, + // 0x3063, 0x4e71, 0xe130, 0xa028, 0xb84f, 0x45b5, 0x8180, 0x585c, 0x9780, 0x6a90, 0x6870, 0xca8c, 0x3c1f, 0x8c15, 0xd87b, 0xfd46] + + // CLK0 CLK1 CLK2 CLK3 CLK4 CLK5 CLK6 CLK7 CLK8 CLK9 CLK10 CLK11 CLK12 CLK13 CLK14 CLK15 + // Secp256k1: 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF fffe FFFF fc2f + // BN254: 0x3064 4e72 e131 a029 b850 45b6 8181 585d 9781 6a91 6871 ca8d 3c20 8c16 d87c fd47 + // + // RANGE_SEL P_RANGE BASE + // / 0 [0,0xFFFF] CLK0, ..., CLK12, CLK14 + // | 1 [0,0xFFFE] CLK13 + // Secp256k1 | 2 [0,0xFFFD] + // | 3 [0,0xFC2F] CLK15 + // \ 4 [0,0xFC2E] + // / 5 [0,0x3064] CLK0 + // | 6 [0,0x3063] + // | 7 [0,0x4e72] CLK1 + // | 8 [0,0x4e71] + // | 9 [0,0xe131] CLK2 + // | 10 [0,0xe130] + // | 11 [0,0xa029] CLK3 + // | 12 [0,0xa028] + // | 13 [0,0xb850] CLK4 + // | 14 [0,0xb84f] + // | 15 [0,0x45b6] CLK5 + // | 16 [0,0x45b5] + // | 17 [0,0x8181] CLK6 + // | 18 [0,0x8180] + // | 19 [0,0x585d] CLK7 + // BN254 | 20 [0,0x585c] + // | 21 [0,0x9781] CLK8 + // | 22 [0,0x9780] + // | 23 [0,0x6a91] CLK9 + // | 24 [0,0x6a90] + // | 25 [0,0x6871] CLK10 + // | 26 [0,0x6870] + // | 27 [0,0xca8d] CLK11 + // | 28 [0,0xca8c] + // | 29 [0,0x3c20] CLK12 + // | 30 [0,0x3c1f] + // | 31 [0,0x8c16] CLK13 + // | 32 [0,0x8c15] + // | 33 [0,0xd87c] CLK14 + // | 34 [0,0xd87b] + // | 35 [0,0xfd47] CLK15 + // \ 36 [0,0xfd46] + // + // pRangeSecp256k1 = (CLK13 + 3 * CLK15 + chunkLtPrime) * selEq[3] + // pRangeBN254 = (5 * CLK0 + 7 * CLK1 + 9 * CLK2 + 11 * CLK3 + 13 * CLK4 + 15 * CLK5 + 17 * CLK6 + 19 * CLK7 + 21 * CLK8 + 23 * CLK9 + 25 * CLK10 + 27 * CLK11 + 29 * CLK12 + 31 * CLK13 + 33 * CLK14 + 35 * CLK15) * (selEq[4] + selEq[5] + selEq[6]) + // pRange = (pRangeSecp256k1 + pRangeBN254) * (1 - valueLtPrime) + // + // CLK pRange pRange + // [selEq[3] = 1, chunkLtPrime = 0] [selEq[3] = 1, chunkLtPrime = 1] + // + // + // 0 0 + 3 * 0 + 0 = 0 0 + 3 * 0 + 1 = 1 + // : : : + // 12 0 + 3 * 0 + 0 = 0 0 + 3 * 0 + 1 = 1 + // 13 1 + 3 * 0 + 0 = 1 1 + 3 * 0 + 1 = 2 + // 14 0 + 3 * 0 + 0 = 0 0 + 3 * 0 + 1 = 1 + // 15 0 + 3 * 1 + 0 = 3 0 + 3 * 1 + 1 = 4 + // + // valueLtPrime' = valueLtPrime * (1 - CLK0 - CLK16) + chunkLtPrime + // + // valueLtPrime chunkLtPrime CLK0+CLK16 valueLtPrime' + // + // 0 0 0 0 OK + // 0 1 0 1 OK + // 1 0 0 1 OK + // 1 1 0 2 FAILS, valueLtPrime not binary (D) + // + // 0 0 1 0 OK + // 0 1 1 1 OK + // 1 0 1 0 OK + // 1 1 1 1 OK (E) + // + // (D) when valueLtPrime = 0 ==> chunkLtPrime must be zero, if not it FAILS + // (E) on clocks 0 and 16, current value of valueLtPrime isn't considered + // + // + // Examples (Secp256k1 prime): + // ┌──────── pRange + // ┌── max_value │ ┌───── chunkLtPrime + // │ ┌─ example │ │ ┌── valueLtPrime + // │ │ │ │ │ + // CLK0 0xFFFF 0xFFFF 0 0 0 + // CLK1 0xFFFF 0xFF00 1 1 0 // RANGE [0, 0xFFFE] + // CLK2 0xFFFF 0x0000 0 0 1 + // CLK3 0xFFFF 0x0000 0 0 1 + // CLK4 0xFFFF 0xFFFF 0 0 1 + // : + // CLK15 0xFC2F 0xFFFF 0 0 1 + // CLK16 0xFFFF 0xFFFF 0 0 1 + // + // + // ┌──────── pRange + // ┌── max_value │ ┌───── chunkLtPrime + // │ ┌─ example │ │ ┌── valueLtPrime + // │ │ │ │ │ + // CLK0 0xFFFF 0xFFFF 0 0 0 + // CLK1 0xFFFF 0xFFFF 0 0 0 + // CLK2 0xFFFF 0xFFFF 0 0 0 + // : + // CLK12 0xFFFF 0xFFFF 0 0 0 + // CLK13 0xFFFE 0xFFFF 1 0 0 // CLK13 == 1 RANGE [0, 0xFFFE] + // CLK14 0xFFFF 0xFFFF 0 0 0 + // CLK15 0xFC2F 0xFC00 4 1 0 // CLK15 == 1 RANGE [0, 0xFC2F] + // CLK16 0xFFFF 0xFFFF 0 0 1 + + // valueLtPrime indicates whether, at this point, we know that the value is smaller than the prime. + // If selEq[3],selEq[4],selEq[5],selEq[6] = 0, it must be 0. + pol commit valueLtPrime; + + // chunkLtPrime indicates whether the current value chunk is smaller than the prime chunk. + // If selEq[3],selEq[4],selEq[5],selEq[6] = 0 or valueLtPrime = 1, it must be 0. + pol commit chunkLtPrime; + + // binary constraints + chunkLtPrime * (1 - chunkLtPrime) = 0; + valueLtPrime * (1 - valueLtPrime) = 0; + + // This constraint applies to the next value of valueLtPrime. At the beginning of each 16-clock cycle, + // valueLtPrime is ignored because it refers to the previous value. + valueLtPrime' = valueLtPrime * (1 - Global.CLK32[0] - Global.CLK32[16]) + chunkLtPrime; + + // This constraint is used to verify (and to enforce) that at the end of a 16-clock cycle, valueLtPrime is equal to 1. + // This constraint is applied when one of selEq[3],selEq[4],selEq[5],selEq[6] equals 1. + (valueLtPrime' - selEq[3] - selEq[4] - selEq[5] - selEq[6]) * (Global.CLK32[15] + Global.CLK32[31]) = 0; + + pol constant RANGE_SEL; // 0:2**16, + // 1:2**16-1,0 + // 2:2**16-2,0:2 + // 3:2**16-976,0:976 + // 4:2**16-977,0:977 + // ----------------------------------------------------------------------- + // 5:2**16-53147,0:53147 16:2**16-47688,0:47688 27:2**16-13682,0:13682 + // 6:2**16-53146,0:53146 17:2**16-32382,0:32382 28:2**16-13681,0:13681 + // 7:2**16-45453,0:45453 18:2**16-32381,0:32381 29:2**16-50143,0:50143 + // 8:2**16-45452,0:45452 19:2**16-42914,0:42914 30:2**16-50142,0:50142 + // 9:2**16-7886,0:7886 20:2**16-42913,0:42913 31:2**16-29673,0:29673 + // 10:2**16-7885,0:7885 21:2**16-26750,0:26750 32:2**16-29672,0:29672 + // 11:2**16-24534,0:24534 22:2**16-26749,0:26749 33:2**16-10115,0:10115 + // 12:2**16-24533,0:24533 23:2**16-38254,0:38254 34:2**16-10114,0:10114 + // 13:2**16-18351,0:18351 24:2**16-38253,0:38253 35:2**16-696,0:696 + // 14:2**16-18350,0:18350 25:2**16-38798,0:38798 36:2**16-695,0:695 + // 15:2**16-47689,0:47689 26:2**16-38797,0:38797 + + // range to be looked up for each chunk and for each prime + pol pRangeSecp256k1 = (Global.CLK32[13] + Global.CLK32[29] + 3 * (Global.CLK32[15] + Global.CLK32[31]) + chunkLtPrime) * selEq[3]; + pol pRangeBN254 = (5 * (Global.CLK32[0] + Global.CLK32[16]) + 7 * (Global.CLK32[1] + Global.CLK32[17]) + 9 * (Global.CLK32[2] + Global.CLK32[18]) + + 11 * (Global.CLK32[3] + Global.CLK32[19]) + 13 * (Global.CLK32[4] + Global.CLK32[20]) + 15 * (Global.CLK32[5] + Global.CLK32[21]) + + 17 * (Global.CLK32[6] + Global.CLK32[22]) + 19 * (Global.CLK32[7] + Global.CLK32[23]) + 21 * (Global.CLK32[8] + Global.CLK32[24]) + + 23 * (Global.CLK32[9] + Global.CLK32[25]) + 25 * (Global.CLK32[10] + Global.CLK32[26]) + 27 * (Global.CLK32[11] + Global.CLK32[27]) + + 29 * (Global.CLK32[12] + Global.CLK32[28]) + 31 * (Global.CLK32[13] + Global.CLK32[29]) + 33 * (Global.CLK32[14] + Global.CLK32[30]) + + 35 * (Global.CLK32[15] + Global.CLK32[31]) + chunkLtPrime) * (selEq[4] + selEq[5] + selEq[6]); + + // lookup with RANGE_SEL as first column and BYTE2 as second column + {(pRangeSecp256k1 + pRangeBN254) * (1 - valueLtPrime), x3[15]*Global.CLK32[0] + x3[14]*Global.CLK32[1] + x3[13]*Global.CLK32[2] + x3[12]*Global.CLK32[3] + x3[11]*Global.CLK32[4] + x3[10]*Global.CLK32[5] + x3[9]*Global.CLK32[6] + x3[8]*Global.CLK32[7] + + x3[7]*Global.CLK32[8] + x3[6]*Global.CLK32[9] + x3[5]*Global.CLK32[10] + x3[4]*Global.CLK32[11] + x3[3]*Global.CLK32[12] + x3[2]*Global.CLK32[13] + x3[1]*Global.CLK32[14] + x3[0]*Global.CLK32[15] + + y3[15]*Global.CLK32[16] + y3[14]*Global.CLK32[17] + y3[13]*Global.CLK32[18] + y3[12]*Global.CLK32[19] + y3[11]*Global.CLK32[20] + y3[10]*Global.CLK32[21] + y3[9]*Global.CLK32[22] + y3[8]*Global.CLK32[23] + + y3[7]*Global.CLK32[24] + y3[6]*Global.CLK32[25] + y3[5]*Global.CLK32[26] + y3[4]*Global.CLK32[27] + y3[3]*Global.CLK32[28] + y3[2]*Global.CLK32[29] + y3[1]*Global.CLK32[30] + y3[0]*Global.CLK32[31]} in {RANGE_SEL, Global.BYTE2}; + + /**** + * + * LATCH POLS: x1,y1,x2,y2,x3,y3,s,q0,q1,q2 + * + *****/ + + x1[0]' * (1-Global.CLK32[31]) = x1[0] * (1-Global.CLK32[31]); + x1[1]' * (1-Global.CLK32[31]) = x1[1] * (1-Global.CLK32[31]); + x1[2]' * (1-Global.CLK32[31]) = x1[2] * (1-Global.CLK32[31]); + x1[3]' * (1-Global.CLK32[31]) = x1[3] * (1-Global.CLK32[31]); + x1[4]' * (1-Global.CLK32[31]) = x1[4] * (1-Global.CLK32[31]); + x1[5]' * (1-Global.CLK32[31]) = x1[5] * (1-Global.CLK32[31]); + x1[6]' * (1-Global.CLK32[31]) = x1[6] * (1-Global.CLK32[31]); + x1[7]' * (1-Global.CLK32[31]) = x1[7] * (1-Global.CLK32[31]); + x1[8]' * (1-Global.CLK32[31]) = x1[8] * (1-Global.CLK32[31]); + x1[9]' * (1-Global.CLK32[31]) = x1[9] * (1-Global.CLK32[31]); + x1[10]' * (1-Global.CLK32[31]) = x1[10] * (1-Global.CLK32[31]); + x1[11]' * (1-Global.CLK32[31]) = x1[11] * (1-Global.CLK32[31]); + x1[12]' * (1-Global.CLK32[31]) = x1[12] * (1-Global.CLK32[31]); + x1[13]' * (1-Global.CLK32[31]) = x1[13] * (1-Global.CLK32[31]); + x1[14]' * (1-Global.CLK32[31]) = x1[14] * (1-Global.CLK32[31]); + x1[15]' * (1-Global.CLK32[31]) = x1[15] * (1-Global.CLK32[31]); + + + y1[0]' * (1-Global.CLK32[31]) = y1[0] * (1-Global.CLK32[31]); + y1[1]' * (1-Global.CLK32[31]) = y1[1] * (1-Global.CLK32[31]); + y1[2]' * (1-Global.CLK32[31]) = y1[2] * (1-Global.CLK32[31]); + y1[3]' * (1-Global.CLK32[31]) = y1[3] * (1-Global.CLK32[31]); + y1[4]' * (1-Global.CLK32[31]) = y1[4] * (1-Global.CLK32[31]); + y1[5]' * (1-Global.CLK32[31]) = y1[5] * (1-Global.CLK32[31]); + y1[6]' * (1-Global.CLK32[31]) = y1[6] * (1-Global.CLK32[31]); + y1[7]' * (1-Global.CLK32[31]) = y1[7] * (1-Global.CLK32[31]); + y1[8]' * (1-Global.CLK32[31]) = y1[8] * (1-Global.CLK32[31]); + y1[9]' * (1-Global.CLK32[31]) = y1[9] * (1-Global.CLK32[31]); + y1[10]' * (1-Global.CLK32[31]) = y1[10] * (1-Global.CLK32[31]); + y1[11]' * (1-Global.CLK32[31]) = y1[11] * (1-Global.CLK32[31]); + y1[12]' * (1-Global.CLK32[31]) = y1[12] * (1-Global.CLK32[31]); + y1[13]' * (1-Global.CLK32[31]) = y1[13] * (1-Global.CLK32[31]); + y1[14]' * (1-Global.CLK32[31]) = y1[14] * (1-Global.CLK32[31]); + y1[15]' * (1-Global.CLK32[31]) = y1[15] * (1-Global.CLK32[31]); + + + x2[0]' * (1-Global.CLK32[31]) = x2[0] * (1-Global.CLK32[31]); + x2[1]' * (1-Global.CLK32[31]) = x2[1] * (1-Global.CLK32[31]); + x2[2]' * (1-Global.CLK32[31]) = x2[2] * (1-Global.CLK32[31]); + x2[3]' * (1-Global.CLK32[31]) = x2[3] * (1-Global.CLK32[31]); + x2[4]' * (1-Global.CLK32[31]) = x2[4] * (1-Global.CLK32[31]); + x2[5]' * (1-Global.CLK32[31]) = x2[5] * (1-Global.CLK32[31]); + x2[6]' * (1-Global.CLK32[31]) = x2[6] * (1-Global.CLK32[31]); + x2[7]' * (1-Global.CLK32[31]) = x2[7] * (1-Global.CLK32[31]); + x2[8]' * (1-Global.CLK32[31]) = x2[8] * (1-Global.CLK32[31]); + x2[9]' * (1-Global.CLK32[31]) = x2[9] * (1-Global.CLK32[31]); + x2[10]' * (1-Global.CLK32[31]) = x2[10] * (1-Global.CLK32[31]); + x2[11]' * (1-Global.CLK32[31]) = x2[11] * (1-Global.CLK32[31]); + x2[12]' * (1-Global.CLK32[31]) = x2[12] * (1-Global.CLK32[31]); + x2[13]' * (1-Global.CLK32[31]) = x2[13] * (1-Global.CLK32[31]); + x2[14]' * (1-Global.CLK32[31]) = x2[14] * (1-Global.CLK32[31]); + x2[15]' * (1-Global.CLK32[31]) = x2[15] * (1-Global.CLK32[31]); + + + y2[0]' * (1-Global.CLK32[31]) = y2[0] * (1-Global.CLK32[31]); + y2[1]' * (1-Global.CLK32[31]) = y2[1] * (1-Global.CLK32[31]); + y2[2]' * (1-Global.CLK32[31]) = y2[2] * (1-Global.CLK32[31]); + y2[3]' * (1-Global.CLK32[31]) = y2[3] * (1-Global.CLK32[31]); + y2[4]' * (1-Global.CLK32[31]) = y2[4] * (1-Global.CLK32[31]); + y2[5]' * (1-Global.CLK32[31]) = y2[5] * (1-Global.CLK32[31]); + y2[6]' * (1-Global.CLK32[31]) = y2[6] * (1-Global.CLK32[31]); + y2[7]' * (1-Global.CLK32[31]) = y2[7] * (1-Global.CLK32[31]); + y2[8]' * (1-Global.CLK32[31]) = y2[8] * (1-Global.CLK32[31]); + y2[9]' * (1-Global.CLK32[31]) = y2[9] * (1-Global.CLK32[31]); + y2[10]' * (1-Global.CLK32[31]) = y2[10] * (1-Global.CLK32[31]); + y2[11]' * (1-Global.CLK32[31]) = y2[11] * (1-Global.CLK32[31]); + y2[12]' * (1-Global.CLK32[31]) = y2[12] * (1-Global.CLK32[31]); + y2[13]' * (1-Global.CLK32[31]) = y2[13] * (1-Global.CLK32[31]); + y2[14]' * (1-Global.CLK32[31]) = y2[14] * (1-Global.CLK32[31]); + y2[15]' * (1-Global.CLK32[31]) = y2[15] * (1-Global.CLK32[31]); + + + x3[0]' * (1-Global.CLK32[31]) = x3[0] * (1-Global.CLK32[31]); + x3[1]' * (1-Global.CLK32[31]) = x3[1] * (1-Global.CLK32[31]); + x3[2]' * (1-Global.CLK32[31]) = x3[2] * (1-Global.CLK32[31]); + x3[3]' * (1-Global.CLK32[31]) = x3[3] * (1-Global.CLK32[31]); + x3[4]' * (1-Global.CLK32[31]) = x3[4] * (1-Global.CLK32[31]); + x3[5]' * (1-Global.CLK32[31]) = x3[5] * (1-Global.CLK32[31]); + x3[6]' * (1-Global.CLK32[31]) = x3[6] * (1-Global.CLK32[31]); + x3[7]' * (1-Global.CLK32[31]) = x3[7] * (1-Global.CLK32[31]); + x3[8]' * (1-Global.CLK32[31]) = x3[8] * (1-Global.CLK32[31]); + x3[9]' * (1-Global.CLK32[31]) = x3[9] * (1-Global.CLK32[31]); + x3[10]' * (1-Global.CLK32[31]) = x3[10] * (1-Global.CLK32[31]); + x3[11]' * (1-Global.CLK32[31]) = x3[11] * (1-Global.CLK32[31]); + x3[12]' * (1-Global.CLK32[31]) = x3[12] * (1-Global.CLK32[31]); + x3[13]' * (1-Global.CLK32[31]) = x3[13] * (1-Global.CLK32[31]); + x3[14]' * (1-Global.CLK32[31]) = x3[14] * (1-Global.CLK32[31]); + x3[15]' * (1-Global.CLK32[31]) = x3[15] * (1-Global.CLK32[31]); + + + y3[0]' * (1-Global.CLK32[31]) = y3[0] * (1-Global.CLK32[31]); + y3[1]' * (1-Global.CLK32[31]) = y3[1] * (1-Global.CLK32[31]); + y3[2]' * (1-Global.CLK32[31]) = y3[2] * (1-Global.CLK32[31]); + y3[3]' * (1-Global.CLK32[31]) = y3[3] * (1-Global.CLK32[31]); + y3[4]' * (1-Global.CLK32[31]) = y3[4] * (1-Global.CLK32[31]); + y3[5]' * (1-Global.CLK32[31]) = y3[5] * (1-Global.CLK32[31]); + y3[6]' * (1-Global.CLK32[31]) = y3[6] * (1-Global.CLK32[31]); + y3[7]' * (1-Global.CLK32[31]) = y3[7] * (1-Global.CLK32[31]); + y3[8]' * (1-Global.CLK32[31]) = y3[8] * (1-Global.CLK32[31]); + y3[9]' * (1-Global.CLK32[31]) = y3[9] * (1-Global.CLK32[31]); + y3[10]' * (1-Global.CLK32[31]) = y3[10] * (1-Global.CLK32[31]); + y3[11]' * (1-Global.CLK32[31]) = y3[11] * (1-Global.CLK32[31]); + y3[12]' * (1-Global.CLK32[31]) = y3[12] * (1-Global.CLK32[31]); + y3[13]' * (1-Global.CLK32[31]) = y3[13] * (1-Global.CLK32[31]); + y3[14]' * (1-Global.CLK32[31]) = y3[14] * (1-Global.CLK32[31]); + y3[15]' * (1-Global.CLK32[31]) = y3[15] * (1-Global.CLK32[31]); + + + s[0]' * (1-Global.CLK32[31]) = s[0] * (1-Global.CLK32[31]); + s[1]' * (1-Global.CLK32[31]) = s[1] * (1-Global.CLK32[31]); + s[2]' * (1-Global.CLK32[31]) = s[2] * (1-Global.CLK32[31]); + s[3]' * (1-Global.CLK32[31]) = s[3] * (1-Global.CLK32[31]); + s[4]' * (1-Global.CLK32[31]) = s[4] * (1-Global.CLK32[31]); + s[5]' * (1-Global.CLK32[31]) = s[5] * (1-Global.CLK32[31]); + s[6]' * (1-Global.CLK32[31]) = s[6] * (1-Global.CLK32[31]); + s[7]' * (1-Global.CLK32[31]) = s[7] * (1-Global.CLK32[31]); + s[8]' * (1-Global.CLK32[31]) = s[8] * (1-Global.CLK32[31]); + s[9]' * (1-Global.CLK32[31]) = s[9] * (1-Global.CLK32[31]); + s[10]' * (1-Global.CLK32[31]) = s[10] * (1-Global.CLK32[31]); + s[11]' * (1-Global.CLK32[31]) = s[11] * (1-Global.CLK32[31]); + s[12]' * (1-Global.CLK32[31]) = s[12] * (1-Global.CLK32[31]); + s[13]' * (1-Global.CLK32[31]) = s[13] * (1-Global.CLK32[31]); + s[14]' * (1-Global.CLK32[31]) = s[14] * (1-Global.CLK32[31]); + s[15]' * (1-Global.CLK32[31]) = s[15] * (1-Global.CLK32[31]); + + + q0[0]' * (1-Global.CLK32[31]) = q0[0] * (1-Global.CLK32[31]); + q0[1]' * (1-Global.CLK32[31]) = q0[1] * (1-Global.CLK32[31]); + q0[2]' * (1-Global.CLK32[31]) = q0[2] * (1-Global.CLK32[31]); + q0[3]' * (1-Global.CLK32[31]) = q0[3] * (1-Global.CLK32[31]); + q0[4]' * (1-Global.CLK32[31]) = q0[4] * (1-Global.CLK32[31]); + q0[5]' * (1-Global.CLK32[31]) = q0[5] * (1-Global.CLK32[31]); + q0[6]' * (1-Global.CLK32[31]) = q0[6] * (1-Global.CLK32[31]); + q0[7]' * (1-Global.CLK32[31]) = q0[7] * (1-Global.CLK32[31]); + q0[8]' * (1-Global.CLK32[31]) = q0[8] * (1-Global.CLK32[31]); + q0[9]' * (1-Global.CLK32[31]) = q0[9] * (1-Global.CLK32[31]); + q0[10]' * (1-Global.CLK32[31]) = q0[10] * (1-Global.CLK32[31]); + q0[11]' * (1-Global.CLK32[31]) = q0[11] * (1-Global.CLK32[31]); + q0[12]' * (1-Global.CLK32[31]) = q0[12] * (1-Global.CLK32[31]); + q0[13]' * (1-Global.CLK32[31]) = q0[13] * (1-Global.CLK32[31]); + q0[14]' * (1-Global.CLK32[31]) = q0[14] * (1-Global.CLK32[31]); + q0[15]' * (1-Global.CLK32[31]) = q0[15] * (1-Global.CLK32[31]); + + + q1[0]' * (1-Global.CLK32[31]) = q1[0] * (1-Global.CLK32[31]); + q1[1]' * (1-Global.CLK32[31]) = q1[1] * (1-Global.CLK32[31]); + q1[2]' * (1-Global.CLK32[31]) = q1[2] * (1-Global.CLK32[31]); + q1[3]' * (1-Global.CLK32[31]) = q1[3] * (1-Global.CLK32[31]); + q1[4]' * (1-Global.CLK32[31]) = q1[4] * (1-Global.CLK32[31]); + q1[5]' * (1-Global.CLK32[31]) = q1[5] * (1-Global.CLK32[31]); + q1[6]' * (1-Global.CLK32[31]) = q1[6] * (1-Global.CLK32[31]); + q1[7]' * (1-Global.CLK32[31]) = q1[7] * (1-Global.CLK32[31]); + q1[8]' * (1-Global.CLK32[31]) = q1[8] * (1-Global.CLK32[31]); + q1[9]' * (1-Global.CLK32[31]) = q1[9] * (1-Global.CLK32[31]); + q1[10]' * (1-Global.CLK32[31]) = q1[10] * (1-Global.CLK32[31]); + q1[11]' * (1-Global.CLK32[31]) = q1[11] * (1-Global.CLK32[31]); + q1[12]' * (1-Global.CLK32[31]) = q1[12] * (1-Global.CLK32[31]); + q1[13]' * (1-Global.CLK32[31]) = q1[13] * (1-Global.CLK32[31]); + q1[14]' * (1-Global.CLK32[31]) = q1[14] * (1-Global.CLK32[31]); + q1[15]' * (1-Global.CLK32[31]) = q1[15] * (1-Global.CLK32[31]); + + + q2[0]' * (1-Global.CLK32[31]) = q2[0] * (1-Global.CLK32[31]); + q2[1]' * (1-Global.CLK32[31]) = q2[1] * (1-Global.CLK32[31]); + q2[2]' * (1-Global.CLK32[31]) = q2[2] * (1-Global.CLK32[31]); + q2[3]' * (1-Global.CLK32[31]) = q2[3] * (1-Global.CLK32[31]); + q2[4]' * (1-Global.CLK32[31]) = q2[4] * (1-Global.CLK32[31]); + q2[5]' * (1-Global.CLK32[31]) = q2[5] * (1-Global.CLK32[31]); + q2[6]' * (1-Global.CLK32[31]) = q2[6] * (1-Global.CLK32[31]); + q2[7]' * (1-Global.CLK32[31]) = q2[7] * (1-Global.CLK32[31]); + q2[8]' * (1-Global.CLK32[31]) = q2[8] * (1-Global.CLK32[31]); + q2[9]' * (1-Global.CLK32[31]) = q2[9] * (1-Global.CLK32[31]); + q2[10]' * (1-Global.CLK32[31]) = q2[10] * (1-Global.CLK32[31]); + q2[11]' * (1-Global.CLK32[31]) = q2[11] * (1-Global.CLK32[31]); + q2[12]' * (1-Global.CLK32[31]) = q2[12] * (1-Global.CLK32[31]); + q2[13]' * (1-Global.CLK32[31]) = q2[13] * (1-Global.CLK32[31]); + q2[14]' * (1-Global.CLK32[31]) = q2[14] * (1-Global.CLK32[31]); + q2[15]' * (1-Global.CLK32[31]) = q2[15] * (1-Global.CLK32[31]); + + + /**** + * + * RANGE CHECK x1,y1,x2,y2,s,q0,q1,q2 + * + *****/ + + x1[0]*Global.CLK32[0] + x1[1]*Global.CLK32[1] + x1[2]*Global.CLK32[2] + x1[3]*Global.CLK32[3] + x1[4]*Global.CLK32[4] + x1[5]*Global.CLK32[5] + x1[6]*Global.CLK32[6] + x1[7]*Global.CLK32[7] + + x1[8]*Global.CLK32[8] + x1[9]*Global.CLK32[9] + x1[10]*Global.CLK32[10] + x1[11]*Global.CLK32[11] + x1[12]*Global.CLK32[12] + x1[13]*Global.CLK32[13] + x1[14]*Global.CLK32[14] + x1[15]*Global.CLK32[15] + + y1[0]*Global.CLK32[16] + y1[1]*Global.CLK32[17] + y1[2]*Global.CLK32[18] + y1[3]*Global.CLK32[19] + y1[4]*Global.CLK32[20] + y1[5]*Global.CLK32[21] + y1[6]*Global.CLK32[22] + y1[7]*Global.CLK32[23] + + y1[8]*Global.CLK32[24] + y1[9]*Global.CLK32[25] + y1[10]*Global.CLK32[26] + y1[11]*Global.CLK32[27] + y1[12]*Global.CLK32[28] + y1[13]*Global.CLK32[29] + y1[14]*Global.CLK32[30] + y1[15]*Global.CLK32[31] in Global.BYTE2; + + x2[0]*Global.CLK32[0] + x2[1]*Global.CLK32[1] + x2[2]*Global.CLK32[2] + x2[3]*Global.CLK32[3] + x2[4]*Global.CLK32[4] + x2[5]*Global.CLK32[5] + x2[6]*Global.CLK32[6] + x2[7]*Global.CLK32[7] + + x2[8]*Global.CLK32[8] + x2[9]*Global.CLK32[9] + x2[10]*Global.CLK32[10] + x2[11]*Global.CLK32[11] + x2[12]*Global.CLK32[12] + x2[13]*Global.CLK32[13] + x2[14]*Global.CLK32[14] + x2[15]*Global.CLK32[15] + + y2[0]*Global.CLK32[16] + y2[1]*Global.CLK32[17] + y2[2]*Global.CLK32[18] + y2[3]*Global.CLK32[19] + y2[4]*Global.CLK32[20] + y2[5]*Global.CLK32[21] + y2[6]*Global.CLK32[22] + y2[7]*Global.CLK32[23] + + y2[8]*Global.CLK32[24] + y2[9]*Global.CLK32[25] + y2[10]*Global.CLK32[26] + y2[11]*Global.CLK32[27] + y2[12]*Global.CLK32[28] + y2[13]*Global.CLK32[29] + y2[14]*Global.CLK32[30] + y2[15]*Global.CLK32[31] in Global.BYTE2; + + s[0]*Global.CLK32[0] + s[1]*Global.CLK32[1] + s[2]*Global.CLK32[2] + s[3]*Global.CLK32[3] + s[4]*Global.CLK32[4] + s[5]*Global.CLK32[5] + s[6]*Global.CLK32[6] + s[7]*Global.CLK32[7] + + s[8]*Global.CLK32[8] + s[9]*Global.CLK32[9] + s[10]*Global.CLK32[10] + s[11]*Global.CLK32[11] + s[12]*Global.CLK32[12] + s[13]*Global.CLK32[13] + s[14]*Global.CLK32[14] + s[15]*Global.CLK32[15] + + q0[0]*Global.CLK32[16] + q0[1]*Global.CLK32[17] + q0[2]*Global.CLK32[18] + q0[3]*Global.CLK32[19] + q0[4]*Global.CLK32[20] + q0[5]*Global.CLK32[21] + q0[6]*Global.CLK32[22] + q0[7]*Global.CLK32[23] + + q0[8]*Global.CLK32[24] + q0[9]*Global.CLK32[25] + q0[10]*Global.CLK32[26] + q0[11]*Global.CLK32[27] + q0[12]*Global.CLK32[28] + q0[13]*Global.CLK32[29] + q0[14]*Global.CLK32[30] + q1[0]*Global.CLK32[31] in Global.BYTE2; + + {Global.CLK32[29] + Global.CLK32[30] + Global.CLK32[31], q1[1]*Global.CLK32[0] + q1[2]*Global.CLK32[1] + q1[3]*Global.CLK32[2] + q1[4]*Global.CLK32[3] + q1[5]*Global.CLK32[4] + q1[6]*Global.CLK32[5] + q1[7]*Global.CLK32[6] + q1[8]*Global.CLK32[7] + + q1[9]*Global.CLK32[8] + q1[10]*Global.CLK32[9] + q1[11]*Global.CLK32[10] + q1[12]*Global.CLK32[11] + q1[13]*Global.CLK32[12] + q1[14]*Global.CLK32[13] + q2[0]*Global.CLK32[14] + q2[1]*Global.CLK32[15] + + q2[2]*Global.CLK32[16] + q2[3]*Global.CLK32[17] + q2[4]*Global.CLK32[18] + q2[5]*Global.CLK32[19] + q2[6]*Global.CLK32[20] + q2[7]*Global.CLK32[21] + q2[8]*Global.CLK32[22] + q2[9]*Global.CLK32[23] + + q2[10]*Global.CLK32[24] + q2[11]*Global.CLK32[25] + q2[12]*Global.CLK32[26] + q2[13]*Global.CLK32[27] + q2[14]*Global.CLK32[28] + q0[15]*Global.CLK32[29] + q1[15]*Global.CLK32[30] + q2[15]*Global.CLK32[31]} in {SEL_BYTE2_BIT19, BYTE2_BIT19}; + + /******* + * + * EQ0: A(x1) * B(y1) + C(x2) = D (y2) * 2 ** 256 + op (y3) + * + *******/ + + pol eq0_0 = + (x1[0] * y1[0]) + + x2[0] - y3[0]; + + pol eq0_1 = + (x1[0] * y1[1]) + + (x1[1] * y1[0]) + + x2[1] - y3[1]; + + pol eq0_2 = + (x1[0] * y1[2]) + + (x1[1] * y1[1]) + + (x1[2] * y1[0]) + + x2[2] - y3[2]; + + pol eq0_3 = + (x1[0] * y1[3]) + + (x1[1] * y1[2]) + + (x1[2] * y1[1]) + + (x1[3] * y1[0]) + + x2[3] - y3[3]; + + pol eq0_4 = + (x1[0] * y1[4]) + + (x1[1] * y1[3]) + + (x1[2] * y1[2]) + + (x1[3] * y1[1]) + + (x1[4] * y1[0]) + + x2[4] - y3[4]; + + pol eq0_5 = + (x1[0] * y1[5]) + + (x1[1] * y1[4]) + + (x1[2] * y1[3]) + + (x1[3] * y1[2]) + + (x1[4] * y1[1]) + + (x1[5] * y1[0]) + + x2[5] - y3[5]; + + pol eq0_6 = + (x1[0] * y1[6]) + + (x1[1] * y1[5]) + + (x1[2] * y1[4]) + + (x1[3] * y1[3]) + + (x1[4] * y1[2]) + + (x1[5] * y1[1]) + + (x1[6] * y1[0]) + + x2[6] - y3[6]; + + pol eq0_7 = + (x1[0] * y1[7]) + + (x1[1] * y1[6]) + + (x1[2] * y1[5]) + + (x1[3] * y1[4]) + + (x1[4] * y1[3]) + + (x1[5] * y1[2]) + + (x1[6] * y1[1]) + + (x1[7] * y1[0]) + + x2[7] - y3[7]; + + pol eq0_8 = + (x1[0] * y1[8]) + + (x1[1] * y1[7]) + + (x1[2] * y1[6]) + + (x1[3] * y1[5]) + + (x1[4] * y1[4]) + + (x1[5] * y1[3]) + + (x1[6] * y1[2]) + + (x1[7] * y1[1]) + + (x1[8] * y1[0]) + + x2[8] - y3[8]; + + pol eq0_9 = + (x1[0] * y1[9]) + + (x1[1] * y1[8]) + + (x1[2] * y1[7]) + + (x1[3] * y1[6]) + + (x1[4] * y1[5]) + + (x1[5] * y1[4]) + + (x1[6] * y1[3]) + + (x1[7] * y1[2]) + + (x1[8] * y1[1]) + + (x1[9] * y1[0]) + + x2[9] - y3[9]; + + pol eq0_10 = + (x1[0] * y1[10]) + + (x1[1] * y1[9]) + + (x1[2] * y1[8]) + + (x1[3] * y1[7]) + + (x1[4] * y1[6]) + + (x1[5] * y1[5]) + + (x1[6] * y1[4]) + + (x1[7] * y1[3]) + + (x1[8] * y1[2]) + + (x1[9] * y1[1]) + + (x1[10] * y1[0]) + + x2[10] - y3[10]; + + pol eq0_11 = + (x1[0] * y1[11]) + + (x1[1] * y1[10]) + + (x1[2] * y1[9]) + + (x1[3] * y1[8]) + + (x1[4] * y1[7]) + + (x1[5] * y1[6]) + + (x1[6] * y1[5]) + + (x1[7] * y1[4]) + + (x1[8] * y1[3]) + + (x1[9] * y1[2]) + + (x1[10] * y1[1]) + + (x1[11] * y1[0]) + + x2[11] - y3[11]; + + pol eq0_12 = + (x1[0] * y1[12]) + + (x1[1] * y1[11]) + + (x1[2] * y1[10]) + + (x1[3] * y1[9]) + + (x1[4] * y1[8]) + + (x1[5] * y1[7]) + + (x1[6] * y1[6]) + + (x1[7] * y1[5]) + + (x1[8] * y1[4]) + + (x1[9] * y1[3]) + + (x1[10] * y1[2]) + + (x1[11] * y1[1]) + + (x1[12] * y1[0]) + + x2[12] - y3[12]; + + pol eq0_13 = + (x1[0] * y1[13]) + + (x1[1] * y1[12]) + + (x1[2] * y1[11]) + + (x1[3] * y1[10]) + + (x1[4] * y1[9]) + + (x1[5] * y1[8]) + + (x1[6] * y1[7]) + + (x1[7] * y1[6]) + + (x1[8] * y1[5]) + + (x1[9] * y1[4]) + + (x1[10] * y1[3]) + + (x1[11] * y1[2]) + + (x1[12] * y1[1]) + + (x1[13] * y1[0]) + + x2[13] - y3[13]; + + pol eq0_14 = + (x1[0] * y1[14]) + + (x1[1] * y1[13]) + + (x1[2] * y1[12]) + + (x1[3] * y1[11]) + + (x1[4] * y1[10]) + + (x1[5] * y1[9]) + + (x1[6] * y1[8]) + + (x1[7] * y1[7]) + + (x1[8] * y1[6]) + + (x1[9] * y1[5]) + + (x1[10] * y1[4]) + + (x1[11] * y1[3]) + + (x1[12] * y1[2]) + + (x1[13] * y1[1]) + + (x1[14] * y1[0]) + + x2[14] - y3[14]; + + pol eq0_15 = + (x1[0] * y1[15]) + + (x1[1] * y1[14]) + + (x1[2] * y1[13]) + + (x1[3] * y1[12]) + + (x1[4] * y1[11]) + + (x1[5] * y1[10]) + + (x1[6] * y1[9]) + + (x1[7] * y1[8]) + + (x1[8] * y1[7]) + + (x1[9] * y1[6]) + + (x1[10] * y1[5]) + + (x1[11] * y1[4]) + + (x1[12] * y1[3]) + + (x1[13] * y1[2]) + + (x1[14] * y1[1]) + + (x1[15] * y1[0]) + + x2[15] - y3[15]; + + pol eq0_16 = + (x1[1] * y1[15]) + + (x1[2] * y1[14]) + + (x1[3] * y1[13]) + + (x1[4] * y1[12]) + + (x1[5] * y1[11]) + + (x1[6] * y1[10]) + + (x1[7] * y1[9]) + + (x1[8] * y1[8]) + + (x1[9] * y1[7]) + + (x1[10] * y1[6]) + + (x1[11] * y1[5]) + + (x1[12] * y1[4]) + + (x1[13] * y1[3]) + + (x1[14] * y1[2]) + + (x1[15] * y1[1]) + - y2[0]; + + pol eq0_17 = + (x1[2] * y1[15]) + + (x1[3] * y1[14]) + + (x1[4] * y1[13]) + + (x1[5] * y1[12]) + + (x1[6] * y1[11]) + + (x1[7] * y1[10]) + + (x1[8] * y1[9]) + + (x1[9] * y1[8]) + + (x1[10] * y1[7]) + + (x1[11] * y1[6]) + + (x1[12] * y1[5]) + + (x1[13] * y1[4]) + + (x1[14] * y1[3]) + + (x1[15] * y1[2]) + - y2[1]; + + pol eq0_18 = + (x1[3] * y1[15]) + + (x1[4] * y1[14]) + + (x1[5] * y1[13]) + + (x1[6] * y1[12]) + + (x1[7] * y1[11]) + + (x1[8] * y1[10]) + + (x1[9] * y1[9]) + + (x1[10] * y1[8]) + + (x1[11] * y1[7]) + + (x1[12] * y1[6]) + + (x1[13] * y1[5]) + + (x1[14] * y1[4]) + + (x1[15] * y1[3]) + - y2[2]; + + pol eq0_19 = + (x1[4] * y1[15]) + + (x1[5] * y1[14]) + + (x1[6] * y1[13]) + + (x1[7] * y1[12]) + + (x1[8] * y1[11]) + + (x1[9] * y1[10]) + + (x1[10] * y1[9]) + + (x1[11] * y1[8]) + + (x1[12] * y1[7]) + + (x1[13] * y1[6]) + + (x1[14] * y1[5]) + + (x1[15] * y1[4]) + - y2[3]; + + pol eq0_20 = + (x1[5] * y1[15]) + + (x1[6] * y1[14]) + + (x1[7] * y1[13]) + + (x1[8] * y1[12]) + + (x1[9] * y1[11]) + + (x1[10] * y1[10]) + + (x1[11] * y1[9]) + + (x1[12] * y1[8]) + + (x1[13] * y1[7]) + + (x1[14] * y1[6]) + + (x1[15] * y1[5]) + - y2[4]; + + pol eq0_21 = + (x1[6] * y1[15]) + + (x1[7] * y1[14]) + + (x1[8] * y1[13]) + + (x1[9] * y1[12]) + + (x1[10] * y1[11]) + + (x1[11] * y1[10]) + + (x1[12] * y1[9]) + + (x1[13] * y1[8]) + + (x1[14] * y1[7]) + + (x1[15] * y1[6]) + - y2[5]; + + pol eq0_22 = + (x1[7] * y1[15]) + + (x1[8] * y1[14]) + + (x1[9] * y1[13]) + + (x1[10] * y1[12]) + + (x1[11] * y1[11]) + + (x1[12] * y1[10]) + + (x1[13] * y1[9]) + + (x1[14] * y1[8]) + + (x1[15] * y1[7]) + - y2[6]; + + pol eq0_23 = + (x1[8] * y1[15]) + + (x1[9] * y1[14]) + + (x1[10] * y1[13]) + + (x1[11] * y1[12]) + + (x1[12] * y1[11]) + + (x1[13] * y1[10]) + + (x1[14] * y1[9]) + + (x1[15] * y1[8]) + - y2[7]; + + pol eq0_24 = + (x1[9] * y1[15]) + + (x1[10] * y1[14]) + + (x1[11] * y1[13]) + + (x1[12] * y1[12]) + + (x1[13] * y1[11]) + + (x1[14] * y1[10]) + + (x1[15] * y1[9]) + - y2[8]; + + pol eq0_25 = + (x1[10] * y1[15]) + + (x1[11] * y1[14]) + + (x1[12] * y1[13]) + + (x1[13] * y1[12]) + + (x1[14] * y1[11]) + + (x1[15] * y1[10]) + - y2[9]; + + pol eq0_26 = + (x1[11] * y1[15]) + + (x1[12] * y1[14]) + + (x1[13] * y1[13]) + + (x1[14] * y1[12]) + + (x1[15] * y1[11]) + - y2[10]; + + pol eq0_27 = + (x1[12] * y1[15]) + + (x1[13] * y1[14]) + + (x1[14] * y1[13]) + + (x1[15] * y1[12]) + - y2[11]; + + pol eq0_28 = + (x1[13] * y1[15]) + + (x1[14] * y1[14]) + + (x1[15] * y1[13]) + - y2[12]; + + pol eq0_29 = + (x1[14] * y1[15]) + + (x1[15] * y1[14]) + - y2[13]; + + pol eq0_30 = + (x1[15] * y1[15]) + - y2[14]; + + pol eq0_31 = - y2[15]; + + + /******* + * + * EQ1: s * x2 - s * x1 - y2 + y1 - p * (q0 - offset) = 0 + * + *******/ + + pol eq1_0 = + (s[0] * x2[0] - s[0] * x1[0] - 64559 * q0[0]) + - y2[0] + y1[0]; + + pol eq1_1 = + (s[0] * x2[1] - s[0] * x1[1] - 64559 * q0[1]) + + (s[1] * x2[0] - s[1] * x1[0] - 65535 * q0[0]) + - y2[1] + y1[1]; + + pol eq1_2 = + (s[0] * x2[2] - s[0] * x1[2] - 64559 * q0[2]) + + (s[1] * x2[1] - s[1] * x1[1] - 65535 * q0[1]) + + (s[2] * x2[0] - s[2] * x1[0] - 65534 * q0[0]) + - y2[2] + y1[2]; + + pol eq1_3 = + (s[0] * x2[3] - s[0] * x1[3] - 64559 * q0[3]) + + (s[1] * x2[2] - s[1] * x1[2] - 65535 * q0[2]) + + (s[2] * x2[1] - s[2] * x1[1] - 65534 * q0[1]) + + (s[3] * x2[0] - s[3] * x1[0] - 65535 * q0[0]) + - y2[3] + y1[3]; + + pol eq1_4 = + (s[0] * x2[4] - s[0] * x1[4] - 64559 * q0[4]) + + (s[1] * x2[3] - s[1] * x1[3] - 65535 * q0[3]) + + (s[2] * x2[2] - s[2] * x1[2] - 65534 * q0[2]) + + (s[3] * x2[1] - s[3] * x1[1] - 65535 * q0[1]) + + (s[4] * x2[0] - s[4] * x1[0] - 65535 * q0[0]) + - y2[4] + y1[4]; + + pol eq1_5 = + (s[0] * x2[5] - s[0] * x1[5] - 64559 * q0[5]) + + (s[1] * x2[4] - s[1] * x1[4] - 65535 * q0[4]) + + (s[2] * x2[3] - s[2] * x1[3] - 65534 * q0[3]) + + (s[3] * x2[2] - s[3] * x1[2] - 65535 * q0[2]) + + (s[4] * x2[1] - s[4] * x1[1] - 65535 * q0[1]) + + (s[5] * x2[0] - s[5] * x1[0] - 65535 * q0[0]) + - y2[5] + y1[5]; + + pol eq1_6 = + (s[0] * x2[6] - s[0] * x1[6] - 64559 * q0[6]) + + (s[1] * x2[5] - s[1] * x1[5] - 65535 * q0[5]) + + (s[2] * x2[4] - s[2] * x1[4] - 65534 * q0[4]) + + (s[3] * x2[3] - s[3] * x1[3] - 65535 * q0[3]) + + (s[4] * x2[2] - s[4] * x1[2] - 65535 * q0[2]) + + (s[5] * x2[1] - s[5] * x1[1] - 65535 * q0[1]) + + (s[6] * x2[0] - s[6] * x1[0] - 65535 * q0[0]) + - y2[6] + y1[6]; + + pol eq1_7 = + (s[0] * x2[7] - s[0] * x1[7] - 64559 * q0[7]) + + (s[1] * x2[6] - s[1] * x1[6] - 65535 * q0[6]) + + (s[2] * x2[5] - s[2] * x1[5] - 65534 * q0[5]) + + (s[3] * x2[4] - s[3] * x1[4] - 65535 * q0[4]) + + (s[4] * x2[3] - s[4] * x1[3] - 65535 * q0[3]) + + (s[5] * x2[2] - s[5] * x1[2] - 65535 * q0[2]) + + (s[6] * x2[1] - s[6] * x1[1] - 65535 * q0[1]) + + (s[7] * x2[0] - s[7] * x1[0] - 65535 * q0[0]) + - y2[7] + y1[7]; + + pol eq1_8 = + (s[0] * x2[8] - s[0] * x1[8] - 64559 * q0[8]) + + (s[1] * x2[7] - s[1] * x1[7] - 65535 * q0[7]) + + (s[2] * x2[6] - s[2] * x1[6] - 65534 * q0[6]) + + (s[3] * x2[5] - s[3] * x1[5] - 65535 * q0[5]) + + (s[4] * x2[4] - s[4] * x1[4] - 65535 * q0[4]) + + (s[5] * x2[3] - s[5] * x1[3] - 65535 * q0[3]) + + (s[6] * x2[2] - s[6] * x1[2] - 65535 * q0[2]) + + (s[7] * x2[1] - s[7] * x1[1] - 65535 * q0[1]) + + (s[8] * x2[0] - s[8] * x1[0] - 65535 * q0[0]) + - y2[8] + y1[8]; + + pol eq1_9 = + (s[0] * x2[9] - s[0] * x1[9] - 64559 * q0[9]) + + (s[1] * x2[8] - s[1] * x1[8] - 65535 * q0[8]) + + (s[2] * x2[7] - s[2] * x1[7] - 65534 * q0[7]) + + (s[3] * x2[6] - s[3] * x1[6] - 65535 * q0[6]) + + (s[4] * x2[5] - s[4] * x1[5] - 65535 * q0[5]) + + (s[5] * x2[4] - s[5] * x1[4] - 65535 * q0[4]) + + (s[6] * x2[3] - s[6] * x1[3] - 65535 * q0[3]) + + (s[7] * x2[2] - s[7] * x1[2] - 65535 * q0[2]) + + (s[8] * x2[1] - s[8] * x1[1] - 65535 * q0[1]) + + (s[9] * x2[0] - s[9] * x1[0] - 65535 * q0[0]) + - y2[9] + y1[9]; + + pol eq1_10 = + (s[0] * x2[10] - s[0] * x1[10] - 64559 * q0[10]) + + (s[1] * x2[9] - s[1] * x1[9] - 65535 * q0[9]) + + (s[2] * x2[8] - s[2] * x1[8] - 65534 * q0[8]) + + (s[3] * x2[7] - s[3] * x1[7] - 65535 * q0[7]) + + (s[4] * x2[6] - s[4] * x1[6] - 65535 * q0[6]) + + (s[5] * x2[5] - s[5] * x1[5] - 65535 * q0[5]) + + (s[6] * x2[4] - s[6] * x1[4] - 65535 * q0[4]) + + (s[7] * x2[3] - s[7] * x1[3] - 65535 * q0[3]) + + (s[8] * x2[2] - s[8] * x1[2] - 65535 * q0[2]) + + (s[9] * x2[1] - s[9] * x1[1] - 65535 * q0[1]) + + (s[10] * x2[0] - s[10] * x1[0] - 65535 * q0[0]) + - y2[10] + y1[10]; + + pol eq1_11 = + (s[0] * x2[11] - s[0] * x1[11] - 64559 * q0[11]) + + (s[1] * x2[10] - s[1] * x1[10] - 65535 * q0[10]) + + (s[2] * x2[9] - s[2] * x1[9] - 65534 * q0[9]) + + (s[3] * x2[8] - s[3] * x1[8] - 65535 * q0[8]) + + (s[4] * x2[7] - s[4] * x1[7] - 65535 * q0[7]) + + (s[5] * x2[6] - s[5] * x1[6] - 65535 * q0[6]) + + (s[6] * x2[5] - s[6] * x1[5] - 65535 * q0[5]) + + (s[7] * x2[4] - s[7] * x1[4] - 65535 * q0[4]) + + (s[8] * x2[3] - s[8] * x1[3] - 65535 * q0[3]) + + (s[9] * x2[2] - s[9] * x1[2] - 65535 * q0[2]) + + (s[10] * x2[1] - s[10] * x1[1] - 65535 * q0[1]) + + (s[11] * x2[0] - s[11] * x1[0] - 65535 * q0[0]) + - y2[11] + y1[11]; + + pol eq1_12 = + (s[0] * x2[12] - s[0] * x1[12] - 64559 * q0[12]) + + (s[1] * x2[11] - s[1] * x1[11] - 65535 * q0[11]) + + (s[2] * x2[10] - s[2] * x1[10] - 65534 * q0[10]) + + (s[3] * x2[9] - s[3] * x1[9] - 65535 * q0[9]) + + (s[4] * x2[8] - s[4] * x1[8] - 65535 * q0[8]) + + (s[5] * x2[7] - s[5] * x1[7] - 65535 * q0[7]) + + (s[6] * x2[6] - s[6] * x1[6] - 65535 * q0[6]) + + (s[7] * x2[5] - s[7] * x1[5] - 65535 * q0[5]) + + (s[8] * x2[4] - s[8] * x1[4] - 65535 * q0[4]) + + (s[9] * x2[3] - s[9] * x1[3] - 65535 * q0[3]) + + (s[10] * x2[2] - s[10] * x1[2] - 65535 * q0[2]) + + (s[11] * x2[1] - s[11] * x1[1] - 65535 * q0[1]) + + (s[12] * x2[0] - s[12] * x1[0] - 65535 * q0[0]) + - y2[12] + y1[12]; + + pol eq1_13 = + (s[0] * x2[13] - s[0] * x1[13] - 64559 * q0[13]) + + (s[1] * x2[12] - s[1] * x1[12] - 65535 * q0[12]) + + (s[2] * x2[11] - s[2] * x1[11] - 65534 * q0[11]) + + (s[3] * x2[10] - s[3] * x1[10] - 65535 * q0[10]) + + (s[4] * x2[9] - s[4] * x1[9] - 65535 * q0[9]) + + (s[5] * x2[8] - s[5] * x1[8] - 65535 * q0[8]) + + (s[6] * x2[7] - s[6] * x1[7] - 65535 * q0[7]) + + (s[7] * x2[6] - s[7] * x1[6] - 65535 * q0[6]) + + (s[8] * x2[5] - s[8] * x1[5] - 65535 * q0[5]) + + (s[9] * x2[4] - s[9] * x1[4] - 65535 * q0[4]) + + (s[10] * x2[3] - s[10] * x1[3] - 65535 * q0[3]) + + (s[11] * x2[2] - s[11] * x1[2] - 65535 * q0[2]) + + (s[12] * x2[1] - s[12] * x1[1] - 65535 * q0[1]) + + (s[13] * x2[0] - s[13] * x1[0] - 65535 * q0[0]) + - y2[13] + y1[13]; + + pol eq1_14 = + (s[0] * x2[14] - s[0] * x1[14] - 64559 * q0[14]) + + (s[1] * x2[13] - s[1] * x1[13] - 65535 * q0[13]) + + (s[2] * x2[12] - s[2] * x1[12] - 65534 * q0[12]) + + (s[3] * x2[11] - s[3] * x1[11] - 65535 * q0[11]) + + (s[4] * x2[10] - s[4] * x1[10] - 65535 * q0[10]) + + (s[5] * x2[9] - s[5] * x1[9] - 65535 * q0[9]) + + (s[6] * x2[8] - s[6] * x1[8] - 65535 * q0[8]) + + (s[7] * x2[7] - s[7] * x1[7] - 65535 * q0[7]) + + (s[8] * x2[6] - s[8] * x1[6] - 65535 * q0[6]) + + (s[9] * x2[5] - s[9] * x1[5] - 65535 * q0[5]) + + (s[10] * x2[4] - s[10] * x1[4] - 65535 * q0[4]) + + (s[11] * x2[3] - s[11] * x1[3] - 65535 * q0[3]) + + (s[12] * x2[2] - s[12] * x1[2] - 65535 * q0[2]) + + (s[13] * x2[1] - s[13] * x1[1] - 65535 * q0[1]) + + (s[14] * x2[0] - s[14] * x1[0] - 65535 * q0[0]) + - y2[14] + y1[14]; + + pol eq1_15 = + (s[0] * x2[15] - s[0] * x1[15] - 64559 * q0[15]) + + (s[1] * x2[14] - s[1] * x1[14] - 65535 * q0[14]) + + (s[2] * x2[13] - s[2] * x1[13] - 65534 * q0[13]) + + (s[3] * x2[12] - s[3] * x1[12] - 65535 * q0[12]) + + (s[4] * x2[11] - s[4] * x1[11] - 65535 * q0[11]) + + (s[5] * x2[10] - s[5] * x1[10] - 65535 * q0[10]) + + (s[6] * x2[9] - s[6] * x1[9] - 65535 * q0[9]) + + (s[7] * x2[8] - s[7] * x1[8] - 65535 * q0[8]) + + (s[8] * x2[7] - s[8] * x1[7] - 65535 * q0[7]) + + (s[9] * x2[6] - s[9] * x1[6] - 65535 * q0[6]) + + (s[10] * x2[5] - s[10] * x1[5] - 65535 * q0[5]) + + (s[11] * x2[4] - s[11] * x1[4] - 65535 * q0[4]) + + (s[12] * x2[3] - s[12] * x1[3] - 65535 * q0[3]) + + (s[13] * x2[2] - s[13] * x1[2] - 65535 * q0[2]) + + (s[14] * x2[1] - s[14] * x1[1] - 65535 * q0[1]) + + (s[15] * x2[0] - s[15] * x1[0] - 65535 * q0[0]) + - y2[15] + y1[15]; + + pol eq1_16 = + (s[1] * x2[15] - s[1] * x1[15] - 65535 * q0[15]) + + (s[2] * x2[14] - s[2] * x1[14] - 65534 * q0[14]) + + (s[3] * x2[13] - s[3] * x1[13] - 65535 * q0[13]) + + (s[4] * x2[12] - s[4] * x1[12] - 65535 * q0[12]) + + (s[5] * x2[11] - s[5] * x1[11] - 65535 * q0[11]) + + (s[6] * x2[10] - s[6] * x1[10] - 65535 * q0[10]) + + (s[7] * x2[9] - s[7] * x1[9] - 65535 * q0[9]) + + (s[8] * x2[8] - s[8] * x1[8] - 65535 * q0[8]) + + (s[9] * x2[7] - s[9] * x1[7] - 65535 * q0[7]) + + (s[10] * x2[6] - s[10] * x1[6] - 65535 * q0[6]) + + (s[11] * x2[5] - s[11] * x1[5] - 65535 * q0[5]) + + (s[12] * x2[4] - s[12] * x1[4] - 65535 * q0[4]) + + (s[13] * x2[3] - s[13] * x1[3] - 65535 * q0[3]) + + (s[14] * x2[2] - s[14] * x1[2] - 65535 * q0[2]) + + (s[15] * x2[1] - s[15] * x1[1] - 65535 * q0[1]) + + 129118; + + pol eq1_17 = + (s[2] * x2[15] - s[2] * x1[15] - 65534 * q0[15]) + + (s[3] * x2[14] - s[3] * x1[14] - 65535 * q0[14]) + + (s[4] * x2[13] - s[4] * x1[13] - 65535 * q0[13]) + + (s[5] * x2[12] - s[5] * x1[12] - 65535 * q0[12]) + + (s[6] * x2[11] - s[6] * x1[11] - 65535 * q0[11]) + + (s[7] * x2[10] - s[7] * x1[10] - 65535 * q0[10]) + + (s[8] * x2[9] - s[8] * x1[9] - 65535 * q0[9]) + + (s[9] * x2[8] - s[9] * x1[8] - 65535 * q0[8]) + + (s[10] * x2[7] - s[10] * x1[7] - 65535 * q0[7]) + + (s[11] * x2[6] - s[11] * x1[6] - 65535 * q0[6]) + + (s[12] * x2[5] - s[12] * x1[5] - 65535 * q0[5]) + + (s[13] * x2[4] - s[13] * x1[4] - 65535 * q0[4]) + + (s[14] * x2[3] - s[14] * x1[3] - 65535 * q0[3]) + + (s[15] * x2[2] - s[15] * x1[2] - 65535 * q0[2]) + + 131070; + + pol eq1_18 = + (s[3] * x2[15] - s[3] * x1[15] - 65535 * q0[15]) + + (s[4] * x2[14] - s[4] * x1[14] - 65535 * q0[14]) + + (s[5] * x2[13] - s[5] * x1[13] - 65535 * q0[13]) + + (s[6] * x2[12] - s[6] * x1[12] - 65535 * q0[12]) + + (s[7] * x2[11] - s[7] * x1[11] - 65535 * q0[11]) + + (s[8] * x2[10] - s[8] * x1[10] - 65535 * q0[10]) + + (s[9] * x2[9] - s[9] * x1[9] - 65535 * q0[9]) + + (s[10] * x2[8] - s[10] * x1[8] - 65535 * q0[8]) + + (s[11] * x2[7] - s[11] * x1[7] - 65535 * q0[7]) + + (s[12] * x2[6] - s[12] * x1[6] - 65535 * q0[6]) + + (s[13] * x2[5] - s[13] * x1[5] - 65535 * q0[5]) + + (s[14] * x2[4] - s[14] * x1[4] - 65535 * q0[4]) + + (s[15] * x2[3] - s[15] * x1[3] - 65535 * q0[3]) + + 131068; + + pol eq1_19 = + (s[4] * x2[15] - s[4] * x1[15] - 65535 * q0[15]) + + (s[5] * x2[14] - s[5] * x1[14] - 65535 * q0[14]) + + (s[6] * x2[13] - s[6] * x1[13] - 65535 * q0[13]) + + (s[7] * x2[12] - s[7] * x1[12] - 65535 * q0[12]) + + (s[8] * x2[11] - s[8] * x1[11] - 65535 * q0[11]) + + (s[9] * x2[10] - s[9] * x1[10] - 65535 * q0[10]) + + (s[10] * x2[9] - s[10] * x1[9] - 65535 * q0[9]) + + (s[11] * x2[8] - s[11] * x1[8] - 65535 * q0[8]) + + (s[12] * x2[7] - s[12] * x1[7] - 65535 * q0[7]) + + (s[13] * x2[6] - s[13] * x1[6] - 65535 * q0[6]) + + (s[14] * x2[5] - s[14] * x1[5] - 65535 * q0[5]) + + (s[15] * x2[4] - s[15] * x1[4] - 65535 * q0[4]) + + 131070; + + pol eq1_20 = + (s[5] * x2[15] - s[5] * x1[15] - 65535 * q0[15]) + + (s[6] * x2[14] - s[6] * x1[14] - 65535 * q0[14]) + + (s[7] * x2[13] - s[7] * x1[13] - 65535 * q0[13]) + + (s[8] * x2[12] - s[8] * x1[12] - 65535 * q0[12]) + + (s[9] * x2[11] - s[9] * x1[11] - 65535 * q0[11]) + + (s[10] * x2[10] - s[10] * x1[10] - 65535 * q0[10]) + + (s[11] * x2[9] - s[11] * x1[9] - 65535 * q0[9]) + + (s[12] * x2[8] - s[12] * x1[8] - 65535 * q0[8]) + + (s[13] * x2[7] - s[13] * x1[7] - 65535 * q0[7]) + + (s[14] * x2[6] - s[14] * x1[6] - 65535 * q0[6]) + + (s[15] * x2[5] - s[15] * x1[5] - 65535 * q0[5]) + + 131070; + + pol eq1_21 = + (s[6] * x2[15] - s[6] * x1[15] - 65535 * q0[15]) + + (s[7] * x2[14] - s[7] * x1[14] - 65535 * q0[14]) + + (s[8] * x2[13] - s[8] * x1[13] - 65535 * q0[13]) + + (s[9] * x2[12] - s[9] * x1[12] - 65535 * q0[12]) + + (s[10] * x2[11] - s[10] * x1[11] - 65535 * q0[11]) + + (s[11] * x2[10] - s[11] * x1[10] - 65535 * q0[10]) + + (s[12] * x2[9] - s[12] * x1[9] - 65535 * q0[9]) + + (s[13] * x2[8] - s[13] * x1[8] - 65535 * q0[8]) + + (s[14] * x2[7] - s[14] * x1[7] - 65535 * q0[7]) + + (s[15] * x2[6] - s[15] * x1[6] - 65535 * q0[6]) + + 131070; + + pol eq1_22 = + (s[7] * x2[15] - s[7] * x1[15] - 65535 * q0[15]) + + (s[8] * x2[14] - s[8] * x1[14] - 65535 * q0[14]) + + (s[9] * x2[13] - s[9] * x1[13] - 65535 * q0[13]) + + (s[10] * x2[12] - s[10] * x1[12] - 65535 * q0[12]) + + (s[11] * x2[11] - s[11] * x1[11] - 65535 * q0[11]) + + (s[12] * x2[10] - s[12] * x1[10] - 65535 * q0[10]) + + (s[13] * x2[9] - s[13] * x1[9] - 65535 * q0[9]) + + (s[14] * x2[8] - s[14] * x1[8] - 65535 * q0[8]) + + (s[15] * x2[7] - s[15] * x1[7] - 65535 * q0[7]) + + 131070; + + pol eq1_23 = + (s[8] * x2[15] - s[8] * x1[15] - 65535 * q0[15]) + + (s[9] * x2[14] - s[9] * x1[14] - 65535 * q0[14]) + + (s[10] * x2[13] - s[10] * x1[13] - 65535 * q0[13]) + + (s[11] * x2[12] - s[11] * x1[12] - 65535 * q0[12]) + + (s[12] * x2[11] - s[12] * x1[11] - 65535 * q0[11]) + + (s[13] * x2[10] - s[13] * x1[10] - 65535 * q0[10]) + + (s[14] * x2[9] - s[14] * x1[9] - 65535 * q0[9]) + + (s[15] * x2[8] - s[15] * x1[8] - 65535 * q0[8]) + + 131070; + + pol eq1_24 = + (s[9] * x2[15] - s[9] * x1[15] - 65535 * q0[15]) + + (s[10] * x2[14] - s[10] * x1[14] - 65535 * q0[14]) + + (s[11] * x2[13] - s[11] * x1[13] - 65535 * q0[13]) + + (s[12] * x2[12] - s[12] * x1[12] - 65535 * q0[12]) + + (s[13] * x2[11] - s[13] * x1[11] - 65535 * q0[11]) + + (s[14] * x2[10] - s[14] * x1[10] - 65535 * q0[10]) + + (s[15] * x2[9] - s[15] * x1[9] - 65535 * q0[9]) + + 131070; + + pol eq1_25 = + (s[10] * x2[15] - s[10] * x1[15] - 65535 * q0[15]) + + (s[11] * x2[14] - s[11] * x1[14] - 65535 * q0[14]) + + (s[12] * x2[13] - s[12] * x1[13] - 65535 * q0[13]) + + (s[13] * x2[12] - s[13] * x1[12] - 65535 * q0[12]) + + (s[14] * x2[11] - s[14] * x1[11] - 65535 * q0[11]) + + (s[15] * x2[10] - s[15] * x1[10] - 65535 * q0[10]) + + 131070; + + pol eq1_26 = + (s[11] * x2[15] - s[11] * x1[15] - 65535 * q0[15]) + + (s[12] * x2[14] - s[12] * x1[14] - 65535 * q0[14]) + + (s[13] * x2[13] - s[13] * x1[13] - 65535 * q0[13]) + + (s[14] * x2[12] - s[14] * x1[12] - 65535 * q0[12]) + + (s[15] * x2[11] - s[15] * x1[11] - 65535 * q0[11]) + + 131070; + + pol eq1_27 = + (s[12] * x2[15] - s[12] * x1[15] - 65535 * q0[15]) + + (s[13] * x2[14] - s[13] * x1[14] - 65535 * q0[14]) + + (s[14] * x2[13] - s[14] * x1[13] - 65535 * q0[13]) + + (s[15] * x2[12] - s[15] * x1[12] - 65535 * q0[12]) + + 131070; + + pol eq1_28 = + (s[13] * x2[15] - s[13] * x1[15] - 65535 * q0[15]) + + (s[14] * x2[14] - s[14] * x1[14] - 65535 * q0[14]) + + (s[15] * x2[13] - s[15] * x1[13] - 65535 * q0[13]) + + 131070; + + pol eq1_29 = + (s[14] * x2[15] - s[14] * x1[15] - 65535 * q0[15]) + + (s[15] * x2[14] - s[15] * x1[14] - 65535 * q0[14]) + + 131070; + + pol eq1_30 = + (s[15] * x2[15] - s[15] * x1[15] - 65535 * q0[15]) + + 131070; + + pol eq1_31 = 131070; + + + /******* + * + * EQ2: 2 * s * y1 - 3 * x1 * x1 + p * (q0 - offset) = 0 + * + *******/ + + pol eq2_0 = + (s[0] * y1[0] + s[0] * y1[0] - x1[0] * x1[0] - x1[0] * x1[0] - x1[0] * x1[0] + 64559 * q0[0]); + + pol eq2_1 = + (s[0] * y1[1] + s[0] * y1[1] - x1[0] * x1[1] - x1[0] * x1[1] - x1[0] * x1[1] + 64559 * q0[1]) + + (s[1] * y1[0] + s[1] * y1[0] - x1[1] * x1[0] - x1[1] * x1[0] - x1[1] * x1[0] + 65535 * q0[0]); + + pol eq2_2 = + (s[0] * y1[2] + s[0] * y1[2] - x1[0] * x1[2] - x1[0] * x1[2] - x1[0] * x1[2] + 64559 * q0[2]) + + (s[1] * y1[1] + s[1] * y1[1] - x1[1] * x1[1] - x1[1] * x1[1] - x1[1] * x1[1] + 65535 * q0[1]) + + (s[2] * y1[0] + s[2] * y1[0] - x1[2] * x1[0] - x1[2] * x1[0] - x1[2] * x1[0] + 65534 * q0[0]); + + pol eq2_3 = + (s[0] * y1[3] + s[0] * y1[3] - x1[0] * x1[3] - x1[0] * x1[3] - x1[0] * x1[3] + 64559 * q0[3]) + + (s[1] * y1[2] + s[1] * y1[2] - x1[1] * x1[2] - x1[1] * x1[2] - x1[1] * x1[2] + 65535 * q0[2]) + + (s[2] * y1[1] + s[2] * y1[1] - x1[2] * x1[1] - x1[2] * x1[1] - x1[2] * x1[1] + 65534 * q0[1]) + + (s[3] * y1[0] + s[3] * y1[0] - x1[3] * x1[0] - x1[3] * x1[0] - x1[3] * x1[0] + 65535 * q0[0]); + + pol eq2_4 = + (s[0] * y1[4] + s[0] * y1[4] - x1[0] * x1[4] - x1[0] * x1[4] - x1[0] * x1[4] + 64559 * q0[4]) + + (s[1] * y1[3] + s[1] * y1[3] - x1[1] * x1[3] - x1[1] * x1[3] - x1[1] * x1[3] + 65535 * q0[3]) + + (s[2] * y1[2] + s[2] * y1[2] - x1[2] * x1[2] - x1[2] * x1[2] - x1[2] * x1[2] + 65534 * q0[2]) + + (s[3] * y1[1] + s[3] * y1[1] - x1[3] * x1[1] - x1[3] * x1[1] - x1[3] * x1[1] + 65535 * q0[1]) + + (s[4] * y1[0] + s[4] * y1[0] - x1[4] * x1[0] - x1[4] * x1[0] - x1[4] * x1[0] + 65535 * q0[0]); + + pol eq2_5 = + (s[0] * y1[5] + s[0] * y1[5] - x1[0] * x1[5] - x1[0] * x1[5] - x1[0] * x1[5] + 64559 * q0[5]) + + (s[1] * y1[4] + s[1] * y1[4] - x1[1] * x1[4] - x1[1] * x1[4] - x1[1] * x1[4] + 65535 * q0[4]) + + (s[2] * y1[3] + s[2] * y1[3] - x1[2] * x1[3] - x1[2] * x1[3] - x1[2] * x1[3] + 65534 * q0[3]) + + (s[3] * y1[2] + s[3] * y1[2] - x1[3] * x1[2] - x1[3] * x1[2] - x1[3] * x1[2] + 65535 * q0[2]) + + (s[4] * y1[1] + s[4] * y1[1] - x1[4] * x1[1] - x1[4] * x1[1] - x1[4] * x1[1] + 65535 * q0[1]) + + (s[5] * y1[0] + s[5] * y1[0] - x1[5] * x1[0] - x1[5] * x1[0] - x1[5] * x1[0] + 65535 * q0[0]); + + pol eq2_6 = + (s[0] * y1[6] + s[0] * y1[6] - x1[0] * x1[6] - x1[0] * x1[6] - x1[0] * x1[6] + 64559 * q0[6]) + + (s[1] * y1[5] + s[1] * y1[5] - x1[1] * x1[5] - x1[1] * x1[5] - x1[1] * x1[5] + 65535 * q0[5]) + + (s[2] * y1[4] + s[2] * y1[4] - x1[2] * x1[4] - x1[2] * x1[4] - x1[2] * x1[4] + 65534 * q0[4]) + + (s[3] * y1[3] + s[3] * y1[3] - x1[3] * x1[3] - x1[3] * x1[3] - x1[3] * x1[3] + 65535 * q0[3]) + + (s[4] * y1[2] + s[4] * y1[2] - x1[4] * x1[2] - x1[4] * x1[2] - x1[4] * x1[2] + 65535 * q0[2]) + + (s[5] * y1[1] + s[5] * y1[1] - x1[5] * x1[1] - x1[5] * x1[1] - x1[5] * x1[1] + 65535 * q0[1]) + + (s[6] * y1[0] + s[6] * y1[0] - x1[6] * x1[0] - x1[6] * x1[0] - x1[6] * x1[0] + 65535 * q0[0]); + + pol eq2_7 = + (s[0] * y1[7] + s[0] * y1[7] - x1[0] * x1[7] - x1[0] * x1[7] - x1[0] * x1[7] + 64559 * q0[7]) + + (s[1] * y1[6] + s[1] * y1[6] - x1[1] * x1[6] - x1[1] * x1[6] - x1[1] * x1[6] + 65535 * q0[6]) + + (s[2] * y1[5] + s[2] * y1[5] - x1[2] * x1[5] - x1[2] * x1[5] - x1[2] * x1[5] + 65534 * q0[5]) + + (s[3] * y1[4] + s[3] * y1[4] - x1[3] * x1[4] - x1[3] * x1[4] - x1[3] * x1[4] + 65535 * q0[4]) + + (s[4] * y1[3] + s[4] * y1[3] - x1[4] * x1[3] - x1[4] * x1[3] - x1[4] * x1[3] + 65535 * q0[3]) + + (s[5] * y1[2] + s[5] * y1[2] - x1[5] * x1[2] - x1[5] * x1[2] - x1[5] * x1[2] + 65535 * q0[2]) + + (s[6] * y1[1] + s[6] * y1[1] - x1[6] * x1[1] - x1[6] * x1[1] - x1[6] * x1[1] + 65535 * q0[1]) + + (s[7] * y1[0] + s[7] * y1[0] - x1[7] * x1[0] - x1[7] * x1[0] - x1[7] * x1[0] + 65535 * q0[0]); + + pol eq2_8 = + (s[0] * y1[8] + s[0] * y1[8] - x1[0] * x1[8] - x1[0] * x1[8] - x1[0] * x1[8] + 64559 * q0[8]) + + (s[1] * y1[7] + s[1] * y1[7] - x1[1] * x1[7] - x1[1] * x1[7] - x1[1] * x1[7] + 65535 * q0[7]) + + (s[2] * y1[6] + s[2] * y1[6] - x1[2] * x1[6] - x1[2] * x1[6] - x1[2] * x1[6] + 65534 * q0[6]) + + (s[3] * y1[5] + s[3] * y1[5] - x1[3] * x1[5] - x1[3] * x1[5] - x1[3] * x1[5] + 65535 * q0[5]) + + (s[4] * y1[4] + s[4] * y1[4] - x1[4] * x1[4] - x1[4] * x1[4] - x1[4] * x1[4] + 65535 * q0[4]) + + (s[5] * y1[3] + s[5] * y1[3] - x1[5] * x1[3] - x1[5] * x1[3] - x1[5] * x1[3] + 65535 * q0[3]) + + (s[6] * y1[2] + s[6] * y1[2] - x1[6] * x1[2] - x1[6] * x1[2] - x1[6] * x1[2] + 65535 * q0[2]) + + (s[7] * y1[1] + s[7] * y1[1] - x1[7] * x1[1] - x1[7] * x1[1] - x1[7] * x1[1] + 65535 * q0[1]) + + (s[8] * y1[0] + s[8] * y1[0] - x1[8] * x1[0] - x1[8] * x1[0] - x1[8] * x1[0] + 65535 * q0[0]); + + pol eq2_9 = + (s[0] * y1[9] + s[0] * y1[9] - x1[0] * x1[9] - x1[0] * x1[9] - x1[0] * x1[9] + 64559 * q0[9]) + + (s[1] * y1[8] + s[1] * y1[8] - x1[1] * x1[8] - x1[1] * x1[8] - x1[1] * x1[8] + 65535 * q0[8]) + + (s[2] * y1[7] + s[2] * y1[7] - x1[2] * x1[7] - x1[2] * x1[7] - x1[2] * x1[7] + 65534 * q0[7]) + + (s[3] * y1[6] + s[3] * y1[6] - x1[3] * x1[6] - x1[3] * x1[6] - x1[3] * x1[6] + 65535 * q0[6]) + + (s[4] * y1[5] + s[4] * y1[5] - x1[4] * x1[5] - x1[4] * x1[5] - x1[4] * x1[5] + 65535 * q0[5]) + + (s[5] * y1[4] + s[5] * y1[4] - x1[5] * x1[4] - x1[5] * x1[4] - x1[5] * x1[4] + 65535 * q0[4]) + + (s[6] * y1[3] + s[6] * y1[3] - x1[6] * x1[3] - x1[6] * x1[3] - x1[6] * x1[3] + 65535 * q0[3]) + + (s[7] * y1[2] + s[7] * y1[2] - x1[7] * x1[2] - x1[7] * x1[2] - x1[7] * x1[2] + 65535 * q0[2]) + + (s[8] * y1[1] + s[8] * y1[1] - x1[8] * x1[1] - x1[8] * x1[1] - x1[8] * x1[1] + 65535 * q0[1]) + + (s[9] * y1[0] + s[9] * y1[0] - x1[9] * x1[0] - x1[9] * x1[0] - x1[9] * x1[0] + 65535 * q0[0]); + + pol eq2_10 = + (s[0] * y1[10] + s[0] * y1[10] - x1[0] * x1[10] - x1[0] * x1[10] - x1[0] * x1[10] + 64559 * q0[10]) + + (s[1] * y1[9] + s[1] * y1[9] - x1[1] * x1[9] - x1[1] * x1[9] - x1[1] * x1[9] + 65535 * q0[9]) + + (s[2] * y1[8] + s[2] * y1[8] - x1[2] * x1[8] - x1[2] * x1[8] - x1[2] * x1[8] + 65534 * q0[8]) + + (s[3] * y1[7] + s[3] * y1[7] - x1[3] * x1[7] - x1[3] * x1[7] - x1[3] * x1[7] + 65535 * q0[7]) + + (s[4] * y1[6] + s[4] * y1[6] - x1[4] * x1[6] - x1[4] * x1[6] - x1[4] * x1[6] + 65535 * q0[6]) + + (s[5] * y1[5] + s[5] * y1[5] - x1[5] * x1[5] - x1[5] * x1[5] - x1[5] * x1[5] + 65535 * q0[5]) + + (s[6] * y1[4] + s[6] * y1[4] - x1[6] * x1[4] - x1[6] * x1[4] - x1[6] * x1[4] + 65535 * q0[4]) + + (s[7] * y1[3] + s[7] * y1[3] - x1[7] * x1[3] - x1[7] * x1[3] - x1[7] * x1[3] + 65535 * q0[3]) + + (s[8] * y1[2] + s[8] * y1[2] - x1[8] * x1[2] - x1[8] * x1[2] - x1[8] * x1[2] + 65535 * q0[2]) + + (s[9] * y1[1] + s[9] * y1[1] - x1[9] * x1[1] - x1[9] * x1[1] - x1[9] * x1[1] + 65535 * q0[1]) + + (s[10] * y1[0] + s[10] * y1[0] - x1[10] * x1[0] - x1[10] * x1[0] - x1[10] * x1[0] + 65535 * q0[0]); + + pol eq2_11 = + (s[0] * y1[11] + s[0] * y1[11] - x1[0] * x1[11] - x1[0] * x1[11] - x1[0] * x1[11] + 64559 * q0[11]) + + (s[1] * y1[10] + s[1] * y1[10] - x1[1] * x1[10] - x1[1] * x1[10] - x1[1] * x1[10] + 65535 * q0[10]) + + (s[2] * y1[9] + s[2] * y1[9] - x1[2] * x1[9] - x1[2] * x1[9] - x1[2] * x1[9] + 65534 * q0[9]) + + (s[3] * y1[8] + s[3] * y1[8] - x1[3] * x1[8] - x1[3] * x1[8] - x1[3] * x1[8] + 65535 * q0[8]) + + (s[4] * y1[7] + s[4] * y1[7] - x1[4] * x1[7] - x1[4] * x1[7] - x1[4] * x1[7] + 65535 * q0[7]) + + (s[5] * y1[6] + s[5] * y1[6] - x1[5] * x1[6] - x1[5] * x1[6] - x1[5] * x1[6] + 65535 * q0[6]) + + (s[6] * y1[5] + s[6] * y1[5] - x1[6] * x1[5] - x1[6] * x1[5] - x1[6] * x1[5] + 65535 * q0[5]) + + (s[7] * y1[4] + s[7] * y1[4] - x1[7] * x1[4] - x1[7] * x1[4] - x1[7] * x1[4] + 65535 * q0[4]) + + (s[8] * y1[3] + s[8] * y1[3] - x1[8] * x1[3] - x1[8] * x1[3] - x1[8] * x1[3] + 65535 * q0[3]) + + (s[9] * y1[2] + s[9] * y1[2] - x1[9] * x1[2] - x1[9] * x1[2] - x1[9] * x1[2] + 65535 * q0[2]) + + (s[10] * y1[1] + s[10] * y1[1] - x1[10] * x1[1] - x1[10] * x1[1] - x1[10] * x1[1] + 65535 * q0[1]) + + (s[11] * y1[0] + s[11] * y1[0] - x1[11] * x1[0] - x1[11] * x1[0] - x1[11] * x1[0] + 65535 * q0[0]); + + pol eq2_12 = + (s[0] * y1[12] + s[0] * y1[12] - x1[0] * x1[12] - x1[0] * x1[12] - x1[0] * x1[12] + 64559 * q0[12]) + + (s[1] * y1[11] + s[1] * y1[11] - x1[1] * x1[11] - x1[1] * x1[11] - x1[1] * x1[11] + 65535 * q0[11]) + + (s[2] * y1[10] + s[2] * y1[10] - x1[2] * x1[10] - x1[2] * x1[10] - x1[2] * x1[10] + 65534 * q0[10]) + + (s[3] * y1[9] + s[3] * y1[9] - x1[3] * x1[9] - x1[3] * x1[9] - x1[3] * x1[9] + 65535 * q0[9]) + + (s[4] * y1[8] + s[4] * y1[8] - x1[4] * x1[8] - x1[4] * x1[8] - x1[4] * x1[8] + 65535 * q0[8]) + + (s[5] * y1[7] + s[5] * y1[7] - x1[5] * x1[7] - x1[5] * x1[7] - x1[5] * x1[7] + 65535 * q0[7]) + + (s[6] * y1[6] + s[6] * y1[6] - x1[6] * x1[6] - x1[6] * x1[6] - x1[6] * x1[6] + 65535 * q0[6]) + + (s[7] * y1[5] + s[7] * y1[5] - x1[7] * x1[5] - x1[7] * x1[5] - x1[7] * x1[5] + 65535 * q0[5]) + + (s[8] * y1[4] + s[8] * y1[4] - x1[8] * x1[4] - x1[8] * x1[4] - x1[8] * x1[4] + 65535 * q0[4]) + + (s[9] * y1[3] + s[9] * y1[3] - x1[9] * x1[3] - x1[9] * x1[3] - x1[9] * x1[3] + 65535 * q0[3]) + + (s[10] * y1[2] + s[10] * y1[2] - x1[10] * x1[2] - x1[10] * x1[2] - x1[10] * x1[2] + 65535 * q0[2]) + + (s[11] * y1[1] + s[11] * y1[1] - x1[11] * x1[1] - x1[11] * x1[1] - x1[11] * x1[1] + 65535 * q0[1]) + + (s[12] * y1[0] + s[12] * y1[0] - x1[12] * x1[0] - x1[12] * x1[0] - x1[12] * x1[0] + 65535 * q0[0]); + + pol eq2_13 = + (s[0] * y1[13] + s[0] * y1[13] - x1[0] * x1[13] - x1[0] * x1[13] - x1[0] * x1[13] + 64559 * q0[13]) + + (s[1] * y1[12] + s[1] * y1[12] - x1[1] * x1[12] - x1[1] * x1[12] - x1[1] * x1[12] + 65535 * q0[12]) + + (s[2] * y1[11] + s[2] * y1[11] - x1[2] * x1[11] - x1[2] * x1[11] - x1[2] * x1[11] + 65534 * q0[11]) + + (s[3] * y1[10] + s[3] * y1[10] - x1[3] * x1[10] - x1[3] * x1[10] - x1[3] * x1[10] + 65535 * q0[10]) + + (s[4] * y1[9] + s[4] * y1[9] - x1[4] * x1[9] - x1[4] * x1[9] - x1[4] * x1[9] + 65535 * q0[9]) + + (s[5] * y1[8] + s[5] * y1[8] - x1[5] * x1[8] - x1[5] * x1[8] - x1[5] * x1[8] + 65535 * q0[8]) + + (s[6] * y1[7] + s[6] * y1[7] - x1[6] * x1[7] - x1[6] * x1[7] - x1[6] * x1[7] + 65535 * q0[7]) + + (s[7] * y1[6] + s[7] * y1[6] - x1[7] * x1[6] - x1[7] * x1[6] - x1[7] * x1[6] + 65535 * q0[6]) + + (s[8] * y1[5] + s[8] * y1[5] - x1[8] * x1[5] - x1[8] * x1[5] - x1[8] * x1[5] + 65535 * q0[5]) + + (s[9] * y1[4] + s[9] * y1[4] - x1[9] * x1[4] - x1[9] * x1[4] - x1[9] * x1[4] + 65535 * q0[4]) + + (s[10] * y1[3] + s[10] * y1[3] - x1[10] * x1[3] - x1[10] * x1[3] - x1[10] * x1[3] + 65535 * q0[3]) + + (s[11] * y1[2] + s[11] * y1[2] - x1[11] * x1[2] - x1[11] * x1[2] - x1[11] * x1[2] + 65535 * q0[2]) + + (s[12] * y1[1] + s[12] * y1[1] - x1[12] * x1[1] - x1[12] * x1[1] - x1[12] * x1[1] + 65535 * q0[1]) + + (s[13] * y1[0] + s[13] * y1[0] - x1[13] * x1[0] - x1[13] * x1[0] - x1[13] * x1[0] + 65535 * q0[0]); + + pol eq2_14 = + (s[0] * y1[14] + s[0] * y1[14] - x1[0] * x1[14] - x1[0] * x1[14] - x1[0] * x1[14] + 64559 * q0[14]) + + (s[1] * y1[13] + s[1] * y1[13] - x1[1] * x1[13] - x1[1] * x1[13] - x1[1] * x1[13] + 65535 * q0[13]) + + (s[2] * y1[12] + s[2] * y1[12] - x1[2] * x1[12] - x1[2] * x1[12] - x1[2] * x1[12] + 65534 * q0[12]) + + (s[3] * y1[11] + s[3] * y1[11] - x1[3] * x1[11] - x1[3] * x1[11] - x1[3] * x1[11] + 65535 * q0[11]) + + (s[4] * y1[10] + s[4] * y1[10] - x1[4] * x1[10] - x1[4] * x1[10] - x1[4] * x1[10] + 65535 * q0[10]) + + (s[5] * y1[9] + s[5] * y1[9] - x1[5] * x1[9] - x1[5] * x1[9] - x1[5] * x1[9] + 65535 * q0[9]) + + (s[6] * y1[8] + s[6] * y1[8] - x1[6] * x1[8] - x1[6] * x1[8] - x1[6] * x1[8] + 65535 * q0[8]) + + (s[7] * y1[7] + s[7] * y1[7] - x1[7] * x1[7] - x1[7] * x1[7] - x1[7] * x1[7] + 65535 * q0[7]) + + (s[8] * y1[6] + s[8] * y1[6] - x1[8] * x1[6] - x1[8] * x1[6] - x1[8] * x1[6] + 65535 * q0[6]) + + (s[9] * y1[5] + s[9] * y1[5] - x1[9] * x1[5] - x1[9] * x1[5] - x1[9] * x1[5] + 65535 * q0[5]) + + (s[10] * y1[4] + s[10] * y1[4] - x1[10] * x1[4] - x1[10] * x1[4] - x1[10] * x1[4] + 65535 * q0[4]) + + (s[11] * y1[3] + s[11] * y1[3] - x1[11] * x1[3] - x1[11] * x1[3] - x1[11] * x1[3] + 65535 * q0[3]) + + (s[12] * y1[2] + s[12] * y1[2] - x1[12] * x1[2] - x1[12] * x1[2] - x1[12] * x1[2] + 65535 * q0[2]) + + (s[13] * y1[1] + s[13] * y1[1] - x1[13] * x1[1] - x1[13] * x1[1] - x1[13] * x1[1] + 65535 * q0[1]) + + (s[14] * y1[0] + s[14] * y1[0] - x1[14] * x1[0] - x1[14] * x1[0] - x1[14] * x1[0] + 65535 * q0[0]); + + pol eq2_15 = + (s[0] * y1[15] + s[0] * y1[15] - x1[0] * x1[15] - x1[0] * x1[15] - x1[0] * x1[15] + 64559 * q0[15]) + + (s[1] * y1[14] + s[1] * y1[14] - x1[1] * x1[14] - x1[1] * x1[14] - x1[1] * x1[14] + 65535 * q0[14]) + + (s[2] * y1[13] + s[2] * y1[13] - x1[2] * x1[13] - x1[2] * x1[13] - x1[2] * x1[13] + 65534 * q0[13]) + + (s[3] * y1[12] + s[3] * y1[12] - x1[3] * x1[12] - x1[3] * x1[12] - x1[3] * x1[12] + 65535 * q0[12]) + + (s[4] * y1[11] + s[4] * y1[11] - x1[4] * x1[11] - x1[4] * x1[11] - x1[4] * x1[11] + 65535 * q0[11]) + + (s[5] * y1[10] + s[5] * y1[10] - x1[5] * x1[10] - x1[5] * x1[10] - x1[5] * x1[10] + 65535 * q0[10]) + + (s[6] * y1[9] + s[6] * y1[9] - x1[6] * x1[9] - x1[6] * x1[9] - x1[6] * x1[9] + 65535 * q0[9]) + + (s[7] * y1[8] + s[7] * y1[8] - x1[7] * x1[8] - x1[7] * x1[8] - x1[7] * x1[8] + 65535 * q0[8]) + + (s[8] * y1[7] + s[8] * y1[7] - x1[8] * x1[7] - x1[8] * x1[7] - x1[8] * x1[7] + 65535 * q0[7]) + + (s[9] * y1[6] + s[9] * y1[6] - x1[9] * x1[6] - x1[9] * x1[6] - x1[9] * x1[6] + 65535 * q0[6]) + + (s[10] * y1[5] + s[10] * y1[5] - x1[10] * x1[5] - x1[10] * x1[5] - x1[10] * x1[5] + 65535 * q0[5]) + + (s[11] * y1[4] + s[11] * y1[4] - x1[11] * x1[4] - x1[11] * x1[4] - x1[11] * x1[4] + 65535 * q0[4]) + + (s[12] * y1[3] + s[12] * y1[3] - x1[12] * x1[3] - x1[12] * x1[3] - x1[12] * x1[3] + 65535 * q0[3]) + + (s[13] * y1[2] + s[13] * y1[2] - x1[13] * x1[2] - x1[13] * x1[2] - x1[13] * x1[2] + 65535 * q0[2]) + + (s[14] * y1[1] + s[14] * y1[1] - x1[14] * x1[1] - x1[14] * x1[1] - x1[14] * x1[1] + 65535 * q0[1]) + + (s[15] * y1[0] + s[15] * y1[0] - x1[15] * x1[0] - x1[15] * x1[0] - x1[15] * x1[0] + 65535 * q0[0]); + + pol eq2_16 = + (s[1] * y1[15] + s[1] * y1[15] - x1[1] * x1[15] - x1[1] * x1[15] - x1[1] * x1[15] + 65535 * q0[15]) + + (s[2] * y1[14] + s[2] * y1[14] - x1[2] * x1[14] - x1[2] * x1[14] - x1[2] * x1[14] + 65534 * q0[14]) + + (s[3] * y1[13] + s[3] * y1[13] - x1[3] * x1[13] - x1[3] * x1[13] - x1[3] * x1[13] + 65535 * q0[13]) + + (s[4] * y1[12] + s[4] * y1[12] - x1[4] * x1[12] - x1[4] * x1[12] - x1[4] * x1[12] + 65535 * q0[12]) + + (s[5] * y1[11] + s[5] * y1[11] - x1[5] * x1[11] - x1[5] * x1[11] - x1[5] * x1[11] + 65535 * q0[11]) + + (s[6] * y1[10] + s[6] * y1[10] - x1[6] * x1[10] - x1[6] * x1[10] - x1[6] * x1[10] + 65535 * q0[10]) + + (s[7] * y1[9] + s[7] * y1[9] - x1[7] * x1[9] - x1[7] * x1[9] - x1[7] * x1[9] + 65535 * q0[9]) + + (s[8] * y1[8] + s[8] * y1[8] - x1[8] * x1[8] - x1[8] * x1[8] - x1[8] * x1[8] + 65535 * q0[8]) + + (s[9] * y1[7] + s[9] * y1[7] - x1[9] * x1[7] - x1[9] * x1[7] - x1[9] * x1[7] + 65535 * q0[7]) + + (s[10] * y1[6] + s[10] * y1[6] - x1[10] * x1[6] - x1[10] * x1[6] - x1[10] * x1[6] + 65535 * q0[6]) + + (s[11] * y1[5] + s[11] * y1[5] - x1[11] * x1[5] - x1[11] * x1[5] - x1[11] * x1[5] + 65535 * q0[5]) + + (s[12] * y1[4] + s[12] * y1[4] - x1[12] * x1[4] - x1[12] * x1[4] - x1[12] * x1[4] + 65535 * q0[4]) + + (s[13] * y1[3] + s[13] * y1[3] - x1[13] * x1[3] - x1[13] * x1[3] - x1[13] * x1[3] + 65535 * q0[3]) + + (s[14] * y1[2] + s[14] * y1[2] - x1[14] * x1[2] - x1[14] * x1[2] - x1[14] * x1[2] + 65535 * q0[2]) + + (s[15] * y1[1] + s[15] * y1[1] - x1[15] * x1[1] - x1[15] * x1[1] - x1[15] * x1[1] + 65535 * q0[1]) + - 258236; + + pol eq2_17 = + (s[2] * y1[15] + s[2] * y1[15] - x1[2] * x1[15] - x1[2] * x1[15] - x1[2] * x1[15] + 65534 * q0[15]) + + (s[3] * y1[14] + s[3] * y1[14] - x1[3] * x1[14] - x1[3] * x1[14] - x1[3] * x1[14] + 65535 * q0[14]) + + (s[4] * y1[13] + s[4] * y1[13] - x1[4] * x1[13] - x1[4] * x1[13] - x1[4] * x1[13] + 65535 * q0[13]) + + (s[5] * y1[12] + s[5] * y1[12] - x1[5] * x1[12] - x1[5] * x1[12] - x1[5] * x1[12] + 65535 * q0[12]) + + (s[6] * y1[11] + s[6] * y1[11] - x1[6] * x1[11] - x1[6] * x1[11] - x1[6] * x1[11] + 65535 * q0[11]) + + (s[7] * y1[10] + s[7] * y1[10] - x1[7] * x1[10] - x1[7] * x1[10] - x1[7] * x1[10] + 65535 * q0[10]) + + (s[8] * y1[9] + s[8] * y1[9] - x1[8] * x1[9] - x1[8] * x1[9] - x1[8] * x1[9] + 65535 * q0[9]) + + (s[9] * y1[8] + s[9] * y1[8] - x1[9] * x1[8] - x1[9] * x1[8] - x1[9] * x1[8] + 65535 * q0[8]) + + (s[10] * y1[7] + s[10] * y1[7] - x1[10] * x1[7] - x1[10] * x1[7] - x1[10] * x1[7] + 65535 * q0[7]) + + (s[11] * y1[6] + s[11] * y1[6] - x1[11] * x1[6] - x1[11] * x1[6] - x1[11] * x1[6] + 65535 * q0[6]) + + (s[12] * y1[5] + s[12] * y1[5] - x1[12] * x1[5] - x1[12] * x1[5] - x1[12] * x1[5] + 65535 * q0[5]) + + (s[13] * y1[4] + s[13] * y1[4] - x1[13] * x1[4] - x1[13] * x1[4] - x1[13] * x1[4] + 65535 * q0[4]) + + (s[14] * y1[3] + s[14] * y1[3] - x1[14] * x1[3] - x1[14] * x1[3] - x1[14] * x1[3] + 65535 * q0[3]) + + (s[15] * y1[2] + s[15] * y1[2] - x1[15] * x1[2] - x1[15] * x1[2] - x1[15] * x1[2] + 65535 * q0[2]) + - 262140; + + pol eq2_18 = + (s[3] * y1[15] + s[3] * y1[15] - x1[3] * x1[15] - x1[3] * x1[15] - x1[3] * x1[15] + 65535 * q0[15]) + + (s[4] * y1[14] + s[4] * y1[14] - x1[4] * x1[14] - x1[4] * x1[14] - x1[4] * x1[14] + 65535 * q0[14]) + + (s[5] * y1[13] + s[5] * y1[13] - x1[5] * x1[13] - x1[5] * x1[13] - x1[5] * x1[13] + 65535 * q0[13]) + + (s[6] * y1[12] + s[6] * y1[12] - x1[6] * x1[12] - x1[6] * x1[12] - x1[6] * x1[12] + 65535 * q0[12]) + + (s[7] * y1[11] + s[7] * y1[11] - x1[7] * x1[11] - x1[7] * x1[11] - x1[7] * x1[11] + 65535 * q0[11]) + + (s[8] * y1[10] + s[8] * y1[10] - x1[8] * x1[10] - x1[8] * x1[10] - x1[8] * x1[10] + 65535 * q0[10]) + + (s[9] * y1[9] + s[9] * y1[9] - x1[9] * x1[9] - x1[9] * x1[9] - x1[9] * x1[9] + 65535 * q0[9]) + + (s[10] * y1[8] + s[10] * y1[8] - x1[10] * x1[8] - x1[10] * x1[8] - x1[10] * x1[8] + 65535 * q0[8]) + + (s[11] * y1[7] + s[11] * y1[7] - x1[11] * x1[7] - x1[11] * x1[7] - x1[11] * x1[7] + 65535 * q0[7]) + + (s[12] * y1[6] + s[12] * y1[6] - x1[12] * x1[6] - x1[12] * x1[6] - x1[12] * x1[6] + 65535 * q0[6]) + + (s[13] * y1[5] + s[13] * y1[5] - x1[13] * x1[5] - x1[13] * x1[5] - x1[13] * x1[5] + 65535 * q0[5]) + + (s[14] * y1[4] + s[14] * y1[4] - x1[14] * x1[4] - x1[14] * x1[4] - x1[14] * x1[4] + 65535 * q0[4]) + + (s[15] * y1[3] + s[15] * y1[3] - x1[15] * x1[3] - x1[15] * x1[3] - x1[15] * x1[3] + 65535 * q0[3]) + - 262136; + + pol eq2_19 = + (s[4] * y1[15] + s[4] * y1[15] - x1[4] * x1[15] - x1[4] * x1[15] - x1[4] * x1[15] + 65535 * q0[15]) + + (s[5] * y1[14] + s[5] * y1[14] - x1[5] * x1[14] - x1[5] * x1[14] - x1[5] * x1[14] + 65535 * q0[14]) + + (s[6] * y1[13] + s[6] * y1[13] - x1[6] * x1[13] - x1[6] * x1[13] - x1[6] * x1[13] + 65535 * q0[13]) + + (s[7] * y1[12] + s[7] * y1[12] - x1[7] * x1[12] - x1[7] * x1[12] - x1[7] * x1[12] + 65535 * q0[12]) + + (s[8] * y1[11] + s[8] * y1[11] - x1[8] * x1[11] - x1[8] * x1[11] - x1[8] * x1[11] + 65535 * q0[11]) + + (s[9] * y1[10] + s[9] * y1[10] - x1[9] * x1[10] - x1[9] * x1[10] - x1[9] * x1[10] + 65535 * q0[10]) + + (s[10] * y1[9] + s[10] * y1[9] - x1[10] * x1[9] - x1[10] * x1[9] - x1[10] * x1[9] + 65535 * q0[9]) + + (s[11] * y1[8] + s[11] * y1[8] - x1[11] * x1[8] - x1[11] * x1[8] - x1[11] * x1[8] + 65535 * q0[8]) + + (s[12] * y1[7] + s[12] * y1[7] - x1[12] * x1[7] - x1[12] * x1[7] - x1[12] * x1[7] + 65535 * q0[7]) + + (s[13] * y1[6] + s[13] * y1[6] - x1[13] * x1[6] - x1[13] * x1[6] - x1[13] * x1[6] + 65535 * q0[6]) + + (s[14] * y1[5] + s[14] * y1[5] - x1[14] * x1[5] - x1[14] * x1[5] - x1[14] * x1[5] + 65535 * q0[5]) + + (s[15] * y1[4] + s[15] * y1[4] - x1[15] * x1[4] - x1[15] * x1[4] - x1[15] * x1[4] + 65535 * q0[4]) + - 262140; + + pol eq2_20 = + (s[5] * y1[15] + s[5] * y1[15] - x1[5] * x1[15] - x1[5] * x1[15] - x1[5] * x1[15] + 65535 * q0[15]) + + (s[6] * y1[14] + s[6] * y1[14] - x1[6] * x1[14] - x1[6] * x1[14] - x1[6] * x1[14] + 65535 * q0[14]) + + (s[7] * y1[13] + s[7] * y1[13] - x1[7] * x1[13] - x1[7] * x1[13] - x1[7] * x1[13] + 65535 * q0[13]) + + (s[8] * y1[12] + s[8] * y1[12] - x1[8] * x1[12] - x1[8] * x1[12] - x1[8] * x1[12] + 65535 * q0[12]) + + (s[9] * y1[11] + s[9] * y1[11] - x1[9] * x1[11] - x1[9] * x1[11] - x1[9] * x1[11] + 65535 * q0[11]) + + (s[10] * y1[10] + s[10] * y1[10] - x1[10] * x1[10] - x1[10] * x1[10] - x1[10] * x1[10] + 65535 * q0[10]) + + (s[11] * y1[9] + s[11] * y1[9] - x1[11] * x1[9] - x1[11] * x1[9] - x1[11] * x1[9] + 65535 * q0[9]) + + (s[12] * y1[8] + s[12] * y1[8] - x1[12] * x1[8] - x1[12] * x1[8] - x1[12] * x1[8] + 65535 * q0[8]) + + (s[13] * y1[7] + s[13] * y1[7] - x1[13] * x1[7] - x1[13] * x1[7] - x1[13] * x1[7] + 65535 * q0[7]) + + (s[14] * y1[6] + s[14] * y1[6] - x1[14] * x1[6] - x1[14] * x1[6] - x1[14] * x1[6] + 65535 * q0[6]) + + (s[15] * y1[5] + s[15] * y1[5] - x1[15] * x1[5] - x1[15] * x1[5] - x1[15] * x1[5] + 65535 * q0[5]) + - 262140; + + pol eq2_21 = + (s[6] * y1[15] + s[6] * y1[15] - x1[6] * x1[15] - x1[6] * x1[15] - x1[6] * x1[15] + 65535 * q0[15]) + + (s[7] * y1[14] + s[7] * y1[14] - x1[7] * x1[14] - x1[7] * x1[14] - x1[7] * x1[14] + 65535 * q0[14]) + + (s[8] * y1[13] + s[8] * y1[13] - x1[8] * x1[13] - x1[8] * x1[13] - x1[8] * x1[13] + 65535 * q0[13]) + + (s[9] * y1[12] + s[9] * y1[12] - x1[9] * x1[12] - x1[9] * x1[12] - x1[9] * x1[12] + 65535 * q0[12]) + + (s[10] * y1[11] + s[10] * y1[11] - x1[10] * x1[11] - x1[10] * x1[11] - x1[10] * x1[11] + 65535 * q0[11]) + + (s[11] * y1[10] + s[11] * y1[10] - x1[11] * x1[10] - x1[11] * x1[10] - x1[11] * x1[10] + 65535 * q0[10]) + + (s[12] * y1[9] + s[12] * y1[9] - x1[12] * x1[9] - x1[12] * x1[9] - x1[12] * x1[9] + 65535 * q0[9]) + + (s[13] * y1[8] + s[13] * y1[8] - x1[13] * x1[8] - x1[13] * x1[8] - x1[13] * x1[8] + 65535 * q0[8]) + + (s[14] * y1[7] + s[14] * y1[7] - x1[14] * x1[7] - x1[14] * x1[7] - x1[14] * x1[7] + 65535 * q0[7]) + + (s[15] * y1[6] + s[15] * y1[6] - x1[15] * x1[6] - x1[15] * x1[6] - x1[15] * x1[6] + 65535 * q0[6]) + - 262140; + + pol eq2_22 = + (s[7] * y1[15] + s[7] * y1[15] - x1[7] * x1[15] - x1[7] * x1[15] - x1[7] * x1[15] + 65535 * q0[15]) + + (s[8] * y1[14] + s[8] * y1[14] - x1[8] * x1[14] - x1[8] * x1[14] - x1[8] * x1[14] + 65535 * q0[14]) + + (s[9] * y1[13] + s[9] * y1[13] - x1[9] * x1[13] - x1[9] * x1[13] - x1[9] * x1[13] + 65535 * q0[13]) + + (s[10] * y1[12] + s[10] * y1[12] - x1[10] * x1[12] - x1[10] * x1[12] - x1[10] * x1[12] + 65535 * q0[12]) + + (s[11] * y1[11] + s[11] * y1[11] - x1[11] * x1[11] - x1[11] * x1[11] - x1[11] * x1[11] + 65535 * q0[11]) + + (s[12] * y1[10] + s[12] * y1[10] - x1[12] * x1[10] - x1[12] * x1[10] - x1[12] * x1[10] + 65535 * q0[10]) + + (s[13] * y1[9] + s[13] * y1[9] - x1[13] * x1[9] - x1[13] * x1[9] - x1[13] * x1[9] + 65535 * q0[9]) + + (s[14] * y1[8] + s[14] * y1[8] - x1[14] * x1[8] - x1[14] * x1[8] - x1[14] * x1[8] + 65535 * q0[8]) + + (s[15] * y1[7] + s[15] * y1[7] - x1[15] * x1[7] - x1[15] * x1[7] - x1[15] * x1[7] + 65535 * q0[7]) + - 262140; + + pol eq2_23 = + (s[8] * y1[15] + s[8] * y1[15] - x1[8] * x1[15] - x1[8] * x1[15] - x1[8] * x1[15] + 65535 * q0[15]) + + (s[9] * y1[14] + s[9] * y1[14] - x1[9] * x1[14] - x1[9] * x1[14] - x1[9] * x1[14] + 65535 * q0[14]) + + (s[10] * y1[13] + s[10] * y1[13] - x1[10] * x1[13] - x1[10] * x1[13] - x1[10] * x1[13] + 65535 * q0[13]) + + (s[11] * y1[12] + s[11] * y1[12] - x1[11] * x1[12] - x1[11] * x1[12] - x1[11] * x1[12] + 65535 * q0[12]) + + (s[12] * y1[11] + s[12] * y1[11] - x1[12] * x1[11] - x1[12] * x1[11] - x1[12] * x1[11] + 65535 * q0[11]) + + (s[13] * y1[10] + s[13] * y1[10] - x1[13] * x1[10] - x1[13] * x1[10] - x1[13] * x1[10] + 65535 * q0[10]) + + (s[14] * y1[9] + s[14] * y1[9] - x1[14] * x1[9] - x1[14] * x1[9] - x1[14] * x1[9] + 65535 * q0[9]) + + (s[15] * y1[8] + s[15] * y1[8] - x1[15] * x1[8] - x1[15] * x1[8] - x1[15] * x1[8] + 65535 * q0[8]) + - 262140; + + pol eq2_24 = + (s[9] * y1[15] + s[9] * y1[15] - x1[9] * x1[15] - x1[9] * x1[15] - x1[9] * x1[15] + 65535 * q0[15]) + + (s[10] * y1[14] + s[10] * y1[14] - x1[10] * x1[14] - x1[10] * x1[14] - x1[10] * x1[14] + 65535 * q0[14]) + + (s[11] * y1[13] + s[11] * y1[13] - x1[11] * x1[13] - x1[11] * x1[13] - x1[11] * x1[13] + 65535 * q0[13]) + + (s[12] * y1[12] + s[12] * y1[12] - x1[12] * x1[12] - x1[12] * x1[12] - x1[12] * x1[12] + 65535 * q0[12]) + + (s[13] * y1[11] + s[13] * y1[11] - x1[13] * x1[11] - x1[13] * x1[11] - x1[13] * x1[11] + 65535 * q0[11]) + + (s[14] * y1[10] + s[14] * y1[10] - x1[14] * x1[10] - x1[14] * x1[10] - x1[14] * x1[10] + 65535 * q0[10]) + + (s[15] * y1[9] + s[15] * y1[9] - x1[15] * x1[9] - x1[15] * x1[9] - x1[15] * x1[9] + 65535 * q0[9]) + - 262140; + + pol eq2_25 = + (s[10] * y1[15] + s[10] * y1[15] - x1[10] * x1[15] - x1[10] * x1[15] - x1[10] * x1[15] + 65535 * q0[15]) + + (s[11] * y1[14] + s[11] * y1[14] - x1[11] * x1[14] - x1[11] * x1[14] - x1[11] * x1[14] + 65535 * q0[14]) + + (s[12] * y1[13] + s[12] * y1[13] - x1[12] * x1[13] - x1[12] * x1[13] - x1[12] * x1[13] + 65535 * q0[13]) + + (s[13] * y1[12] + s[13] * y1[12] - x1[13] * x1[12] - x1[13] * x1[12] - x1[13] * x1[12] + 65535 * q0[12]) + + (s[14] * y1[11] + s[14] * y1[11] - x1[14] * x1[11] - x1[14] * x1[11] - x1[14] * x1[11] + 65535 * q0[11]) + + (s[15] * y1[10] + s[15] * y1[10] - x1[15] * x1[10] - x1[15] * x1[10] - x1[15] * x1[10] + 65535 * q0[10]) + - 262140; + + pol eq2_26 = + (s[11] * y1[15] + s[11] * y1[15] - x1[11] * x1[15] - x1[11] * x1[15] - x1[11] * x1[15] + 65535 * q0[15]) + + (s[12] * y1[14] + s[12] * y1[14] - x1[12] * x1[14] - x1[12] * x1[14] - x1[12] * x1[14] + 65535 * q0[14]) + + (s[13] * y1[13] + s[13] * y1[13] - x1[13] * x1[13] - x1[13] * x1[13] - x1[13] * x1[13] + 65535 * q0[13]) + + (s[14] * y1[12] + s[14] * y1[12] - x1[14] * x1[12] - x1[14] * x1[12] - x1[14] * x1[12] + 65535 * q0[12]) + + (s[15] * y1[11] + s[15] * y1[11] - x1[15] * x1[11] - x1[15] * x1[11] - x1[15] * x1[11] + 65535 * q0[11]) + - 262140; + + pol eq2_27 = + (s[12] * y1[15] + s[12] * y1[15] - x1[12] * x1[15] - x1[12] * x1[15] - x1[12] * x1[15] + 65535 * q0[15]) + + (s[13] * y1[14] + s[13] * y1[14] - x1[13] * x1[14] - x1[13] * x1[14] - x1[13] * x1[14] + 65535 * q0[14]) + + (s[14] * y1[13] + s[14] * y1[13] - x1[14] * x1[13] - x1[14] * x1[13] - x1[14] * x1[13] + 65535 * q0[13]) + + (s[15] * y1[12] + s[15] * y1[12] - x1[15] * x1[12] - x1[15] * x1[12] - x1[15] * x1[12] + 65535 * q0[12]) + - 262140; + + pol eq2_28 = + (s[13] * y1[15] + s[13] * y1[15] - x1[13] * x1[15] - x1[13] * x1[15] - x1[13] * x1[15] + 65535 * q0[15]) + + (s[14] * y1[14] + s[14] * y1[14] - x1[14] * x1[14] - x1[14] * x1[14] - x1[14] * x1[14] + 65535 * q0[14]) + + (s[15] * y1[13] + s[15] * y1[13] - x1[15] * x1[13] - x1[15] * x1[13] - x1[15] * x1[13] + 65535 * q0[13]) + - 262140; + + pol eq2_29 = + (s[14] * y1[15] + s[14] * y1[15] - x1[14] * x1[15] - x1[14] * x1[15] - x1[14] * x1[15] + 65535 * q0[15]) + + (s[15] * y1[14] + s[15] * y1[14] - x1[15] * x1[14] - x1[15] * x1[14] - x1[15] * x1[14] + 65535 * q0[14]) + - 262140; + + pol eq2_30 = + (s[15] * y1[15] + s[15] * y1[15] - x1[15] * x1[15] - x1[15] * x1[15] - x1[15] * x1[15] + 65535 * q0[15]) + - 262140; + + pol eq2_31 = - 262140; + + + /******* + * + * EQ3: s * s - x1 - x2 - x3 - p * (q1 - offset) = 0 + * + *******/ + + pol eq3_0 = + (s[0] * s[0] - 64559 * q1[0]) + + 258236 - x1[0] - x2[0] - x3[0]; + + pol eq3_1 = + (s[0] * s[1] - 64559 * q1[1]) + + (s[1] * s[0] - 65535 * q1[0]) + + 262140 - x1[1] - x2[1] - x3[1]; + + pol eq3_2 = + (s[0] * s[2] - 64559 * q1[2]) + + (s[1] * s[1] - 65535 * q1[1]) + + (s[2] * s[0] - 65534 * q1[0]) + + 262136 - x1[2] - x2[2] - x3[2]; + + pol eq3_3 = + (s[0] * s[3] - 64559 * q1[3]) + + (s[1] * s[2] - 65535 * q1[2]) + + (s[2] * s[1] - 65534 * q1[1]) + + (s[3] * s[0] - 65535 * q1[0]) + + 262140 - x1[3] - x2[3] - x3[3]; + + pol eq3_4 = + (s[0] * s[4] - 64559 * q1[4]) + + (s[1] * s[3] - 65535 * q1[3]) + + (s[2] * s[2] - 65534 * q1[2]) + + (s[3] * s[1] - 65535 * q1[1]) + + (s[4] * s[0] - 65535 * q1[0]) + + 262140 - x1[4] - x2[4] - x3[4]; + + pol eq3_5 = + (s[0] * s[5] - 64559 * q1[5]) + + (s[1] * s[4] - 65535 * q1[4]) + + (s[2] * s[3] - 65534 * q1[3]) + + (s[3] * s[2] - 65535 * q1[2]) + + (s[4] * s[1] - 65535 * q1[1]) + + (s[5] * s[0] - 65535 * q1[0]) + + 262140 - x1[5] - x2[5] - x3[5]; + + pol eq3_6 = + (s[0] * s[6] - 64559 * q1[6]) + + (s[1] * s[5] - 65535 * q1[5]) + + (s[2] * s[4] - 65534 * q1[4]) + + (s[3] * s[3] - 65535 * q1[3]) + + (s[4] * s[2] - 65535 * q1[2]) + + (s[5] * s[1] - 65535 * q1[1]) + + (s[6] * s[0] - 65535 * q1[0]) + + 262140 - x1[6] - x2[6] - x3[6]; + + pol eq3_7 = + (s[0] * s[7] - 64559 * q1[7]) + + (s[1] * s[6] - 65535 * q1[6]) + + (s[2] * s[5] - 65534 * q1[5]) + + (s[3] * s[4] - 65535 * q1[4]) + + (s[4] * s[3] - 65535 * q1[3]) + + (s[5] * s[2] - 65535 * q1[2]) + + (s[6] * s[1] - 65535 * q1[1]) + + (s[7] * s[0] - 65535 * q1[0]) + + 262140 - x1[7] - x2[7] - x3[7]; + + pol eq3_8 = + (s[0] * s[8] - 64559 * q1[8]) + + (s[1] * s[7] - 65535 * q1[7]) + + (s[2] * s[6] - 65534 * q1[6]) + + (s[3] * s[5] - 65535 * q1[5]) + + (s[4] * s[4] - 65535 * q1[4]) + + (s[5] * s[3] - 65535 * q1[3]) + + (s[6] * s[2] - 65535 * q1[2]) + + (s[7] * s[1] - 65535 * q1[1]) + + (s[8] * s[0] - 65535 * q1[0]) + + 262140 - x1[8] - x2[8] - x3[8]; + + pol eq3_9 = + (s[0] * s[9] - 64559 * q1[9]) + + (s[1] * s[8] - 65535 * q1[8]) + + (s[2] * s[7] - 65534 * q1[7]) + + (s[3] * s[6] - 65535 * q1[6]) + + (s[4] * s[5] - 65535 * q1[5]) + + (s[5] * s[4] - 65535 * q1[4]) + + (s[6] * s[3] - 65535 * q1[3]) + + (s[7] * s[2] - 65535 * q1[2]) + + (s[8] * s[1] - 65535 * q1[1]) + + (s[9] * s[0] - 65535 * q1[0]) + + 262140 - x1[9] - x2[9] - x3[9]; + + pol eq3_10 = + (s[0] * s[10] - 64559 * q1[10]) + + (s[1] * s[9] - 65535 * q1[9]) + + (s[2] * s[8] - 65534 * q1[8]) + + (s[3] * s[7] - 65535 * q1[7]) + + (s[4] * s[6] - 65535 * q1[6]) + + (s[5] * s[5] - 65535 * q1[5]) + + (s[6] * s[4] - 65535 * q1[4]) + + (s[7] * s[3] - 65535 * q1[3]) + + (s[8] * s[2] - 65535 * q1[2]) + + (s[9] * s[1] - 65535 * q1[1]) + + (s[10] * s[0] - 65535 * q1[0]) + + 262140 - x1[10] - x2[10] - x3[10]; + + pol eq3_11 = + (s[0] * s[11] - 64559 * q1[11]) + + (s[1] * s[10] - 65535 * q1[10]) + + (s[2] * s[9] - 65534 * q1[9]) + + (s[3] * s[8] - 65535 * q1[8]) + + (s[4] * s[7] - 65535 * q1[7]) + + (s[5] * s[6] - 65535 * q1[6]) + + (s[6] * s[5] - 65535 * q1[5]) + + (s[7] * s[4] - 65535 * q1[4]) + + (s[8] * s[3] - 65535 * q1[3]) + + (s[9] * s[2] - 65535 * q1[2]) + + (s[10] * s[1] - 65535 * q1[1]) + + (s[11] * s[0] - 65535 * q1[0]) + + 262140 - x1[11] - x2[11] - x3[11]; + + pol eq3_12 = + (s[0] * s[12] - 64559 * q1[12]) + + (s[1] * s[11] - 65535 * q1[11]) + + (s[2] * s[10] - 65534 * q1[10]) + + (s[3] * s[9] - 65535 * q1[9]) + + (s[4] * s[8] - 65535 * q1[8]) + + (s[5] * s[7] - 65535 * q1[7]) + + (s[6] * s[6] - 65535 * q1[6]) + + (s[7] * s[5] - 65535 * q1[5]) + + (s[8] * s[4] - 65535 * q1[4]) + + (s[9] * s[3] - 65535 * q1[3]) + + (s[10] * s[2] - 65535 * q1[2]) + + (s[11] * s[1] - 65535 * q1[1]) + + (s[12] * s[0] - 65535 * q1[0]) + + 262140 - x1[12] - x2[12] - x3[12]; + + pol eq3_13 = + (s[0] * s[13] - 64559 * q1[13]) + + (s[1] * s[12] - 65535 * q1[12]) + + (s[2] * s[11] - 65534 * q1[11]) + + (s[3] * s[10] - 65535 * q1[10]) + + (s[4] * s[9] - 65535 * q1[9]) + + (s[5] * s[8] - 65535 * q1[8]) + + (s[6] * s[7] - 65535 * q1[7]) + + (s[7] * s[6] - 65535 * q1[6]) + + (s[8] * s[5] - 65535 * q1[5]) + + (s[9] * s[4] - 65535 * q1[4]) + + (s[10] * s[3] - 65535 * q1[3]) + + (s[11] * s[2] - 65535 * q1[2]) + + (s[12] * s[1] - 65535 * q1[1]) + + (s[13] * s[0] - 65535 * q1[0]) + + 262140 - x1[13] - x2[13] - x3[13]; + + pol eq3_14 = + (s[0] * s[14] - 64559 * q1[14]) + + (s[1] * s[13] - 65535 * q1[13]) + + (s[2] * s[12] - 65534 * q1[12]) + + (s[3] * s[11] - 65535 * q1[11]) + + (s[4] * s[10] - 65535 * q1[10]) + + (s[5] * s[9] - 65535 * q1[9]) + + (s[6] * s[8] - 65535 * q1[8]) + + (s[7] * s[7] - 65535 * q1[7]) + + (s[8] * s[6] - 65535 * q1[6]) + + (s[9] * s[5] - 65535 * q1[5]) + + (s[10] * s[4] - 65535 * q1[4]) + + (s[11] * s[3] - 65535 * q1[3]) + + (s[12] * s[2] - 65535 * q1[2]) + + (s[13] * s[1] - 65535 * q1[1]) + + (s[14] * s[0] - 65535 * q1[0]) + + 262140 - x1[14] - x2[14] - x3[14]; + + pol eq3_15 = + (s[0] * s[15] - 64559 * q1[15]) + + (s[1] * s[14] - 65535 * q1[14]) + + (s[2] * s[13] - 65534 * q1[13]) + + (s[3] * s[12] - 65535 * q1[12]) + + (s[4] * s[11] - 65535 * q1[11]) + + (s[5] * s[10] - 65535 * q1[10]) + + (s[6] * s[9] - 65535 * q1[9]) + + (s[7] * s[8] - 65535 * q1[8]) + + (s[8] * s[7] - 65535 * q1[7]) + + (s[9] * s[6] - 65535 * q1[6]) + + (s[10] * s[5] - 65535 * q1[5]) + + (s[11] * s[4] - 65535 * q1[4]) + + (s[12] * s[3] - 65535 * q1[3]) + + (s[13] * s[2] - 65535 * q1[2]) + + (s[14] * s[1] - 65535 * q1[1]) + + (s[15] * s[0] - 65535 * q1[0]) + + 262140 - x1[15] - x2[15] - x3[15]; + + pol eq3_16 = + (s[1] * s[15] - 65535 * q1[15]) + + (s[2] * s[14] - 65534 * q1[14]) + + (s[3] * s[13] - 65535 * q1[13]) + + (s[4] * s[12] - 65535 * q1[12]) + + (s[5] * s[11] - 65535 * q1[11]) + + (s[6] * s[10] - 65535 * q1[10]) + + (s[7] * s[9] - 65535 * q1[9]) + + (s[8] * s[8] - 65535 * q1[8]) + + (s[9] * s[7] - 65535 * q1[7]) + + (s[10] * s[6] - 65535 * q1[6]) + + (s[11] * s[5] - 65535 * q1[5]) + + (s[12] * s[4] - 65535 * q1[4]) + + (s[13] * s[3] - 65535 * q1[3]) + + (s[14] * s[2] - 65535 * q1[2]) + + (s[15] * s[1] - 65535 * q1[1]); + + pol eq3_17 = + (s[2] * s[15] - 65534 * q1[15]) + + (s[3] * s[14] - 65535 * q1[14]) + + (s[4] * s[13] - 65535 * q1[13]) + + (s[5] * s[12] - 65535 * q1[12]) + + (s[6] * s[11] - 65535 * q1[11]) + + (s[7] * s[10] - 65535 * q1[10]) + + (s[8] * s[9] - 65535 * q1[9]) + + (s[9] * s[8] - 65535 * q1[8]) + + (s[10] * s[7] - 65535 * q1[7]) + + (s[11] * s[6] - 65535 * q1[6]) + + (s[12] * s[5] - 65535 * q1[5]) + + (s[13] * s[4] - 65535 * q1[4]) + + (s[14] * s[3] - 65535 * q1[3]) + + (s[15] * s[2] - 65535 * q1[2]); + + pol eq3_18 = + (s[3] * s[15] - 65535 * q1[15]) + + (s[4] * s[14] - 65535 * q1[14]) + + (s[5] * s[13] - 65535 * q1[13]) + + (s[6] * s[12] - 65535 * q1[12]) + + (s[7] * s[11] - 65535 * q1[11]) + + (s[8] * s[10] - 65535 * q1[10]) + + (s[9] * s[9] - 65535 * q1[9]) + + (s[10] * s[8] - 65535 * q1[8]) + + (s[11] * s[7] - 65535 * q1[7]) + + (s[12] * s[6] - 65535 * q1[6]) + + (s[13] * s[5] - 65535 * q1[5]) + + (s[14] * s[4] - 65535 * q1[4]) + + (s[15] * s[3] - 65535 * q1[3]); + + pol eq3_19 = + (s[4] * s[15] - 65535 * q1[15]) + + (s[5] * s[14] - 65535 * q1[14]) + + (s[6] * s[13] - 65535 * q1[13]) + + (s[7] * s[12] - 65535 * q1[12]) + + (s[8] * s[11] - 65535 * q1[11]) + + (s[9] * s[10] - 65535 * q1[10]) + + (s[10] * s[9] - 65535 * q1[9]) + + (s[11] * s[8] - 65535 * q1[8]) + + (s[12] * s[7] - 65535 * q1[7]) + + (s[13] * s[6] - 65535 * q1[6]) + + (s[14] * s[5] - 65535 * q1[5]) + + (s[15] * s[4] - 65535 * q1[4]); + + pol eq3_20 = + (s[5] * s[15] - 65535 * q1[15]) + + (s[6] * s[14] - 65535 * q1[14]) + + (s[7] * s[13] - 65535 * q1[13]) + + (s[8] * s[12] - 65535 * q1[12]) + + (s[9] * s[11] - 65535 * q1[11]) + + (s[10] * s[10] - 65535 * q1[10]) + + (s[11] * s[9] - 65535 * q1[9]) + + (s[12] * s[8] - 65535 * q1[8]) + + (s[13] * s[7] - 65535 * q1[7]) + + (s[14] * s[6] - 65535 * q1[6]) + + (s[15] * s[5] - 65535 * q1[5]); + + pol eq3_21 = + (s[6] * s[15] - 65535 * q1[15]) + + (s[7] * s[14] - 65535 * q1[14]) + + (s[8] * s[13] - 65535 * q1[13]) + + (s[9] * s[12] - 65535 * q1[12]) + + (s[10] * s[11] - 65535 * q1[11]) + + (s[11] * s[10] - 65535 * q1[10]) + + (s[12] * s[9] - 65535 * q1[9]) + + (s[13] * s[8] - 65535 * q1[8]) + + (s[14] * s[7] - 65535 * q1[7]) + + (s[15] * s[6] - 65535 * q1[6]); + + pol eq3_22 = + (s[7] * s[15] - 65535 * q1[15]) + + (s[8] * s[14] - 65535 * q1[14]) + + (s[9] * s[13] - 65535 * q1[13]) + + (s[10] * s[12] - 65535 * q1[12]) + + (s[11] * s[11] - 65535 * q1[11]) + + (s[12] * s[10] - 65535 * q1[10]) + + (s[13] * s[9] - 65535 * q1[9]) + + (s[14] * s[8] - 65535 * q1[8]) + + (s[15] * s[7] - 65535 * q1[7]); + + pol eq3_23 = + (s[8] * s[15] - 65535 * q1[15]) + + (s[9] * s[14] - 65535 * q1[14]) + + (s[10] * s[13] - 65535 * q1[13]) + + (s[11] * s[12] - 65535 * q1[12]) + + (s[12] * s[11] - 65535 * q1[11]) + + (s[13] * s[10] - 65535 * q1[10]) + + (s[14] * s[9] - 65535 * q1[9]) + + (s[15] * s[8] - 65535 * q1[8]); + + pol eq3_24 = + (s[9] * s[15] - 65535 * q1[15]) + + (s[10] * s[14] - 65535 * q1[14]) + + (s[11] * s[13] - 65535 * q1[13]) + + (s[12] * s[12] - 65535 * q1[12]) + + (s[13] * s[11] - 65535 * q1[11]) + + (s[14] * s[10] - 65535 * q1[10]) + + (s[15] * s[9] - 65535 * q1[9]); + + pol eq3_25 = + (s[10] * s[15] - 65535 * q1[15]) + + (s[11] * s[14] - 65535 * q1[14]) + + (s[12] * s[13] - 65535 * q1[13]) + + (s[13] * s[12] - 65535 * q1[12]) + + (s[14] * s[11] - 65535 * q1[11]) + + (s[15] * s[10] - 65535 * q1[10]); + + pol eq3_26 = + (s[11] * s[15] - 65535 * q1[15]) + + (s[12] * s[14] - 65535 * q1[14]) + + (s[13] * s[13] - 65535 * q1[13]) + + (s[14] * s[12] - 65535 * q1[12]) + + (s[15] * s[11] - 65535 * q1[11]); + + pol eq3_27 = + (s[12] * s[15] - 65535 * q1[15]) + + (s[13] * s[14] - 65535 * q1[14]) + + (s[14] * s[13] - 65535 * q1[13]) + + (s[15] * s[12] - 65535 * q1[12]); + + pol eq3_28 = + (s[13] * s[15] - 65535 * q1[15]) + + (s[14] * s[14] - 65535 * q1[14]) + + (s[15] * s[13] - 65535 * q1[13]); + + pol eq3_29 = + (s[14] * s[15] - 65535 * q1[15]) + + (s[15] * s[14] - 65535 * q1[14]); + + pol eq3_30 = + (s[15] * s[15] - 65535 * q1[15]); + + pol eq3_31 = + 0; + + + /******* + * + * EQ4: s * x1 - s * x3 - y1 - y3 + p * (q2 - offset) = 0 + * + *******/ + + pol eq4_0 = + (s[0] * x1[0] - s[0] * x3[0] + 64559 * q2[0]) + - y1[0] - y3[0]; + + pol eq4_1 = + (s[0] * x1[1] - s[0] * x3[1] + 64559 * q2[1]) + + (s[1] * x1[0] - s[1] * x3[0] + 65535 * q2[0]) + - y1[1] - y3[1]; + + pol eq4_2 = + (s[0] * x1[2] - s[0] * x3[2] + 64559 * q2[2]) + + (s[1] * x1[1] - s[1] * x3[1] + 65535 * q2[1]) + + (s[2] * x1[0] - s[2] * x3[0] + 65534 * q2[0]) + - y1[2] - y3[2]; + + pol eq4_3 = + (s[0] * x1[3] - s[0] * x3[3] + 64559 * q2[3]) + + (s[1] * x1[2] - s[1] * x3[2] + 65535 * q2[2]) + + (s[2] * x1[1] - s[2] * x3[1] + 65534 * q2[1]) + + (s[3] * x1[0] - s[3] * x3[0] + 65535 * q2[0]) + - y1[3] - y3[3]; + + pol eq4_4 = + (s[0] * x1[4] - s[0] * x3[4] + 64559 * q2[4]) + + (s[1] * x1[3] - s[1] * x3[3] + 65535 * q2[3]) + + (s[2] * x1[2] - s[2] * x3[2] + 65534 * q2[2]) + + (s[3] * x1[1] - s[3] * x3[1] + 65535 * q2[1]) + + (s[4] * x1[0] - s[4] * x3[0] + 65535 * q2[0]) + - y1[4] - y3[4]; + + pol eq4_5 = + (s[0] * x1[5] - s[0] * x3[5] + 64559 * q2[5]) + + (s[1] * x1[4] - s[1] * x3[4] + 65535 * q2[4]) + + (s[2] * x1[3] - s[2] * x3[3] + 65534 * q2[3]) + + (s[3] * x1[2] - s[3] * x3[2] + 65535 * q2[2]) + + (s[4] * x1[1] - s[4] * x3[1] + 65535 * q2[1]) + + (s[5] * x1[0] - s[5] * x3[0] + 65535 * q2[0]) + - y1[5] - y3[5]; + + pol eq4_6 = + (s[0] * x1[6] - s[0] * x3[6] + 64559 * q2[6]) + + (s[1] * x1[5] - s[1] * x3[5] + 65535 * q2[5]) + + (s[2] * x1[4] - s[2] * x3[4] + 65534 * q2[4]) + + (s[3] * x1[3] - s[3] * x3[3] + 65535 * q2[3]) + + (s[4] * x1[2] - s[4] * x3[2] + 65535 * q2[2]) + + (s[5] * x1[1] - s[5] * x3[1] + 65535 * q2[1]) + + (s[6] * x1[0] - s[6] * x3[0] + 65535 * q2[0]) + - y1[6] - y3[6]; + + pol eq4_7 = + (s[0] * x1[7] - s[0] * x3[7] + 64559 * q2[7]) + + (s[1] * x1[6] - s[1] * x3[6] + 65535 * q2[6]) + + (s[2] * x1[5] - s[2] * x3[5] + 65534 * q2[5]) + + (s[3] * x1[4] - s[3] * x3[4] + 65535 * q2[4]) + + (s[4] * x1[3] - s[4] * x3[3] + 65535 * q2[3]) + + (s[5] * x1[2] - s[5] * x3[2] + 65535 * q2[2]) + + (s[6] * x1[1] - s[6] * x3[1] + 65535 * q2[1]) + + (s[7] * x1[0] - s[7] * x3[0] + 65535 * q2[0]) + - y1[7] - y3[7]; + + pol eq4_8 = + (s[0] * x1[8] - s[0] * x3[8] + 64559 * q2[8]) + + (s[1] * x1[7] - s[1] * x3[7] + 65535 * q2[7]) + + (s[2] * x1[6] - s[2] * x3[6] + 65534 * q2[6]) + + (s[3] * x1[5] - s[3] * x3[5] + 65535 * q2[5]) + + (s[4] * x1[4] - s[4] * x3[4] + 65535 * q2[4]) + + (s[5] * x1[3] - s[5] * x3[3] + 65535 * q2[3]) + + (s[6] * x1[2] - s[6] * x3[2] + 65535 * q2[2]) + + (s[7] * x1[1] - s[7] * x3[1] + 65535 * q2[1]) + + (s[8] * x1[0] - s[8] * x3[0] + 65535 * q2[0]) + - y1[8] - y3[8]; + + pol eq4_9 = + (s[0] * x1[9] - s[0] * x3[9] + 64559 * q2[9]) + + (s[1] * x1[8] - s[1] * x3[8] + 65535 * q2[8]) + + (s[2] * x1[7] - s[2] * x3[7] + 65534 * q2[7]) + + (s[3] * x1[6] - s[3] * x3[6] + 65535 * q2[6]) + + (s[4] * x1[5] - s[4] * x3[5] + 65535 * q2[5]) + + (s[5] * x1[4] - s[5] * x3[4] + 65535 * q2[4]) + + (s[6] * x1[3] - s[6] * x3[3] + 65535 * q2[3]) + + (s[7] * x1[2] - s[7] * x3[2] + 65535 * q2[2]) + + (s[8] * x1[1] - s[8] * x3[1] + 65535 * q2[1]) + + (s[9] * x1[0] - s[9] * x3[0] + 65535 * q2[0]) + - y1[9] - y3[9]; + + pol eq4_10 = + (s[0] * x1[10] - s[0] * x3[10] + 64559 * q2[10]) + + (s[1] * x1[9] - s[1] * x3[9] + 65535 * q2[9]) + + (s[2] * x1[8] - s[2] * x3[8] + 65534 * q2[8]) + + (s[3] * x1[7] - s[3] * x3[7] + 65535 * q2[7]) + + (s[4] * x1[6] - s[4] * x3[6] + 65535 * q2[6]) + + (s[5] * x1[5] - s[5] * x3[5] + 65535 * q2[5]) + + (s[6] * x1[4] - s[6] * x3[4] + 65535 * q2[4]) + + (s[7] * x1[3] - s[7] * x3[3] + 65535 * q2[3]) + + (s[8] * x1[2] - s[8] * x3[2] + 65535 * q2[2]) + + (s[9] * x1[1] - s[9] * x3[1] + 65535 * q2[1]) + + (s[10] * x1[0] - s[10] * x3[0] + 65535 * q2[0]) + - y1[10] - y3[10]; + + pol eq4_11 = + (s[0] * x1[11] - s[0] * x3[11] + 64559 * q2[11]) + + (s[1] * x1[10] - s[1] * x3[10] + 65535 * q2[10]) + + (s[2] * x1[9] - s[2] * x3[9] + 65534 * q2[9]) + + (s[3] * x1[8] - s[3] * x3[8] + 65535 * q2[8]) + + (s[4] * x1[7] - s[4] * x3[7] + 65535 * q2[7]) + + (s[5] * x1[6] - s[5] * x3[6] + 65535 * q2[6]) + + (s[6] * x1[5] - s[6] * x3[5] + 65535 * q2[5]) + + (s[7] * x1[4] - s[7] * x3[4] + 65535 * q2[4]) + + (s[8] * x1[3] - s[8] * x3[3] + 65535 * q2[3]) + + (s[9] * x1[2] - s[9] * x3[2] + 65535 * q2[2]) + + (s[10] * x1[1] - s[10] * x3[1] + 65535 * q2[1]) + + (s[11] * x1[0] - s[11] * x3[0] + 65535 * q2[0]) + - y1[11] - y3[11]; + + pol eq4_12 = + (s[0] * x1[12] - s[0] * x3[12] + 64559 * q2[12]) + + (s[1] * x1[11] - s[1] * x3[11] + 65535 * q2[11]) + + (s[2] * x1[10] - s[2] * x3[10] + 65534 * q2[10]) + + (s[3] * x1[9] - s[3] * x3[9] + 65535 * q2[9]) + + (s[4] * x1[8] - s[4] * x3[8] + 65535 * q2[8]) + + (s[5] * x1[7] - s[5] * x3[7] + 65535 * q2[7]) + + (s[6] * x1[6] - s[6] * x3[6] + 65535 * q2[6]) + + (s[7] * x1[5] - s[7] * x3[5] + 65535 * q2[5]) + + (s[8] * x1[4] - s[8] * x3[4] + 65535 * q2[4]) + + (s[9] * x1[3] - s[9] * x3[3] + 65535 * q2[3]) + + (s[10] * x1[2] - s[10] * x3[2] + 65535 * q2[2]) + + (s[11] * x1[1] - s[11] * x3[1] + 65535 * q2[1]) + + (s[12] * x1[0] - s[12] * x3[0] + 65535 * q2[0]) + - y1[12] - y3[12]; + + pol eq4_13 = + (s[0] * x1[13] - s[0] * x3[13] + 64559 * q2[13]) + + (s[1] * x1[12] - s[1] * x3[12] + 65535 * q2[12]) + + (s[2] * x1[11] - s[2] * x3[11] + 65534 * q2[11]) + + (s[3] * x1[10] - s[3] * x3[10] + 65535 * q2[10]) + + (s[4] * x1[9] - s[4] * x3[9] + 65535 * q2[9]) + + (s[5] * x1[8] - s[5] * x3[8] + 65535 * q2[8]) + + (s[6] * x1[7] - s[6] * x3[7] + 65535 * q2[7]) + + (s[7] * x1[6] - s[7] * x3[6] + 65535 * q2[6]) + + (s[8] * x1[5] - s[8] * x3[5] + 65535 * q2[5]) + + (s[9] * x1[4] - s[9] * x3[4] + 65535 * q2[4]) + + (s[10] * x1[3] - s[10] * x3[3] + 65535 * q2[3]) + + (s[11] * x1[2] - s[11] * x3[2] + 65535 * q2[2]) + + (s[12] * x1[1] - s[12] * x3[1] + 65535 * q2[1]) + + (s[13] * x1[0] - s[13] * x3[0] + 65535 * q2[0]) + - y1[13] - y3[13]; + + pol eq4_14 = + (s[0] * x1[14] - s[0] * x3[14] + 64559 * q2[14]) + + (s[1] * x1[13] - s[1] * x3[13] + 65535 * q2[13]) + + (s[2] * x1[12] - s[2] * x3[12] + 65534 * q2[12]) + + (s[3] * x1[11] - s[3] * x3[11] + 65535 * q2[11]) + + (s[4] * x1[10] - s[4] * x3[10] + 65535 * q2[10]) + + (s[5] * x1[9] - s[5] * x3[9] + 65535 * q2[9]) + + (s[6] * x1[8] - s[6] * x3[8] + 65535 * q2[8]) + + (s[7] * x1[7] - s[7] * x3[7] + 65535 * q2[7]) + + (s[8] * x1[6] - s[8] * x3[6] + 65535 * q2[6]) + + (s[9] * x1[5] - s[9] * x3[5] + 65535 * q2[5]) + + (s[10] * x1[4] - s[10] * x3[4] + 65535 * q2[4]) + + (s[11] * x1[3] - s[11] * x3[3] + 65535 * q2[3]) + + (s[12] * x1[2] - s[12] * x3[2] + 65535 * q2[2]) + + (s[13] * x1[1] - s[13] * x3[1] + 65535 * q2[1]) + + (s[14] * x1[0] - s[14] * x3[0] + 65535 * q2[0]) + - y1[14] - y3[14]; + + pol eq4_15 = + (s[0] * x1[15] - s[0] * x3[15] + 64559 * q2[15]) + + (s[1] * x1[14] - s[1] * x3[14] + 65535 * q2[14]) + + (s[2] * x1[13] - s[2] * x3[13] + 65534 * q2[13]) + + (s[3] * x1[12] - s[3] * x3[12] + 65535 * q2[12]) + + (s[4] * x1[11] - s[4] * x3[11] + 65535 * q2[11]) + + (s[5] * x1[10] - s[5] * x3[10] + 65535 * q2[10]) + + (s[6] * x1[9] - s[6] * x3[9] + 65535 * q2[9]) + + (s[7] * x1[8] - s[7] * x3[8] + 65535 * q2[8]) + + (s[8] * x1[7] - s[8] * x3[7] + 65535 * q2[7]) + + (s[9] * x1[6] - s[9] * x3[6] + 65535 * q2[6]) + + (s[10] * x1[5] - s[10] * x3[5] + 65535 * q2[5]) + + (s[11] * x1[4] - s[11] * x3[4] + 65535 * q2[4]) + + (s[12] * x1[3] - s[12] * x3[3] + 65535 * q2[3]) + + (s[13] * x1[2] - s[13] * x3[2] + 65535 * q2[2]) + + (s[14] * x1[1] - s[14] * x3[1] + 65535 * q2[1]) + + (s[15] * x1[0] - s[15] * x3[0] + 65535 * q2[0]) + - y1[15] - y3[15]; + + pol eq4_16 = + (s[1] * x1[15] - s[1] * x3[15] + 65535 * q2[15]) + + (s[2] * x1[14] - s[2] * x3[14] + 65534 * q2[14]) + + (s[3] * x1[13] - s[3] * x3[13] + 65535 * q2[13]) + + (s[4] * x1[12] - s[4] * x3[12] + 65535 * q2[12]) + + (s[5] * x1[11] - s[5] * x3[11] + 65535 * q2[11]) + + (s[6] * x1[10] - s[6] * x3[10] + 65535 * q2[10]) + + (s[7] * x1[9] - s[7] * x3[9] + 65535 * q2[9]) + + (s[8] * x1[8] - s[8] * x3[8] + 65535 * q2[8]) + + (s[9] * x1[7] - s[9] * x3[7] + 65535 * q2[7]) + + (s[10] * x1[6] - s[10] * x3[6] + 65535 * q2[6]) + + (s[11] * x1[5] - s[11] * x3[5] + 65535 * q2[5]) + + (s[12] * x1[4] - s[12] * x3[4] + 65535 * q2[4]) + + (s[13] * x1[3] - s[13] * x3[3] + 65535 * q2[3]) + + (s[14] * x1[2] - s[14] * x3[2] + 65535 * q2[2]) + + (s[15] * x1[1] - s[15] * x3[1] + 65535 * q2[1]) + - 129118; + + pol eq4_17 = + (s[2] * x1[15] - s[2] * x3[15] + 65534 * q2[15]) + + (s[3] * x1[14] - s[3] * x3[14] + 65535 * q2[14]) + + (s[4] * x1[13] - s[4] * x3[13] + 65535 * q2[13]) + + (s[5] * x1[12] - s[5] * x3[12] + 65535 * q2[12]) + + (s[6] * x1[11] - s[6] * x3[11] + 65535 * q2[11]) + + (s[7] * x1[10] - s[7] * x3[10] + 65535 * q2[10]) + + (s[8] * x1[9] - s[8] * x3[9] + 65535 * q2[9]) + + (s[9] * x1[8] - s[9] * x3[8] + 65535 * q2[8]) + + (s[10] * x1[7] - s[10] * x3[7] + 65535 * q2[7]) + + (s[11] * x1[6] - s[11] * x3[6] + 65535 * q2[6]) + + (s[12] * x1[5] - s[12] * x3[5] + 65535 * q2[5]) + + (s[13] * x1[4] - s[13] * x3[4] + 65535 * q2[4]) + + (s[14] * x1[3] - s[14] * x3[3] + 65535 * q2[3]) + + (s[15] * x1[2] - s[15] * x3[2] + 65535 * q2[2]) + - 131070; + + pol eq4_18 = + (s[3] * x1[15] - s[3] * x3[15] + 65535 * q2[15]) + + (s[4] * x1[14] - s[4] * x3[14] + 65535 * q2[14]) + + (s[5] * x1[13] - s[5] * x3[13] + 65535 * q2[13]) + + (s[6] * x1[12] - s[6] * x3[12] + 65535 * q2[12]) + + (s[7] * x1[11] - s[7] * x3[11] + 65535 * q2[11]) + + (s[8] * x1[10] - s[8] * x3[10] + 65535 * q2[10]) + + (s[9] * x1[9] - s[9] * x3[9] + 65535 * q2[9]) + + (s[10] * x1[8] - s[10] * x3[8] + 65535 * q2[8]) + + (s[11] * x1[7] - s[11] * x3[7] + 65535 * q2[7]) + + (s[12] * x1[6] - s[12] * x3[6] + 65535 * q2[6]) + + (s[13] * x1[5] - s[13] * x3[5] + 65535 * q2[5]) + + (s[14] * x1[4] - s[14] * x3[4] + 65535 * q2[4]) + + (s[15] * x1[3] - s[15] * x3[3] + 65535 * q2[3]) + - 131068; + + pol eq4_19 = + (s[4] * x1[15] - s[4] * x3[15] + 65535 * q2[15]) + + (s[5] * x1[14] - s[5] * x3[14] + 65535 * q2[14]) + + (s[6] * x1[13] - s[6] * x3[13] + 65535 * q2[13]) + + (s[7] * x1[12] - s[7] * x3[12] + 65535 * q2[12]) + + (s[8] * x1[11] - s[8] * x3[11] + 65535 * q2[11]) + + (s[9] * x1[10] - s[9] * x3[10] + 65535 * q2[10]) + + (s[10] * x1[9] - s[10] * x3[9] + 65535 * q2[9]) + + (s[11] * x1[8] - s[11] * x3[8] + 65535 * q2[8]) + + (s[12] * x1[7] - s[12] * x3[7] + 65535 * q2[7]) + + (s[13] * x1[6] - s[13] * x3[6] + 65535 * q2[6]) + + (s[14] * x1[5] - s[14] * x3[5] + 65535 * q2[5]) + + (s[15] * x1[4] - s[15] * x3[4] + 65535 * q2[4]) + - 131070; + + pol eq4_20 = + (s[5] * x1[15] - s[5] * x3[15] + 65535 * q2[15]) + + (s[6] * x1[14] - s[6] * x3[14] + 65535 * q2[14]) + + (s[7] * x1[13] - s[7] * x3[13] + 65535 * q2[13]) + + (s[8] * x1[12] - s[8] * x3[12] + 65535 * q2[12]) + + (s[9] * x1[11] - s[9] * x3[11] + 65535 * q2[11]) + + (s[10] * x1[10] - s[10] * x3[10] + 65535 * q2[10]) + + (s[11] * x1[9] - s[11] * x3[9] + 65535 * q2[9]) + + (s[12] * x1[8] - s[12] * x3[8] + 65535 * q2[8]) + + (s[13] * x1[7] - s[13] * x3[7] + 65535 * q2[7]) + + (s[14] * x1[6] - s[14] * x3[6] + 65535 * q2[6]) + + (s[15] * x1[5] - s[15] * x3[5] + 65535 * q2[5]) + - 131070; + + pol eq4_21 = + (s[6] * x1[15] - s[6] * x3[15] + 65535 * q2[15]) + + (s[7] * x1[14] - s[7] * x3[14] + 65535 * q2[14]) + + (s[8] * x1[13] - s[8] * x3[13] + 65535 * q2[13]) + + (s[9] * x1[12] - s[9] * x3[12] + 65535 * q2[12]) + + (s[10] * x1[11] - s[10] * x3[11] + 65535 * q2[11]) + + (s[11] * x1[10] - s[11] * x3[10] + 65535 * q2[10]) + + (s[12] * x1[9] - s[12] * x3[9] + 65535 * q2[9]) + + (s[13] * x1[8] - s[13] * x3[8] + 65535 * q2[8]) + + (s[14] * x1[7] - s[14] * x3[7] + 65535 * q2[7]) + + (s[15] * x1[6] - s[15] * x3[6] + 65535 * q2[6]) + - 131070; + + pol eq4_22 = + (s[7] * x1[15] - s[7] * x3[15] + 65535 * q2[15]) + + (s[8] * x1[14] - s[8] * x3[14] + 65535 * q2[14]) + + (s[9] * x1[13] - s[9] * x3[13] + 65535 * q2[13]) + + (s[10] * x1[12] - s[10] * x3[12] + 65535 * q2[12]) + + (s[11] * x1[11] - s[11] * x3[11] + 65535 * q2[11]) + + (s[12] * x1[10] - s[12] * x3[10] + 65535 * q2[10]) + + (s[13] * x1[9] - s[13] * x3[9] + 65535 * q2[9]) + + (s[14] * x1[8] - s[14] * x3[8] + 65535 * q2[8]) + + (s[15] * x1[7] - s[15] * x3[7] + 65535 * q2[7]) + - 131070; + + pol eq4_23 = + (s[8] * x1[15] - s[8] * x3[15] + 65535 * q2[15]) + + (s[9] * x1[14] - s[9] * x3[14] + 65535 * q2[14]) + + (s[10] * x1[13] - s[10] * x3[13] + 65535 * q2[13]) + + (s[11] * x1[12] - s[11] * x3[12] + 65535 * q2[12]) + + (s[12] * x1[11] - s[12] * x3[11] + 65535 * q2[11]) + + (s[13] * x1[10] - s[13] * x3[10] + 65535 * q2[10]) + + (s[14] * x1[9] - s[14] * x3[9] + 65535 * q2[9]) + + (s[15] * x1[8] - s[15] * x3[8] + 65535 * q2[8]) + - 131070; + + pol eq4_24 = + (s[9] * x1[15] - s[9] * x3[15] + 65535 * q2[15]) + + (s[10] * x1[14] - s[10] * x3[14] + 65535 * q2[14]) + + (s[11] * x1[13] - s[11] * x3[13] + 65535 * q2[13]) + + (s[12] * x1[12] - s[12] * x3[12] + 65535 * q2[12]) + + (s[13] * x1[11] - s[13] * x3[11] + 65535 * q2[11]) + + (s[14] * x1[10] - s[14] * x3[10] + 65535 * q2[10]) + + (s[15] * x1[9] - s[15] * x3[9] + 65535 * q2[9]) + - 131070; + + pol eq4_25 = + (s[10] * x1[15] - s[10] * x3[15] + 65535 * q2[15]) + + (s[11] * x1[14] - s[11] * x3[14] + 65535 * q2[14]) + + (s[12] * x1[13] - s[12] * x3[13] + 65535 * q2[13]) + + (s[13] * x1[12] - s[13] * x3[12] + 65535 * q2[12]) + + (s[14] * x1[11] - s[14] * x3[11] + 65535 * q2[11]) + + (s[15] * x1[10] - s[15] * x3[10] + 65535 * q2[10]) + - 131070; + + pol eq4_26 = + (s[11] * x1[15] - s[11] * x3[15] + 65535 * q2[15]) + + (s[12] * x1[14] - s[12] * x3[14] + 65535 * q2[14]) + + (s[13] * x1[13] - s[13] * x3[13] + 65535 * q2[13]) + + (s[14] * x1[12] - s[14] * x3[12] + 65535 * q2[12]) + + (s[15] * x1[11] - s[15] * x3[11] + 65535 * q2[11]) + - 131070; + + pol eq4_27 = + (s[12] * x1[15] - s[12] * x3[15] + 65535 * q2[15]) + + (s[13] * x1[14] - s[13] * x3[14] + 65535 * q2[14]) + + (s[14] * x1[13] - s[14] * x3[13] + 65535 * q2[13]) + + (s[15] * x1[12] - s[15] * x3[12] + 65535 * q2[12]) + - 131070; + + pol eq4_28 = + (s[13] * x1[15] - s[13] * x3[15] + 65535 * q2[15]) + + (s[14] * x1[14] - s[14] * x3[14] + 65535 * q2[14]) + + (s[15] * x1[13] - s[15] * x3[13] + 65535 * q2[13]) + - 131070; + + pol eq4_29 = + (s[14] * x1[15] - s[14] * x3[15] + 65535 * q2[15]) + + (s[15] * x1[14] - s[15] * x3[14] + 65535 * q2[14]) + - 131070; + + pol eq4_30 = + (s[15] * x1[15] - s[15] * x3[15] + 65535 * q2[15]) + - 131070; + + pol eq4_31 = - 131070; + + + /******* + * + * EQ5: x1 * x2 - y1 * y2 - x3 + p * (q1 - offset) = 0 + * + *******/ + + pol eq5_0 = + (x1[0] * x2[0] - y1[0] * y2[0] + 64839 * q1[0]) + - x3[0]; + + pol eq5_1 = + (x1[0] * x2[1] - y1[0] * y2[1] + 64839 * q1[1]) + + (x1[1] * x2[0] - y1[1] * y2[0] + 55420 * q1[0]) + - x3[1]; + + pol eq5_2 = + (x1[0] * x2[2] - y1[0] * y2[2] + 64839 * q1[2]) + + (x1[1] * x2[1] - y1[1] * y2[1] + 55420 * q1[1]) + + (x1[2] * x2[0] - y1[2] * y2[0] + 35862 * q1[0]) + - x3[2]; + + pol eq5_3 = + (x1[0] * x2[3] - y1[0] * y2[3] + 64839 * q1[3]) + + (x1[1] * x2[2] - y1[1] * y2[2] + 55420 * q1[2]) + + (x1[2] * x2[1] - y1[2] * y2[1] + 35862 * q1[1]) + + (x1[3] * x2[0] - y1[3] * y2[0] + 15392 * q1[0]) + - x3[3]; + + pol eq5_4 = + (x1[0] * x2[4] - y1[0] * y2[4] + 64839 * q1[4]) + + (x1[1] * x2[3] - y1[1] * y2[3] + 55420 * q1[3]) + + (x1[2] * x2[2] - y1[2] * y2[2] + 35862 * q1[2]) + + (x1[3] * x2[1] - y1[3] * y2[1] + 15392 * q1[1]) + + (x1[4] * x2[0] - y1[4] * y2[0] + 51853 * q1[0]) + - x3[4]; + + pol eq5_5 = + (x1[0] * x2[5] - y1[0] * y2[5] + 64839 * q1[5]) + + (x1[1] * x2[4] - y1[1] * y2[4] + 55420 * q1[4]) + + (x1[2] * x2[3] - y1[2] * y2[3] + 35862 * q1[3]) + + (x1[3] * x2[2] - y1[3] * y2[2] + 15392 * q1[2]) + + (x1[4] * x2[1] - y1[4] * y2[1] + 51853 * q1[1]) + + (x1[5] * x2[0] - y1[5] * y2[0] + 26737 * q1[0]) + - x3[5]; + + pol eq5_6 = + (x1[0] * x2[6] - y1[0] * y2[6] + 64839 * q1[6]) + + (x1[1] * x2[5] - y1[1] * y2[5] + 55420 * q1[5]) + + (x1[2] * x2[4] - y1[2] * y2[4] + 35862 * q1[4]) + + (x1[3] * x2[3] - y1[3] * y2[3] + 15392 * q1[3]) + + (x1[4] * x2[2] - y1[4] * y2[2] + 51853 * q1[2]) + + (x1[5] * x2[1] - y1[5] * y2[1] + 26737 * q1[1]) + + (x1[6] * x2[0] - y1[6] * y2[0] + 27281 * q1[0]) + - x3[6]; + + pol eq5_7 = + (x1[0] * x2[7] - y1[0] * y2[7] + 64839 * q1[7]) + + (x1[1] * x2[6] - y1[1] * y2[6] + 55420 * q1[6]) + + (x1[2] * x2[5] - y1[2] * y2[5] + 35862 * q1[5]) + + (x1[3] * x2[4] - y1[3] * y2[4] + 15392 * q1[4]) + + (x1[4] * x2[3] - y1[4] * y2[3] + 51853 * q1[3]) + + (x1[5] * x2[2] - y1[5] * y2[2] + 26737 * q1[2]) + + (x1[6] * x2[1] - y1[6] * y2[1] + 27281 * q1[1]) + + (x1[7] * x2[0] - y1[7] * y2[0] + 38785 * q1[0]) + - x3[7]; + + pol eq5_8 = + (x1[0] * x2[8] - y1[0] * y2[8] + 64839 * q1[8]) + + (x1[1] * x2[7] - y1[1] * y2[7] + 55420 * q1[7]) + + (x1[2] * x2[6] - y1[2] * y2[6] + 35862 * q1[6]) + + (x1[3] * x2[5] - y1[3] * y2[5] + 15392 * q1[5]) + + (x1[4] * x2[4] - y1[4] * y2[4] + 51853 * q1[4]) + + (x1[5] * x2[3] - y1[5] * y2[3] + 26737 * q1[3]) + + (x1[6] * x2[2] - y1[6] * y2[2] + 27281 * q1[2]) + + (x1[7] * x2[1] - y1[7] * y2[1] + 38785 * q1[1]) + + (x1[8] * x2[0] - y1[8] * y2[0] + 22621 * q1[0]) + - x3[8]; + + pol eq5_9 = + (x1[0] * x2[9] - y1[0] * y2[9] + 64839 * q1[9]) + + (x1[1] * x2[8] - y1[1] * y2[8] + 55420 * q1[8]) + + (x1[2] * x2[7] - y1[2] * y2[7] + 35862 * q1[7]) + + (x1[3] * x2[6] - y1[3] * y2[6] + 15392 * q1[6]) + + (x1[4] * x2[5] - y1[4] * y2[5] + 51853 * q1[5]) + + (x1[5] * x2[4] - y1[5] * y2[4] + 26737 * q1[4]) + + (x1[6] * x2[3] - y1[6] * y2[3] + 27281 * q1[3]) + + (x1[7] * x2[2] - y1[7] * y2[2] + 38785 * q1[2]) + + (x1[8] * x2[1] - y1[8] * y2[1] + 22621 * q1[1]) + + (x1[9] * x2[0] - y1[9] * y2[0] + 33153 * q1[0]) + - x3[9]; + + pol eq5_10 = + (x1[0] * x2[10] - y1[0] * y2[10] + 64839 * q1[10]) + + (x1[1] * x2[9] - y1[1] * y2[9] + 55420 * q1[9]) + + (x1[2] * x2[8] - y1[2] * y2[8] + 35862 * q1[8]) + + (x1[3] * x2[7] - y1[3] * y2[7] + 15392 * q1[7]) + + (x1[4] * x2[6] - y1[4] * y2[6] + 51853 * q1[6]) + + (x1[5] * x2[5] - y1[5] * y2[5] + 26737 * q1[5]) + + (x1[6] * x2[4] - y1[6] * y2[4] + 27281 * q1[4]) + + (x1[7] * x2[3] - y1[7] * y2[3] + 38785 * q1[3]) + + (x1[8] * x2[2] - y1[8] * y2[2] + 22621 * q1[2]) + + (x1[9] * x2[1] - y1[9] * y2[1] + 33153 * q1[1]) + + (x1[10] * x2[0] - y1[10] * y2[0] + 17846 * q1[0]) + - x3[10]; + + pol eq5_11 = + (x1[0] * x2[11] - y1[0] * y2[11] + 64839 * q1[11]) + + (x1[1] * x2[10] - y1[1] * y2[10] + 55420 * q1[10]) + + (x1[2] * x2[9] - y1[2] * y2[9] + 35862 * q1[9]) + + (x1[3] * x2[8] - y1[3] * y2[8] + 15392 * q1[8]) + + (x1[4] * x2[7] - y1[4] * y2[7] + 51853 * q1[7]) + + (x1[5] * x2[6] - y1[5] * y2[6] + 26737 * q1[6]) + + (x1[6] * x2[5] - y1[6] * y2[5] + 27281 * q1[5]) + + (x1[7] * x2[4] - y1[7] * y2[4] + 38785 * q1[4]) + + (x1[8] * x2[3] - y1[8] * y2[3] + 22621 * q1[3]) + + (x1[9] * x2[2] - y1[9] * y2[2] + 33153 * q1[2]) + + (x1[10] * x2[1] - y1[10] * y2[1] + 17846 * q1[1]) + + (x1[11] * x2[0] - y1[11] * y2[0] + 47184 * q1[0]) + - x3[11]; + + pol eq5_12 = + (x1[0] * x2[12] - y1[0] * y2[12] + 64839 * q1[12]) + + (x1[1] * x2[11] - y1[1] * y2[11] + 55420 * q1[11]) + + (x1[2] * x2[10] - y1[2] * y2[10] + 35862 * q1[10]) + + (x1[3] * x2[9] - y1[3] * y2[9] + 15392 * q1[9]) + + (x1[4] * x2[8] - y1[4] * y2[8] + 51853 * q1[8]) + + (x1[5] * x2[7] - y1[5] * y2[7] + 26737 * q1[7]) + + (x1[6] * x2[6] - y1[6] * y2[6] + 27281 * q1[6]) + + (x1[7] * x2[5] - y1[7] * y2[5] + 38785 * q1[5]) + + (x1[8] * x2[4] - y1[8] * y2[4] + 22621 * q1[4]) + + (x1[9] * x2[3] - y1[9] * y2[3] + 33153 * q1[3]) + + (x1[10] * x2[2] - y1[10] * y2[2] + 17846 * q1[2]) + + (x1[11] * x2[1] - y1[11] * y2[1] + 47184 * q1[1]) + + (x1[12] * x2[0] - y1[12] * y2[0] + 41001 * q1[0]) + - x3[12]; + + pol eq5_13 = + (x1[0] * x2[13] - y1[0] * y2[13] + 64839 * q1[13]) + + (x1[1] * x2[12] - y1[1] * y2[12] + 55420 * q1[12]) + + (x1[2] * x2[11] - y1[2] * y2[11] + 35862 * q1[11]) + + (x1[3] * x2[10] - y1[3] * y2[10] + 15392 * q1[10]) + + (x1[4] * x2[9] - y1[4] * y2[9] + 51853 * q1[9]) + + (x1[5] * x2[8] - y1[5] * y2[8] + 26737 * q1[8]) + + (x1[6] * x2[7] - y1[6] * y2[7] + 27281 * q1[7]) + + (x1[7] * x2[6] - y1[7] * y2[6] + 38785 * q1[6]) + + (x1[8] * x2[5] - y1[8] * y2[5] + 22621 * q1[5]) + + (x1[9] * x2[4] - y1[9] * y2[4] + 33153 * q1[4]) + + (x1[10] * x2[3] - y1[10] * y2[3] + 17846 * q1[3]) + + (x1[11] * x2[2] - y1[11] * y2[2] + 47184 * q1[2]) + + (x1[12] * x2[1] - y1[12] * y2[1] + 41001 * q1[1]) + + (x1[13] * x2[0] - y1[13] * y2[0] + 57649 * q1[0]) + - x3[13]; + + pol eq5_14 = + (x1[0] * x2[14] - y1[0] * y2[14] + 64839 * q1[14]) + + (x1[1] * x2[13] - y1[1] * y2[13] + 55420 * q1[13]) + + (x1[2] * x2[12] - y1[2] * y2[12] + 35862 * q1[12]) + + (x1[3] * x2[11] - y1[3] * y2[11] + 15392 * q1[11]) + + (x1[4] * x2[10] - y1[4] * y2[10] + 51853 * q1[10]) + + (x1[5] * x2[9] - y1[5] * y2[9] + 26737 * q1[9]) + + (x1[6] * x2[8] - y1[6] * y2[8] + 27281 * q1[8]) + + (x1[7] * x2[7] - y1[7] * y2[7] + 38785 * q1[7]) + + (x1[8] * x2[6] - y1[8] * y2[6] + 22621 * q1[6]) + + (x1[9] * x2[5] - y1[9] * y2[5] + 33153 * q1[5]) + + (x1[10] * x2[4] - y1[10] * y2[4] + 17846 * q1[4]) + + (x1[11] * x2[3] - y1[11] * y2[3] + 47184 * q1[3]) + + (x1[12] * x2[2] - y1[12] * y2[2] + 41001 * q1[2]) + + (x1[13] * x2[1] - y1[13] * y2[1] + 57649 * q1[1]) + + (x1[14] * x2[0] - y1[14] * y2[0] + 20082 * q1[0]) + - x3[14]; + + pol eq5_15 = + (x1[0] * x2[15] - y1[0] * y2[15] + 64839 * q1[15]) + + (x1[1] * x2[14] - y1[1] * y2[14] + 55420 * q1[14]) + + (x1[2] * x2[13] - y1[2] * y2[13] + 35862 * q1[13]) + + (x1[3] * x2[12] - y1[3] * y2[12] + 15392 * q1[12]) + + (x1[4] * x2[11] - y1[4] * y2[11] + 51853 * q1[11]) + + (x1[5] * x2[10] - y1[5] * y2[10] + 26737 * q1[10]) + + (x1[6] * x2[9] - y1[6] * y2[9] + 27281 * q1[9]) + + (x1[7] * x2[8] - y1[7] * y2[8] + 38785 * q1[8]) + + (x1[8] * x2[7] - y1[8] * y2[7] + 22621 * q1[7]) + + (x1[9] * x2[6] - y1[9] * y2[6] + 33153 * q1[6]) + + (x1[10] * x2[5] - y1[10] * y2[5] + 17846 * q1[5]) + + (x1[11] * x2[4] - y1[11] * y2[4] + 47184 * q1[4]) + + (x1[12] * x2[3] - y1[12] * y2[3] + 41001 * q1[3]) + + (x1[13] * x2[2] - y1[13] * y2[2] + 57649 * q1[2]) + + (x1[14] * x2[1] - y1[14] * y2[1] + 20082 * q1[1]) + + (x1[15] * x2[0] - y1[15] * y2[0] + 12388 * q1[0]) + - x3[15]; + + pol eq5_16 = + (x1[1] * x2[15] - y1[1] * y2[15] + 55420 * q1[15]) + + (x1[2] * x2[14] - y1[2] * y2[14] + 35862 * q1[14]) + + (x1[3] * x2[13] - y1[3] * y2[13] + 15392 * q1[13]) + + (x1[4] * x2[12] - y1[4] * y2[12] + 51853 * q1[12]) + + (x1[5] * x2[11] - y1[5] * y2[11] + 26737 * q1[11]) + + (x1[6] * x2[10] - y1[6] * y2[10] + 27281 * q1[10]) + + (x1[7] * x2[9] - y1[7] * y2[9] + 38785 * q1[9]) + + (x1[8] * x2[8] - y1[8] * y2[8] + 22621 * q1[8]) + + (x1[9] * x2[7] - y1[9] * y2[7] + 33153 * q1[7]) + + (x1[10] * x2[6] - y1[10] * y2[6] + 17846 * q1[6]) + + (x1[11] * x2[5] - y1[11] * y2[5] + 47184 * q1[5]) + + (x1[12] * x2[4] - y1[12] * y2[4] + 41001 * q1[4]) + + (x1[13] * x2[3] - y1[13] * y2[3] + 57649 * q1[3]) + + (x1[14] * x2[2] - y1[14] * y2[2] + 20082 * q1[2]) + + (x1[15] * x2[1] - y1[15] * y2[1] + 12388 * q1[1]) + - 518712; + + pol eq5_17 = + (x1[2] * x2[15] - y1[2] * y2[15] + 35862 * q1[15]) + + (x1[3] * x2[14] - y1[3] * y2[14] + 15392 * q1[14]) + + (x1[4] * x2[13] - y1[4] * y2[13] + 51853 * q1[13]) + + (x1[5] * x2[12] - y1[5] * y2[12] + 26737 * q1[12]) + + (x1[6] * x2[11] - y1[6] * y2[11] + 27281 * q1[11]) + + (x1[7] * x2[10] - y1[7] * y2[10] + 38785 * q1[10]) + + (x1[8] * x2[9] - y1[8] * y2[9] + 22621 * q1[9]) + + (x1[9] * x2[8] - y1[9] * y2[8] + 33153 * q1[8]) + + (x1[10] * x2[7] - y1[10] * y2[7] + 17846 * q1[7]) + + (x1[11] * x2[6] - y1[11] * y2[6] + 47184 * q1[6]) + + (x1[12] * x2[5] - y1[12] * y2[5] + 41001 * q1[5]) + + (x1[13] * x2[4] - y1[13] * y2[4] + 57649 * q1[4]) + + (x1[14] * x2[3] - y1[14] * y2[3] + 20082 * q1[3]) + + (x1[15] * x2[2] - y1[15] * y2[2] + 12388 * q1[2]) + - 443360; + + pol eq5_18 = + (x1[3] * x2[15] - y1[3] * y2[15] + 15392 * q1[15]) + + (x1[4] * x2[14] - y1[4] * y2[14] + 51853 * q1[14]) + + (x1[5] * x2[13] - y1[5] * y2[13] + 26737 * q1[13]) + + (x1[6] * x2[12] - y1[6] * y2[12] + 27281 * q1[12]) + + (x1[7] * x2[11] - y1[7] * y2[11] + 38785 * q1[11]) + + (x1[8] * x2[10] - y1[8] * y2[10] + 22621 * q1[10]) + + (x1[9] * x2[9] - y1[9] * y2[9] + 33153 * q1[9]) + + (x1[10] * x2[8] - y1[10] * y2[8] + 17846 * q1[8]) + + (x1[11] * x2[7] - y1[11] * y2[7] + 47184 * q1[7]) + + (x1[12] * x2[6] - y1[12] * y2[6] + 41001 * q1[6]) + + (x1[13] * x2[5] - y1[13] * y2[5] + 57649 * q1[5]) + + (x1[14] * x2[4] - y1[14] * y2[4] + 20082 * q1[4]) + + (x1[15] * x2[3] - y1[15] * y2[3] + 12388 * q1[3]) + - 286896; + + pol eq5_19 = + (x1[4] * x2[15] - y1[4] * y2[15] + 51853 * q1[15]) + + (x1[5] * x2[14] - y1[5] * y2[14] + 26737 * q1[14]) + + (x1[6] * x2[13] - y1[6] * y2[13] + 27281 * q1[13]) + + (x1[7] * x2[12] - y1[7] * y2[12] + 38785 * q1[12]) + + (x1[8] * x2[11] - y1[8] * y2[11] + 22621 * q1[11]) + + (x1[9] * x2[10] - y1[9] * y2[10] + 33153 * q1[10]) + + (x1[10] * x2[9] - y1[10] * y2[9] + 17846 * q1[9]) + + (x1[11] * x2[8] - y1[11] * y2[8] + 47184 * q1[8]) + + (x1[12] * x2[7] - y1[12] * y2[7] + 41001 * q1[7]) + + (x1[13] * x2[6] - y1[13] * y2[6] + 57649 * q1[6]) + + (x1[14] * x2[5] - y1[14] * y2[5] + 20082 * q1[5]) + + (x1[15] * x2[4] - y1[15] * y2[4] + 12388 * q1[4]) + - 123136; + + pol eq5_20 = + (x1[5] * x2[15] - y1[5] * y2[15] + 26737 * q1[15]) + + (x1[6] * x2[14] - y1[6] * y2[14] + 27281 * q1[14]) + + (x1[7] * x2[13] - y1[7] * y2[13] + 38785 * q1[13]) + + (x1[8] * x2[12] - y1[8] * y2[12] + 22621 * q1[12]) + + (x1[9] * x2[11] - y1[9] * y2[11] + 33153 * q1[11]) + + (x1[10] * x2[10] - y1[10] * y2[10] + 17846 * q1[10]) + + (x1[11] * x2[9] - y1[11] * y2[9] + 47184 * q1[9]) + + (x1[12] * x2[8] - y1[12] * y2[8] + 41001 * q1[8]) + + (x1[13] * x2[7] - y1[13] * y2[7] + 57649 * q1[7]) + + (x1[14] * x2[6] - y1[14] * y2[6] + 20082 * q1[6]) + + (x1[15] * x2[5] - y1[15] * y2[5] + 12388 * q1[5]) + - 414824; + + pol eq5_21 = + (x1[6] * x2[15] - y1[6] * y2[15] + 27281 * q1[15]) + + (x1[7] * x2[14] - y1[7] * y2[14] + 38785 * q1[14]) + + (x1[8] * x2[13] - y1[8] * y2[13] + 22621 * q1[13]) + + (x1[9] * x2[12] - y1[9] * y2[12] + 33153 * q1[12]) + + (x1[10] * x2[11] - y1[10] * y2[11] + 17846 * q1[11]) + + (x1[11] * x2[10] - y1[11] * y2[10] + 47184 * q1[10]) + + (x1[12] * x2[9] - y1[12] * y2[9] + 41001 * q1[9]) + + (x1[13] * x2[8] - y1[13] * y2[8] + 57649 * q1[8]) + + (x1[14] * x2[7] - y1[14] * y2[7] + 20082 * q1[7]) + + (x1[15] * x2[6] - y1[15] * y2[6] + 12388 * q1[6]) + - 213896; + + pol eq5_22 = + (x1[7] * x2[15] - y1[7] * y2[15] + 38785 * q1[15]) + + (x1[8] * x2[14] - y1[8] * y2[14] + 22621 * q1[14]) + + (x1[9] * x2[13] - y1[9] * y2[13] + 33153 * q1[13]) + + (x1[10] * x2[12] - y1[10] * y2[12] + 17846 * q1[12]) + + (x1[11] * x2[11] - y1[11] * y2[11] + 47184 * q1[11]) + + (x1[12] * x2[10] - y1[12] * y2[10] + 41001 * q1[10]) + + (x1[13] * x2[9] - y1[13] * y2[9] + 57649 * q1[9]) + + (x1[14] * x2[8] - y1[14] * y2[8] + 20082 * q1[8]) + + (x1[15] * x2[7] - y1[15] * y2[7] + 12388 * q1[7]) + - 218248; + + pol eq5_23 = + (x1[8] * x2[15] - y1[8] * y2[15] + 22621 * q1[15]) + + (x1[9] * x2[14] - y1[9] * y2[14] + 33153 * q1[14]) + + (x1[10] * x2[13] - y1[10] * y2[13] + 17846 * q1[13]) + + (x1[11] * x2[12] - y1[11] * y2[12] + 47184 * q1[12]) + + (x1[12] * x2[11] - y1[12] * y2[11] + 41001 * q1[11]) + + (x1[13] * x2[10] - y1[13] * y2[10] + 57649 * q1[10]) + + (x1[14] * x2[9] - y1[14] * y2[9] + 20082 * q1[9]) + + (x1[15] * x2[8] - y1[15] * y2[8] + 12388 * q1[8]) + - 310280; + + pol eq5_24 = + (x1[9] * x2[15] - y1[9] * y2[15] + 33153 * q1[15]) + + (x1[10] * x2[14] - y1[10] * y2[14] + 17846 * q1[14]) + + (x1[11] * x2[13] - y1[11] * y2[13] + 47184 * q1[13]) + + (x1[12] * x2[12] - y1[12] * y2[12] + 41001 * q1[12]) + + (x1[13] * x2[11] - y1[13] * y2[11] + 57649 * q1[11]) + + (x1[14] * x2[10] - y1[14] * y2[10] + 20082 * q1[10]) + + (x1[15] * x2[9] - y1[15] * y2[9] + 12388 * q1[9]) + - 180968; + + pol eq5_25 = + (x1[10] * x2[15] - y1[10] * y2[15] + 17846 * q1[15]) + + (x1[11] * x2[14] - y1[11] * y2[14] + 47184 * q1[14]) + + (x1[12] * x2[13] - y1[12] * y2[13] + 41001 * q1[13]) + + (x1[13] * x2[12] - y1[13] * y2[12] + 57649 * q1[12]) + + (x1[14] * x2[11] - y1[14] * y2[11] + 20082 * q1[11]) + + (x1[15] * x2[10] - y1[15] * y2[10] + 12388 * q1[10]) + - 265224; + + pol eq5_26 = + (x1[11] * x2[15] - y1[11] * y2[15] + 47184 * q1[15]) + + (x1[12] * x2[14] - y1[12] * y2[14] + 41001 * q1[14]) + + (x1[13] * x2[13] - y1[13] * y2[13] + 57649 * q1[13]) + + (x1[14] * x2[12] - y1[14] * y2[12] + 20082 * q1[12]) + + (x1[15] * x2[11] - y1[15] * y2[11] + 12388 * q1[11]) + - 142768; + + pol eq5_27 = + (x1[12] * x2[15] - y1[12] * y2[15] + 41001 * q1[15]) + + (x1[13] * x2[14] - y1[13] * y2[14] + 57649 * q1[14]) + + (x1[14] * x2[13] - y1[14] * y2[13] + 20082 * q1[13]) + + (x1[15] * x2[12] - y1[15] * y2[12] + 12388 * q1[12]) + - 377472; + + pol eq5_28 = + (x1[13] * x2[15] - y1[13] * y2[15] + 57649 * q1[15]) + + (x1[14] * x2[14] - y1[14] * y2[14] + 20082 * q1[14]) + + (x1[15] * x2[13] - y1[15] * y2[13] + 12388 * q1[13]) + - 328008; + + pol eq5_29 = + (x1[14] * x2[15] - y1[14] * y2[15] + 20082 * q1[15]) + + (x1[15] * x2[14] - y1[15] * y2[14] + 12388 * q1[14]) + - 461192; + + pol eq5_30 = + (x1[15] * x2[15] - y1[15] * y2[15] + 12388 * q1[15]) + - 160656; + + pol eq5_31 = - 99104; + + + /******* + * + * EQ6: y1 * x2 + x1 * y2 - y3 - p * (q2 - offset) = 0 + * + *******/ + + pol eq6_0 = + (y1[0] * x2[0] + x1[0] * y2[0] - 64839 * q2[0]) + + 518712 - y3[0]; + + pol eq6_1 = + (y1[0] * x2[1] + x1[0] * y2[1] - 64839 * q2[1]) + + (y1[1] * x2[0] + x1[1] * y2[0] - 55420 * q2[0]) + + 443360 - y3[1]; + + pol eq6_2 = + (y1[0] * x2[2] + x1[0] * y2[2] - 64839 * q2[2]) + + (y1[1] * x2[1] + x1[1] * y2[1] - 55420 * q2[1]) + + (y1[2] * x2[0] + x1[2] * y2[0] - 35862 * q2[0]) + + 286896 - y3[2]; + + pol eq6_3 = + (y1[0] * x2[3] + x1[0] * y2[3] - 64839 * q2[3]) + + (y1[1] * x2[2] + x1[1] * y2[2] - 55420 * q2[2]) + + (y1[2] * x2[1] + x1[2] * y2[1] - 35862 * q2[1]) + + (y1[3] * x2[0] + x1[3] * y2[0] - 15392 * q2[0]) + + 123136 - y3[3]; + + pol eq6_4 = + (y1[0] * x2[4] + x1[0] * y2[4] - 64839 * q2[4]) + + (y1[1] * x2[3] + x1[1] * y2[3] - 55420 * q2[3]) + + (y1[2] * x2[2] + x1[2] * y2[2] - 35862 * q2[2]) + + (y1[3] * x2[1] + x1[3] * y2[1] - 15392 * q2[1]) + + (y1[4] * x2[0] + x1[4] * y2[0] - 51853 * q2[0]) + + 414824 - y3[4]; + + pol eq6_5 = + (y1[0] * x2[5] + x1[0] * y2[5] - 64839 * q2[5]) + + (y1[1] * x2[4] + x1[1] * y2[4] - 55420 * q2[4]) + + (y1[2] * x2[3] + x1[2] * y2[3] - 35862 * q2[3]) + + (y1[3] * x2[2] + x1[3] * y2[2] - 15392 * q2[2]) + + (y1[4] * x2[1] + x1[4] * y2[1] - 51853 * q2[1]) + + (y1[5] * x2[0] + x1[5] * y2[0] - 26737 * q2[0]) + + 213896 - y3[5]; + + pol eq6_6 = + (y1[0] * x2[6] + x1[0] * y2[6] - 64839 * q2[6]) + + (y1[1] * x2[5] + x1[1] * y2[5] - 55420 * q2[5]) + + (y1[2] * x2[4] + x1[2] * y2[4] - 35862 * q2[4]) + + (y1[3] * x2[3] + x1[3] * y2[3] - 15392 * q2[3]) + + (y1[4] * x2[2] + x1[4] * y2[2] - 51853 * q2[2]) + + (y1[5] * x2[1] + x1[5] * y2[1] - 26737 * q2[1]) + + (y1[6] * x2[0] + x1[6] * y2[0] - 27281 * q2[0]) + + 218248 - y3[6]; + + pol eq6_7 = + (y1[0] * x2[7] + x1[0] * y2[7] - 64839 * q2[7]) + + (y1[1] * x2[6] + x1[1] * y2[6] - 55420 * q2[6]) + + (y1[2] * x2[5] + x1[2] * y2[5] - 35862 * q2[5]) + + (y1[3] * x2[4] + x1[3] * y2[4] - 15392 * q2[4]) + + (y1[4] * x2[3] + x1[4] * y2[3] - 51853 * q2[3]) + + (y1[5] * x2[2] + x1[5] * y2[2] - 26737 * q2[2]) + + (y1[6] * x2[1] + x1[6] * y2[1] - 27281 * q2[1]) + + (y1[7] * x2[0] + x1[7] * y2[0] - 38785 * q2[0]) + + 310280 - y3[7]; + + pol eq6_8 = + (y1[0] * x2[8] + x1[0] * y2[8] - 64839 * q2[8]) + + (y1[1] * x2[7] + x1[1] * y2[7] - 55420 * q2[7]) + + (y1[2] * x2[6] + x1[2] * y2[6] - 35862 * q2[6]) + + (y1[3] * x2[5] + x1[3] * y2[5] - 15392 * q2[5]) + + (y1[4] * x2[4] + x1[4] * y2[4] - 51853 * q2[4]) + + (y1[5] * x2[3] + x1[5] * y2[3] - 26737 * q2[3]) + + (y1[6] * x2[2] + x1[6] * y2[2] - 27281 * q2[2]) + + (y1[7] * x2[1] + x1[7] * y2[1] - 38785 * q2[1]) + + (y1[8] * x2[0] + x1[8] * y2[0] - 22621 * q2[0]) + + 180968 - y3[8]; + + pol eq6_9 = + (y1[0] * x2[9] + x1[0] * y2[9] - 64839 * q2[9]) + + (y1[1] * x2[8] + x1[1] * y2[8] - 55420 * q2[8]) + + (y1[2] * x2[7] + x1[2] * y2[7] - 35862 * q2[7]) + + (y1[3] * x2[6] + x1[3] * y2[6] - 15392 * q2[6]) + + (y1[4] * x2[5] + x1[4] * y2[5] - 51853 * q2[5]) + + (y1[5] * x2[4] + x1[5] * y2[4] - 26737 * q2[4]) + + (y1[6] * x2[3] + x1[6] * y2[3] - 27281 * q2[3]) + + (y1[7] * x2[2] + x1[7] * y2[2] - 38785 * q2[2]) + + (y1[8] * x2[1] + x1[8] * y2[1] - 22621 * q2[1]) + + (y1[9] * x2[0] + x1[9] * y2[0] - 33153 * q2[0]) + + 265224 - y3[9]; + + pol eq6_10 = + (y1[0] * x2[10] + x1[0] * y2[10] - 64839 * q2[10]) + + (y1[1] * x2[9] + x1[1] * y2[9] - 55420 * q2[9]) + + (y1[2] * x2[8] + x1[2] * y2[8] - 35862 * q2[8]) + + (y1[3] * x2[7] + x1[3] * y2[7] - 15392 * q2[7]) + + (y1[4] * x2[6] + x1[4] * y2[6] - 51853 * q2[6]) + + (y1[5] * x2[5] + x1[5] * y2[5] - 26737 * q2[5]) + + (y1[6] * x2[4] + x1[6] * y2[4] - 27281 * q2[4]) + + (y1[7] * x2[3] + x1[7] * y2[3] - 38785 * q2[3]) + + (y1[8] * x2[2] + x1[8] * y2[2] - 22621 * q2[2]) + + (y1[9] * x2[1] + x1[9] * y2[1] - 33153 * q2[1]) + + (y1[10] * x2[0] + x1[10] * y2[0] - 17846 * q2[0]) + + 142768 - y3[10]; + + pol eq6_11 = + (y1[0] * x2[11] + x1[0] * y2[11] - 64839 * q2[11]) + + (y1[1] * x2[10] + x1[1] * y2[10] - 55420 * q2[10]) + + (y1[2] * x2[9] + x1[2] * y2[9] - 35862 * q2[9]) + + (y1[3] * x2[8] + x1[3] * y2[8] - 15392 * q2[8]) + + (y1[4] * x2[7] + x1[4] * y2[7] - 51853 * q2[7]) + + (y1[5] * x2[6] + x1[5] * y2[6] - 26737 * q2[6]) + + (y1[6] * x2[5] + x1[6] * y2[5] - 27281 * q2[5]) + + (y1[7] * x2[4] + x1[7] * y2[4] - 38785 * q2[4]) + + (y1[8] * x2[3] + x1[8] * y2[3] - 22621 * q2[3]) + + (y1[9] * x2[2] + x1[9] * y2[2] - 33153 * q2[2]) + + (y1[10] * x2[1] + x1[10] * y2[1] - 17846 * q2[1]) + + (y1[11] * x2[0] + x1[11] * y2[0] - 47184 * q2[0]) + + 377472 - y3[11]; + + pol eq6_12 = + (y1[0] * x2[12] + x1[0] * y2[12] - 64839 * q2[12]) + + (y1[1] * x2[11] + x1[1] * y2[11] - 55420 * q2[11]) + + (y1[2] * x2[10] + x1[2] * y2[10] - 35862 * q2[10]) + + (y1[3] * x2[9] + x1[3] * y2[9] - 15392 * q2[9]) + + (y1[4] * x2[8] + x1[4] * y2[8] - 51853 * q2[8]) + + (y1[5] * x2[7] + x1[5] * y2[7] - 26737 * q2[7]) + + (y1[6] * x2[6] + x1[6] * y2[6] - 27281 * q2[6]) + + (y1[7] * x2[5] + x1[7] * y2[5] - 38785 * q2[5]) + + (y1[8] * x2[4] + x1[8] * y2[4] - 22621 * q2[4]) + + (y1[9] * x2[3] + x1[9] * y2[3] - 33153 * q2[3]) + + (y1[10] * x2[2] + x1[10] * y2[2] - 17846 * q2[2]) + + (y1[11] * x2[1] + x1[11] * y2[1] - 47184 * q2[1]) + + (y1[12] * x2[0] + x1[12] * y2[0] - 41001 * q2[0]) + + 328008 - y3[12]; + + pol eq6_13 = + (y1[0] * x2[13] + x1[0] * y2[13] - 64839 * q2[13]) + + (y1[1] * x2[12] + x1[1] * y2[12] - 55420 * q2[12]) + + (y1[2] * x2[11] + x1[2] * y2[11] - 35862 * q2[11]) + + (y1[3] * x2[10] + x1[3] * y2[10] - 15392 * q2[10]) + + (y1[4] * x2[9] + x1[4] * y2[9] - 51853 * q2[9]) + + (y1[5] * x2[8] + x1[5] * y2[8] - 26737 * q2[8]) + + (y1[6] * x2[7] + x1[6] * y2[7] - 27281 * q2[7]) + + (y1[7] * x2[6] + x1[7] * y2[6] - 38785 * q2[6]) + + (y1[8] * x2[5] + x1[8] * y2[5] - 22621 * q2[5]) + + (y1[9] * x2[4] + x1[9] * y2[4] - 33153 * q2[4]) + + (y1[10] * x2[3] + x1[10] * y2[3] - 17846 * q2[3]) + + (y1[11] * x2[2] + x1[11] * y2[2] - 47184 * q2[2]) + + (y1[12] * x2[1] + x1[12] * y2[1] - 41001 * q2[1]) + + (y1[13] * x2[0] + x1[13] * y2[0] - 57649 * q2[0]) + + 461192 - y3[13]; + + pol eq6_14 = + (y1[0] * x2[14] + x1[0] * y2[14] - 64839 * q2[14]) + + (y1[1] * x2[13] + x1[1] * y2[13] - 55420 * q2[13]) + + (y1[2] * x2[12] + x1[2] * y2[12] - 35862 * q2[12]) + + (y1[3] * x2[11] + x1[3] * y2[11] - 15392 * q2[11]) + + (y1[4] * x2[10] + x1[4] * y2[10] - 51853 * q2[10]) + + (y1[5] * x2[9] + x1[5] * y2[9] - 26737 * q2[9]) + + (y1[6] * x2[8] + x1[6] * y2[8] - 27281 * q2[8]) + + (y1[7] * x2[7] + x1[7] * y2[7] - 38785 * q2[7]) + + (y1[8] * x2[6] + x1[8] * y2[6] - 22621 * q2[6]) + + (y1[9] * x2[5] + x1[9] * y2[5] - 33153 * q2[5]) + + (y1[10] * x2[4] + x1[10] * y2[4] - 17846 * q2[4]) + + (y1[11] * x2[3] + x1[11] * y2[3] - 47184 * q2[3]) + + (y1[12] * x2[2] + x1[12] * y2[2] - 41001 * q2[2]) + + (y1[13] * x2[1] + x1[13] * y2[1] - 57649 * q2[1]) + + (y1[14] * x2[0] + x1[14] * y2[0] - 20082 * q2[0]) + + 160656 - y3[14]; + + pol eq6_15 = + (y1[0] * x2[15] + x1[0] * y2[15] - 64839 * q2[15]) + + (y1[1] * x2[14] + x1[1] * y2[14] - 55420 * q2[14]) + + (y1[2] * x2[13] + x1[2] * y2[13] - 35862 * q2[13]) + + (y1[3] * x2[12] + x1[3] * y2[12] - 15392 * q2[12]) + + (y1[4] * x2[11] + x1[4] * y2[11] - 51853 * q2[11]) + + (y1[5] * x2[10] + x1[5] * y2[10] - 26737 * q2[10]) + + (y1[6] * x2[9] + x1[6] * y2[9] - 27281 * q2[9]) + + (y1[7] * x2[8] + x1[7] * y2[8] - 38785 * q2[8]) + + (y1[8] * x2[7] + x1[8] * y2[7] - 22621 * q2[7]) + + (y1[9] * x2[6] + x1[9] * y2[6] - 33153 * q2[6]) + + (y1[10] * x2[5] + x1[10] * y2[5] - 17846 * q2[5]) + + (y1[11] * x2[4] + x1[11] * y2[4] - 47184 * q2[4]) + + (y1[12] * x2[3] + x1[12] * y2[3] - 41001 * q2[3]) + + (y1[13] * x2[2] + x1[13] * y2[2] - 57649 * q2[2]) + + (y1[14] * x2[1] + x1[14] * y2[1] - 20082 * q2[1]) + + (y1[15] * x2[0] + x1[15] * y2[0] - 12388 * q2[0]) + + 99104 - y3[15]; + + pol eq6_16 = + (y1[1] * x2[15] + x1[1] * y2[15] - 55420 * q2[15]) + + (y1[2] * x2[14] + x1[2] * y2[14] - 35862 * q2[14]) + + (y1[3] * x2[13] + x1[3] * y2[13] - 15392 * q2[13]) + + (y1[4] * x2[12] + x1[4] * y2[12] - 51853 * q2[12]) + + (y1[5] * x2[11] + x1[5] * y2[11] - 26737 * q2[11]) + + (y1[6] * x2[10] + x1[6] * y2[10] - 27281 * q2[10]) + + (y1[7] * x2[9] + x1[7] * y2[9] - 38785 * q2[9]) + + (y1[8] * x2[8] + x1[8] * y2[8] - 22621 * q2[8]) + + (y1[9] * x2[7] + x1[9] * y2[7] - 33153 * q2[7]) + + (y1[10] * x2[6] + x1[10] * y2[6] - 17846 * q2[6]) + + (y1[11] * x2[5] + x1[11] * y2[5] - 47184 * q2[5]) + + (y1[12] * x2[4] + x1[12] * y2[4] - 41001 * q2[4]) + + (y1[13] * x2[3] + x1[13] * y2[3] - 57649 * q2[3]) + + (y1[14] * x2[2] + x1[14] * y2[2] - 20082 * q2[2]) + + (y1[15] * x2[1] + x1[15] * y2[1] - 12388 * q2[1]); + + pol eq6_17 = + (y1[2] * x2[15] + x1[2] * y2[15] - 35862 * q2[15]) + + (y1[3] * x2[14] + x1[3] * y2[14] - 15392 * q2[14]) + + (y1[4] * x2[13] + x1[4] * y2[13] - 51853 * q2[13]) + + (y1[5] * x2[12] + x1[5] * y2[12] - 26737 * q2[12]) + + (y1[6] * x2[11] + x1[6] * y2[11] - 27281 * q2[11]) + + (y1[7] * x2[10] + x1[7] * y2[10] - 38785 * q2[10]) + + (y1[8] * x2[9] + x1[8] * y2[9] - 22621 * q2[9]) + + (y1[9] * x2[8] + x1[9] * y2[8] - 33153 * q2[8]) + + (y1[10] * x2[7] + x1[10] * y2[7] - 17846 * q2[7]) + + (y1[11] * x2[6] + x1[11] * y2[6] - 47184 * q2[6]) + + (y1[12] * x2[5] + x1[12] * y2[5] - 41001 * q2[5]) + + (y1[13] * x2[4] + x1[13] * y2[4] - 57649 * q2[4]) + + (y1[14] * x2[3] + x1[14] * y2[3] - 20082 * q2[3]) + + (y1[15] * x2[2] + x1[15] * y2[2] - 12388 * q2[2]); + + pol eq6_18 = + (y1[3] * x2[15] + x1[3] * y2[15] - 15392 * q2[15]) + + (y1[4] * x2[14] + x1[4] * y2[14] - 51853 * q2[14]) + + (y1[5] * x2[13] + x1[5] * y2[13] - 26737 * q2[13]) + + (y1[6] * x2[12] + x1[6] * y2[12] - 27281 * q2[12]) + + (y1[7] * x2[11] + x1[7] * y2[11] - 38785 * q2[11]) + + (y1[8] * x2[10] + x1[8] * y2[10] - 22621 * q2[10]) + + (y1[9] * x2[9] + x1[9] * y2[9] - 33153 * q2[9]) + + (y1[10] * x2[8] + x1[10] * y2[8] - 17846 * q2[8]) + + (y1[11] * x2[7] + x1[11] * y2[7] - 47184 * q2[7]) + + (y1[12] * x2[6] + x1[12] * y2[6] - 41001 * q2[6]) + + (y1[13] * x2[5] + x1[13] * y2[5] - 57649 * q2[5]) + + (y1[14] * x2[4] + x1[14] * y2[4] - 20082 * q2[4]) + + (y1[15] * x2[3] + x1[15] * y2[3] - 12388 * q2[3]); + + pol eq6_19 = + (y1[4] * x2[15] + x1[4] * y2[15] - 51853 * q2[15]) + + (y1[5] * x2[14] + x1[5] * y2[14] - 26737 * q2[14]) + + (y1[6] * x2[13] + x1[6] * y2[13] - 27281 * q2[13]) + + (y1[7] * x2[12] + x1[7] * y2[12] - 38785 * q2[12]) + + (y1[8] * x2[11] + x1[8] * y2[11] - 22621 * q2[11]) + + (y1[9] * x2[10] + x1[9] * y2[10] - 33153 * q2[10]) + + (y1[10] * x2[9] + x1[10] * y2[9] - 17846 * q2[9]) + + (y1[11] * x2[8] + x1[11] * y2[8] - 47184 * q2[8]) + + (y1[12] * x2[7] + x1[12] * y2[7] - 41001 * q2[7]) + + (y1[13] * x2[6] + x1[13] * y2[6] - 57649 * q2[6]) + + (y1[14] * x2[5] + x1[14] * y2[5] - 20082 * q2[5]) + + (y1[15] * x2[4] + x1[15] * y2[4] - 12388 * q2[4]); + + pol eq6_20 = + (y1[5] * x2[15] + x1[5] * y2[15] - 26737 * q2[15]) + + (y1[6] * x2[14] + x1[6] * y2[14] - 27281 * q2[14]) + + (y1[7] * x2[13] + x1[7] * y2[13] - 38785 * q2[13]) + + (y1[8] * x2[12] + x1[8] * y2[12] - 22621 * q2[12]) + + (y1[9] * x2[11] + x1[9] * y2[11] - 33153 * q2[11]) + + (y1[10] * x2[10] + x1[10] * y2[10] - 17846 * q2[10]) + + (y1[11] * x2[9] + x1[11] * y2[9] - 47184 * q2[9]) + + (y1[12] * x2[8] + x1[12] * y2[8] - 41001 * q2[8]) + + (y1[13] * x2[7] + x1[13] * y2[7] - 57649 * q2[7]) + + (y1[14] * x2[6] + x1[14] * y2[6] - 20082 * q2[6]) + + (y1[15] * x2[5] + x1[15] * y2[5] - 12388 * q2[5]); + + pol eq6_21 = + (y1[6] * x2[15] + x1[6] * y2[15] - 27281 * q2[15]) + + (y1[7] * x2[14] + x1[7] * y2[14] - 38785 * q2[14]) + + (y1[8] * x2[13] + x1[8] * y2[13] - 22621 * q2[13]) + + (y1[9] * x2[12] + x1[9] * y2[12] - 33153 * q2[12]) + + (y1[10] * x2[11] + x1[10] * y2[11] - 17846 * q2[11]) + + (y1[11] * x2[10] + x1[11] * y2[10] - 47184 * q2[10]) + + (y1[12] * x2[9] + x1[12] * y2[9] - 41001 * q2[9]) + + (y1[13] * x2[8] + x1[13] * y2[8] - 57649 * q2[8]) + + (y1[14] * x2[7] + x1[14] * y2[7] - 20082 * q2[7]) + + (y1[15] * x2[6] + x1[15] * y2[6] - 12388 * q2[6]); + + pol eq6_22 = + (y1[7] * x2[15] + x1[7] * y2[15] - 38785 * q2[15]) + + (y1[8] * x2[14] + x1[8] * y2[14] - 22621 * q2[14]) + + (y1[9] * x2[13] + x1[9] * y2[13] - 33153 * q2[13]) + + (y1[10] * x2[12] + x1[10] * y2[12] - 17846 * q2[12]) + + (y1[11] * x2[11] + x1[11] * y2[11] - 47184 * q2[11]) + + (y1[12] * x2[10] + x1[12] * y2[10] - 41001 * q2[10]) + + (y1[13] * x2[9] + x1[13] * y2[9] - 57649 * q2[9]) + + (y1[14] * x2[8] + x1[14] * y2[8] - 20082 * q2[8]) + + (y1[15] * x2[7] + x1[15] * y2[7] - 12388 * q2[7]); + + pol eq6_23 = + (y1[8] * x2[15] + x1[8] * y2[15] - 22621 * q2[15]) + + (y1[9] * x2[14] + x1[9] * y2[14] - 33153 * q2[14]) + + (y1[10] * x2[13] + x1[10] * y2[13] - 17846 * q2[13]) + + (y1[11] * x2[12] + x1[11] * y2[12] - 47184 * q2[12]) + + (y1[12] * x2[11] + x1[12] * y2[11] - 41001 * q2[11]) + + (y1[13] * x2[10] + x1[13] * y2[10] - 57649 * q2[10]) + + (y1[14] * x2[9] + x1[14] * y2[9] - 20082 * q2[9]) + + (y1[15] * x2[8] + x1[15] * y2[8] - 12388 * q2[8]); + + pol eq6_24 = + (y1[9] * x2[15] + x1[9] * y2[15] - 33153 * q2[15]) + + (y1[10] * x2[14] + x1[10] * y2[14] - 17846 * q2[14]) + + (y1[11] * x2[13] + x1[11] * y2[13] - 47184 * q2[13]) + + (y1[12] * x2[12] + x1[12] * y2[12] - 41001 * q2[12]) + + (y1[13] * x2[11] + x1[13] * y2[11] - 57649 * q2[11]) + + (y1[14] * x2[10] + x1[14] * y2[10] - 20082 * q2[10]) + + (y1[15] * x2[9] + x1[15] * y2[9] - 12388 * q2[9]); + + pol eq6_25 = + (y1[10] * x2[15] + x1[10] * y2[15] - 17846 * q2[15]) + + (y1[11] * x2[14] + x1[11] * y2[14] - 47184 * q2[14]) + + (y1[12] * x2[13] + x1[12] * y2[13] - 41001 * q2[13]) + + (y1[13] * x2[12] + x1[13] * y2[12] - 57649 * q2[12]) + + (y1[14] * x2[11] + x1[14] * y2[11] - 20082 * q2[11]) + + (y1[15] * x2[10] + x1[15] * y2[10] - 12388 * q2[10]); + + pol eq6_26 = + (y1[11] * x2[15] + x1[11] * y2[15] - 47184 * q2[15]) + + (y1[12] * x2[14] + x1[12] * y2[14] - 41001 * q2[14]) + + (y1[13] * x2[13] + x1[13] * y2[13] - 57649 * q2[13]) + + (y1[14] * x2[12] + x1[14] * y2[12] - 20082 * q2[12]) + + (y1[15] * x2[11] + x1[15] * y2[11] - 12388 * q2[11]); + + pol eq6_27 = + (y1[12] * x2[15] + x1[12] * y2[15] - 41001 * q2[15]) + + (y1[13] * x2[14] + x1[13] * y2[14] - 57649 * q2[14]) + + (y1[14] * x2[13] + x1[14] * y2[13] - 20082 * q2[13]) + + (y1[15] * x2[12] + x1[15] * y2[12] - 12388 * q2[12]); + + pol eq6_28 = + (y1[13] * x2[15] + x1[13] * y2[15] - 57649 * q2[15]) + + (y1[14] * x2[14] + x1[14] * y2[14] - 20082 * q2[14]) + + (y1[15] * x2[13] + x1[15] * y2[13] - 12388 * q2[13]); + + pol eq6_29 = + (y1[14] * x2[15] + x1[14] * y2[15] - 20082 * q2[15]) + + (y1[15] * x2[14] + x1[15] * y2[14] - 12388 * q2[14]); + + pol eq6_30 = + (y1[15] * x2[15] + x1[15] * y2[15] - 12388 * q2[15]); + + pol eq6_31 = + 0; + + + /******* + * + * EQ7: x1 + x2 - x3 - p * (q1 - offset) = 0 + * + *******/ + + pol eq7_0 = + ( - 64839 * q1[0]) + + 518712 + x1[0] + x2[0] - x3[0]; + + pol eq7_1 = + ( - 64839 * q1[1]) + + ( - 55420 * q1[0]) + + 443360 + x1[1] + x2[1] - x3[1]; + + pol eq7_2 = + ( - 64839 * q1[2]) + + ( - 55420 * q1[1]) + + ( - 35862 * q1[0]) + + 286896 + x1[2] + x2[2] - x3[2]; + + pol eq7_3 = + ( - 64839 * q1[3]) + + ( - 55420 * q1[2]) + + ( - 35862 * q1[1]) + + ( - 15392 * q1[0]) + + 123136 + x1[3] + x2[3] - x3[3]; + + pol eq7_4 = + ( - 64839 * q1[4]) + + ( - 55420 * q1[3]) + + ( - 35862 * q1[2]) + + ( - 15392 * q1[1]) + + ( - 51853 * q1[0]) + + 414824 + x1[4] + x2[4] - x3[4]; + + pol eq7_5 = + ( - 64839 * q1[5]) + + ( - 55420 * q1[4]) + + ( - 35862 * q1[3]) + + ( - 15392 * q1[2]) + + ( - 51853 * q1[1]) + + ( - 26737 * q1[0]) + + 213896 + x1[5] + x2[5] - x3[5]; + + pol eq7_6 = + ( - 64839 * q1[6]) + + ( - 55420 * q1[5]) + + ( - 35862 * q1[4]) + + ( - 15392 * q1[3]) + + ( - 51853 * q1[2]) + + ( - 26737 * q1[1]) + + ( - 27281 * q1[0]) + + 218248 + x1[6] + x2[6] - x3[6]; + + pol eq7_7 = + ( - 64839 * q1[7]) + + ( - 55420 * q1[6]) + + ( - 35862 * q1[5]) + + ( - 15392 * q1[4]) + + ( - 51853 * q1[3]) + + ( - 26737 * q1[2]) + + ( - 27281 * q1[1]) + + ( - 38785 * q1[0]) + + 310280 + x1[7] + x2[7] - x3[7]; + + pol eq7_8 = + ( - 64839 * q1[8]) + + ( - 55420 * q1[7]) + + ( - 35862 * q1[6]) + + ( - 15392 * q1[5]) + + ( - 51853 * q1[4]) + + ( - 26737 * q1[3]) + + ( - 27281 * q1[2]) + + ( - 38785 * q1[1]) + + ( - 22621 * q1[0]) + + 180968 + x1[8] + x2[8] - x3[8]; + + pol eq7_9 = + ( - 64839 * q1[9]) + + ( - 55420 * q1[8]) + + ( - 35862 * q1[7]) + + ( - 15392 * q1[6]) + + ( - 51853 * q1[5]) + + ( - 26737 * q1[4]) + + ( - 27281 * q1[3]) + + ( - 38785 * q1[2]) + + ( - 22621 * q1[1]) + + ( - 33153 * q1[0]) + + 265224 + x1[9] + x2[9] - x3[9]; + + pol eq7_10 = + ( - 64839 * q1[10]) + + ( - 55420 * q1[9]) + + ( - 35862 * q1[8]) + + ( - 15392 * q1[7]) + + ( - 51853 * q1[6]) + + ( - 26737 * q1[5]) + + ( - 27281 * q1[4]) + + ( - 38785 * q1[3]) + + ( - 22621 * q1[2]) + + ( - 33153 * q1[1]) + + ( - 17846 * q1[0]) + + 142768 + x1[10] + x2[10] - x3[10]; + + pol eq7_11 = + ( - 64839 * q1[11]) + + ( - 55420 * q1[10]) + + ( - 35862 * q1[9]) + + ( - 15392 * q1[8]) + + ( - 51853 * q1[7]) + + ( - 26737 * q1[6]) + + ( - 27281 * q1[5]) + + ( - 38785 * q1[4]) + + ( - 22621 * q1[3]) + + ( - 33153 * q1[2]) + + ( - 17846 * q1[1]) + + ( - 47184 * q1[0]) + + 377472 + x1[11] + x2[11] - x3[11]; + + pol eq7_12 = + ( - 64839 * q1[12]) + + ( - 55420 * q1[11]) + + ( - 35862 * q1[10]) + + ( - 15392 * q1[9]) + + ( - 51853 * q1[8]) + + ( - 26737 * q1[7]) + + ( - 27281 * q1[6]) + + ( - 38785 * q1[5]) + + ( - 22621 * q1[4]) + + ( - 33153 * q1[3]) + + ( - 17846 * q1[2]) + + ( - 47184 * q1[1]) + + ( - 41001 * q1[0]) + + 328008 + x1[12] + x2[12] - x3[12]; + + pol eq7_13 = + ( - 64839 * q1[13]) + + ( - 55420 * q1[12]) + + ( - 35862 * q1[11]) + + ( - 15392 * q1[10]) + + ( - 51853 * q1[9]) + + ( - 26737 * q1[8]) + + ( - 27281 * q1[7]) + + ( - 38785 * q1[6]) + + ( - 22621 * q1[5]) + + ( - 33153 * q1[4]) + + ( - 17846 * q1[3]) + + ( - 47184 * q1[2]) + + ( - 41001 * q1[1]) + + ( - 57649 * q1[0]) + + 461192 + x1[13] + x2[13] - x3[13]; + + pol eq7_14 = + ( - 64839 * q1[14]) + + ( - 55420 * q1[13]) + + ( - 35862 * q1[12]) + + ( - 15392 * q1[11]) + + ( - 51853 * q1[10]) + + ( - 26737 * q1[9]) + + ( - 27281 * q1[8]) + + ( - 38785 * q1[7]) + + ( - 22621 * q1[6]) + + ( - 33153 * q1[5]) + + ( - 17846 * q1[4]) + + ( - 47184 * q1[3]) + + ( - 41001 * q1[2]) + + ( - 57649 * q1[1]) + + ( - 20082 * q1[0]) + + 160656 + x1[14] + x2[14] - x3[14]; + + pol eq7_15 = + ( - 64839 * q1[15]) + + ( - 55420 * q1[14]) + + ( - 35862 * q1[13]) + + ( - 15392 * q1[12]) + + ( - 51853 * q1[11]) + + ( - 26737 * q1[10]) + + ( - 27281 * q1[9]) + + ( - 38785 * q1[8]) + + ( - 22621 * q1[7]) + + ( - 33153 * q1[6]) + + ( - 17846 * q1[5]) + + ( - 47184 * q1[4]) + + ( - 41001 * q1[3]) + + ( - 57649 * q1[2]) + + ( - 20082 * q1[1]) + + ( - 12388 * q1[0]) + + 99104 + x1[15] + x2[15] - x3[15]; + + pol eq7_16 = + ( - 55420 * q1[15]) + + ( - 35862 * q1[14]) + + ( - 15392 * q1[13]) + + ( - 51853 * q1[12]) + + ( - 26737 * q1[11]) + + ( - 27281 * q1[10]) + + ( - 38785 * q1[9]) + + ( - 22621 * q1[8]) + + ( - 33153 * q1[7]) + + ( - 17846 * q1[6]) + + ( - 47184 * q1[5]) + + ( - 41001 * q1[4]) + + ( - 57649 * q1[3]) + + ( - 20082 * q1[2]) + + ( - 12388 * q1[1]); + + pol eq7_17 = + ( - 35862 * q1[15]) + + ( - 15392 * q1[14]) + + ( - 51853 * q1[13]) + + ( - 26737 * q1[12]) + + ( - 27281 * q1[11]) + + ( - 38785 * q1[10]) + + ( - 22621 * q1[9]) + + ( - 33153 * q1[8]) + + ( - 17846 * q1[7]) + + ( - 47184 * q1[6]) + + ( - 41001 * q1[5]) + + ( - 57649 * q1[4]) + + ( - 20082 * q1[3]) + + ( - 12388 * q1[2]); + + pol eq7_18 = + ( - 15392 * q1[15]) + + ( - 51853 * q1[14]) + + ( - 26737 * q1[13]) + + ( - 27281 * q1[12]) + + ( - 38785 * q1[11]) + + ( - 22621 * q1[10]) + + ( - 33153 * q1[9]) + + ( - 17846 * q1[8]) + + ( - 47184 * q1[7]) + + ( - 41001 * q1[6]) + + ( - 57649 * q1[5]) + + ( - 20082 * q1[4]) + + ( - 12388 * q1[3]); + + pol eq7_19 = + ( - 51853 * q1[15]) + + ( - 26737 * q1[14]) + + ( - 27281 * q1[13]) + + ( - 38785 * q1[12]) + + ( - 22621 * q1[11]) + + ( - 33153 * q1[10]) + + ( - 17846 * q1[9]) + + ( - 47184 * q1[8]) + + ( - 41001 * q1[7]) + + ( - 57649 * q1[6]) + + ( - 20082 * q1[5]) + + ( - 12388 * q1[4]); + + pol eq7_20 = + ( - 26737 * q1[15]) + + ( - 27281 * q1[14]) + + ( - 38785 * q1[13]) + + ( - 22621 * q1[12]) + + ( - 33153 * q1[11]) + + ( - 17846 * q1[10]) + + ( - 47184 * q1[9]) + + ( - 41001 * q1[8]) + + ( - 57649 * q1[7]) + + ( - 20082 * q1[6]) + + ( - 12388 * q1[5]); + + pol eq7_21 = + ( - 27281 * q1[15]) + + ( - 38785 * q1[14]) + + ( - 22621 * q1[13]) + + ( - 33153 * q1[12]) + + ( - 17846 * q1[11]) + + ( - 47184 * q1[10]) + + ( - 41001 * q1[9]) + + ( - 57649 * q1[8]) + + ( - 20082 * q1[7]) + + ( - 12388 * q1[6]); + + pol eq7_22 = + ( - 38785 * q1[15]) + + ( - 22621 * q1[14]) + + ( - 33153 * q1[13]) + + ( - 17846 * q1[12]) + + ( - 47184 * q1[11]) + + ( - 41001 * q1[10]) + + ( - 57649 * q1[9]) + + ( - 20082 * q1[8]) + + ( - 12388 * q1[7]); + + pol eq7_23 = + ( - 22621 * q1[15]) + + ( - 33153 * q1[14]) + + ( - 17846 * q1[13]) + + ( - 47184 * q1[12]) + + ( - 41001 * q1[11]) + + ( - 57649 * q1[10]) + + ( - 20082 * q1[9]) + + ( - 12388 * q1[8]); + + pol eq7_24 = + ( - 33153 * q1[15]) + + ( - 17846 * q1[14]) + + ( - 47184 * q1[13]) + + ( - 41001 * q1[12]) + + ( - 57649 * q1[11]) + + ( - 20082 * q1[10]) + + ( - 12388 * q1[9]); + + pol eq7_25 = + ( - 17846 * q1[15]) + + ( - 47184 * q1[14]) + + ( - 41001 * q1[13]) + + ( - 57649 * q1[12]) + + ( - 20082 * q1[11]) + + ( - 12388 * q1[10]); + + pol eq7_26 = + ( - 47184 * q1[15]) + + ( - 41001 * q1[14]) + + ( - 57649 * q1[13]) + + ( - 20082 * q1[12]) + + ( - 12388 * q1[11]); + + pol eq7_27 = + ( - 41001 * q1[15]) + + ( - 57649 * q1[14]) + + ( - 20082 * q1[13]) + + ( - 12388 * q1[12]); + + pol eq7_28 = + ( - 57649 * q1[15]) + + ( - 20082 * q1[14]) + + ( - 12388 * q1[13]); + + pol eq7_29 = + ( - 20082 * q1[15]) + + ( - 12388 * q1[14]); + + pol eq7_30 = ( - 12388 * q1[15]); + + pol eq7_31 = + 0; + + + /******* + * + * EQ8: y1 + y2 - y3 - p * (q2 - offset) = 0 + * + *******/ + + pol eq8_0 = + ( - 64839 * q2[0]) + + 518712 + y1[0] + y2[0] - y3[0]; + + pol eq8_1 = + ( - 64839 * q2[1]) + + ( - 55420 * q2[0]) + + 443360 + y1[1] + y2[1] - y3[1]; + + pol eq8_2 = + ( - 64839 * q2[2]) + + ( - 55420 * q2[1]) + + ( - 35862 * q2[0]) + + 286896 + y1[2] + y2[2] - y3[2]; + + pol eq8_3 = + ( - 64839 * q2[3]) + + ( - 55420 * q2[2]) + + ( - 35862 * q2[1]) + + ( - 15392 * q2[0]) + + 123136 + y1[3] + y2[3] - y3[3]; + + pol eq8_4 = + ( - 64839 * q2[4]) + + ( - 55420 * q2[3]) + + ( - 35862 * q2[2]) + + ( - 15392 * q2[1]) + + ( - 51853 * q2[0]) + + 414824 + y1[4] + y2[4] - y3[4]; + + pol eq8_5 = + ( - 64839 * q2[5]) + + ( - 55420 * q2[4]) + + ( - 35862 * q2[3]) + + ( - 15392 * q2[2]) + + ( - 51853 * q2[1]) + + ( - 26737 * q2[0]) + + 213896 + y1[5] + y2[5] - y3[5]; + + pol eq8_6 = + ( - 64839 * q2[6]) + + ( - 55420 * q2[5]) + + ( - 35862 * q2[4]) + + ( - 15392 * q2[3]) + + ( - 51853 * q2[2]) + + ( - 26737 * q2[1]) + + ( - 27281 * q2[0]) + + 218248 + y1[6] + y2[6] - y3[6]; + + pol eq8_7 = + ( - 64839 * q2[7]) + + ( - 55420 * q2[6]) + + ( - 35862 * q2[5]) + + ( - 15392 * q2[4]) + + ( - 51853 * q2[3]) + + ( - 26737 * q2[2]) + + ( - 27281 * q2[1]) + + ( - 38785 * q2[0]) + + 310280 + y1[7] + y2[7] - y3[7]; + + pol eq8_8 = + ( - 64839 * q2[8]) + + ( - 55420 * q2[7]) + + ( - 35862 * q2[6]) + + ( - 15392 * q2[5]) + + ( - 51853 * q2[4]) + + ( - 26737 * q2[3]) + + ( - 27281 * q2[2]) + + ( - 38785 * q2[1]) + + ( - 22621 * q2[0]) + + 180968 + y1[8] + y2[8] - y3[8]; + + pol eq8_9 = + ( - 64839 * q2[9]) + + ( - 55420 * q2[8]) + + ( - 35862 * q2[7]) + + ( - 15392 * q2[6]) + + ( - 51853 * q2[5]) + + ( - 26737 * q2[4]) + + ( - 27281 * q2[3]) + + ( - 38785 * q2[2]) + + ( - 22621 * q2[1]) + + ( - 33153 * q2[0]) + + 265224 + y1[9] + y2[9] - y3[9]; + + pol eq8_10 = + ( - 64839 * q2[10]) + + ( - 55420 * q2[9]) + + ( - 35862 * q2[8]) + + ( - 15392 * q2[7]) + + ( - 51853 * q2[6]) + + ( - 26737 * q2[5]) + + ( - 27281 * q2[4]) + + ( - 38785 * q2[3]) + + ( - 22621 * q2[2]) + + ( - 33153 * q2[1]) + + ( - 17846 * q2[0]) + + 142768 + y1[10] + y2[10] - y3[10]; + + pol eq8_11 = + ( - 64839 * q2[11]) + + ( - 55420 * q2[10]) + + ( - 35862 * q2[9]) + + ( - 15392 * q2[8]) + + ( - 51853 * q2[7]) + + ( - 26737 * q2[6]) + + ( - 27281 * q2[5]) + + ( - 38785 * q2[4]) + + ( - 22621 * q2[3]) + + ( - 33153 * q2[2]) + + ( - 17846 * q2[1]) + + ( - 47184 * q2[0]) + + 377472 + y1[11] + y2[11] - y3[11]; + + pol eq8_12 = + ( - 64839 * q2[12]) + + ( - 55420 * q2[11]) + + ( - 35862 * q2[10]) + + ( - 15392 * q2[9]) + + ( - 51853 * q2[8]) + + ( - 26737 * q2[7]) + + ( - 27281 * q2[6]) + + ( - 38785 * q2[5]) + + ( - 22621 * q2[4]) + + ( - 33153 * q2[3]) + + ( - 17846 * q2[2]) + + ( - 47184 * q2[1]) + + ( - 41001 * q2[0]) + + 328008 + y1[12] + y2[12] - y3[12]; + + pol eq8_13 = + ( - 64839 * q2[13]) + + ( - 55420 * q2[12]) + + ( - 35862 * q2[11]) + + ( - 15392 * q2[10]) + + ( - 51853 * q2[9]) + + ( - 26737 * q2[8]) + + ( - 27281 * q2[7]) + + ( - 38785 * q2[6]) + + ( - 22621 * q2[5]) + + ( - 33153 * q2[4]) + + ( - 17846 * q2[3]) + + ( - 47184 * q2[2]) + + ( - 41001 * q2[1]) + + ( - 57649 * q2[0]) + + 461192 + y1[13] + y2[13] - y3[13]; + + pol eq8_14 = + ( - 64839 * q2[14]) + + ( - 55420 * q2[13]) + + ( - 35862 * q2[12]) + + ( - 15392 * q2[11]) + + ( - 51853 * q2[10]) + + ( - 26737 * q2[9]) + + ( - 27281 * q2[8]) + + ( - 38785 * q2[7]) + + ( - 22621 * q2[6]) + + ( - 33153 * q2[5]) + + ( - 17846 * q2[4]) + + ( - 47184 * q2[3]) + + ( - 41001 * q2[2]) + + ( - 57649 * q2[1]) + + ( - 20082 * q2[0]) + + 160656 + y1[14] + y2[14] - y3[14]; + + pol eq8_15 = + ( - 64839 * q2[15]) + + ( - 55420 * q2[14]) + + ( - 35862 * q2[13]) + + ( - 15392 * q2[12]) + + ( - 51853 * q2[11]) + + ( - 26737 * q2[10]) + + ( - 27281 * q2[9]) + + ( - 38785 * q2[8]) + + ( - 22621 * q2[7]) + + ( - 33153 * q2[6]) + + ( - 17846 * q2[5]) + + ( - 47184 * q2[4]) + + ( - 41001 * q2[3]) + + ( - 57649 * q2[2]) + + ( - 20082 * q2[1]) + + ( - 12388 * q2[0]) + + 99104 + y1[15] + y2[15] - y3[15]; + + pol eq8_16 = + ( - 55420 * q2[15]) + + ( - 35862 * q2[14]) + + ( - 15392 * q2[13]) + + ( - 51853 * q2[12]) + + ( - 26737 * q2[11]) + + ( - 27281 * q2[10]) + + ( - 38785 * q2[9]) + + ( - 22621 * q2[8]) + + ( - 33153 * q2[7]) + + ( - 17846 * q2[6]) + + ( - 47184 * q2[5]) + + ( - 41001 * q2[4]) + + ( - 57649 * q2[3]) + + ( - 20082 * q2[2]) + + ( - 12388 * q2[1]); + + pol eq8_17 = + ( - 35862 * q2[15]) + + ( - 15392 * q2[14]) + + ( - 51853 * q2[13]) + + ( - 26737 * q2[12]) + + ( - 27281 * q2[11]) + + ( - 38785 * q2[10]) + + ( - 22621 * q2[9]) + + ( - 33153 * q2[8]) + + ( - 17846 * q2[7]) + + ( - 47184 * q2[6]) + + ( - 41001 * q2[5]) + + ( - 57649 * q2[4]) + + ( - 20082 * q2[3]) + + ( - 12388 * q2[2]); + + pol eq8_18 = + ( - 15392 * q2[15]) + + ( - 51853 * q2[14]) + + ( - 26737 * q2[13]) + + ( - 27281 * q2[12]) + + ( - 38785 * q2[11]) + + ( - 22621 * q2[10]) + + ( - 33153 * q2[9]) + + ( - 17846 * q2[8]) + + ( - 47184 * q2[7]) + + ( - 41001 * q2[6]) + + ( - 57649 * q2[5]) + + ( - 20082 * q2[4]) + + ( - 12388 * q2[3]); + + pol eq8_19 = + ( - 51853 * q2[15]) + + ( - 26737 * q2[14]) + + ( - 27281 * q2[13]) + + ( - 38785 * q2[12]) + + ( - 22621 * q2[11]) + + ( - 33153 * q2[10]) + + ( - 17846 * q2[9]) + + ( - 47184 * q2[8]) + + ( - 41001 * q2[7]) + + ( - 57649 * q2[6]) + + ( - 20082 * q2[5]) + + ( - 12388 * q2[4]); + + pol eq8_20 = + ( - 26737 * q2[15]) + + ( - 27281 * q2[14]) + + ( - 38785 * q2[13]) + + ( - 22621 * q2[12]) + + ( - 33153 * q2[11]) + + ( - 17846 * q2[10]) + + ( - 47184 * q2[9]) + + ( - 41001 * q2[8]) + + ( - 57649 * q2[7]) + + ( - 20082 * q2[6]) + + ( - 12388 * q2[5]); + + pol eq8_21 = + ( - 27281 * q2[15]) + + ( - 38785 * q2[14]) + + ( - 22621 * q2[13]) + + ( - 33153 * q2[12]) + + ( - 17846 * q2[11]) + + ( - 47184 * q2[10]) + + ( - 41001 * q2[9]) + + ( - 57649 * q2[8]) + + ( - 20082 * q2[7]) + + ( - 12388 * q2[6]); + + pol eq8_22 = + ( - 38785 * q2[15]) + + ( - 22621 * q2[14]) + + ( - 33153 * q2[13]) + + ( - 17846 * q2[12]) + + ( - 47184 * q2[11]) + + ( - 41001 * q2[10]) + + ( - 57649 * q2[9]) + + ( - 20082 * q2[8]) + + ( - 12388 * q2[7]); + + pol eq8_23 = + ( - 22621 * q2[15]) + + ( - 33153 * q2[14]) + + ( - 17846 * q2[13]) + + ( - 47184 * q2[12]) + + ( - 41001 * q2[11]) + + ( - 57649 * q2[10]) + + ( - 20082 * q2[9]) + + ( - 12388 * q2[8]); + + pol eq8_24 = + ( - 33153 * q2[15]) + + ( - 17846 * q2[14]) + + ( - 47184 * q2[13]) + + ( - 41001 * q2[12]) + + ( - 57649 * q2[11]) + + ( - 20082 * q2[10]) + + ( - 12388 * q2[9]); + + pol eq8_25 = + ( - 17846 * q2[15]) + + ( - 47184 * q2[14]) + + ( - 41001 * q2[13]) + + ( - 57649 * q2[12]) + + ( - 20082 * q2[11]) + + ( - 12388 * q2[10]); + + pol eq8_26 = + ( - 47184 * q2[15]) + + ( - 41001 * q2[14]) + + ( - 57649 * q2[13]) + + ( - 20082 * q2[12]) + + ( - 12388 * q2[11]); + + pol eq8_27 = + ( - 41001 * q2[15]) + + ( - 57649 * q2[14]) + + ( - 20082 * q2[13]) + + ( - 12388 * q2[12]); + + pol eq8_28 = + ( - 57649 * q2[15]) + + ( - 20082 * q2[14]) + + ( - 12388 * q2[13]); + + pol eq8_29 = + ( - 20082 * q2[15]) + + ( - 12388 * q2[14]); + + pol eq8_30 = ( - 12388 * q2[15]); + + pol eq8_31 = + 0; + + + + /******* + * + * EQ9: x1 - x2 - x3 + p * (q1 - offset) = 0 + * + *******/ + + pol eq9_0 = + (64839 * q1[0]) + - 518712 + x1[0] - x2[0] - x3[0]; + + pol eq9_1 = + (64839 * q1[1]) + + (55420 * q1[0]) + - 443360 + x1[1] - x2[1] - x3[1]; + + pol eq9_2 = + (64839 * q1[2]) + + (55420 * q1[1]) + + (35862 * q1[0]) + - 286896 + x1[2] - x2[2] - x3[2]; + + pol eq9_3 = + (64839 * q1[3]) + + (55420 * q1[2]) + + (35862 * q1[1]) + + (15392 * q1[0]) + - 123136 + x1[3] - x2[3] - x3[3]; + + pol eq9_4 = + (64839 * q1[4]) + + (55420 * q1[3]) + + (35862 * q1[2]) + + (15392 * q1[1]) + + (51853 * q1[0]) + - 414824 + x1[4] - x2[4] - x3[4]; + + pol eq9_5 = + (64839 * q1[5]) + + (55420 * q1[4]) + + (35862 * q1[3]) + + (15392 * q1[2]) + + (51853 * q1[1]) + + (26737 * q1[0]) + - 213896 + x1[5] - x2[5] - x3[5]; + + pol eq9_6 = + (64839 * q1[6]) + + (55420 * q1[5]) + + (35862 * q1[4]) + + (15392 * q1[3]) + + (51853 * q1[2]) + + (26737 * q1[1]) + + (27281 * q1[0]) + - 218248 + x1[6] - x2[6] - x3[6]; + + pol eq9_7 = + (64839 * q1[7]) + + (55420 * q1[6]) + + (35862 * q1[5]) + + (15392 * q1[4]) + + (51853 * q1[3]) + + (26737 * q1[2]) + + (27281 * q1[1]) + + (38785 * q1[0]) + - 310280 + x1[7] - x2[7] - x3[7]; + + pol eq9_8 = + (64839 * q1[8]) + + (55420 * q1[7]) + + (35862 * q1[6]) + + (15392 * q1[5]) + + (51853 * q1[4]) + + (26737 * q1[3]) + + (27281 * q1[2]) + + (38785 * q1[1]) + + (22621 * q1[0]) + - 180968 + x1[8] - x2[8] - x3[8]; + + pol eq9_9 = + (64839 * q1[9]) + + (55420 * q1[8]) + + (35862 * q1[7]) + + (15392 * q1[6]) + + (51853 * q1[5]) + + (26737 * q1[4]) + + (27281 * q1[3]) + + (38785 * q1[2]) + + (22621 * q1[1]) + + (33153 * q1[0]) + - 265224 + x1[9] - x2[9] - x3[9]; + + pol eq9_10 = + (64839 * q1[10]) + + (55420 * q1[9]) + + (35862 * q1[8]) + + (15392 * q1[7]) + + (51853 * q1[6]) + + (26737 * q1[5]) + + (27281 * q1[4]) + + (38785 * q1[3]) + + (22621 * q1[2]) + + (33153 * q1[1]) + + (17846 * q1[0]) + - 142768 + x1[10] - x2[10] - x3[10]; + + pol eq9_11 = + (64839 * q1[11]) + + (55420 * q1[10]) + + (35862 * q1[9]) + + (15392 * q1[8]) + + (51853 * q1[7]) + + (26737 * q1[6]) + + (27281 * q1[5]) + + (38785 * q1[4]) + + (22621 * q1[3]) + + (33153 * q1[2]) + + (17846 * q1[1]) + + (47184 * q1[0]) + - 377472 + x1[11] - x2[11] - x3[11]; + + pol eq9_12 = + (64839 * q1[12]) + + (55420 * q1[11]) + + (35862 * q1[10]) + + (15392 * q1[9]) + + (51853 * q1[8]) + + (26737 * q1[7]) + + (27281 * q1[6]) + + (38785 * q1[5]) + + (22621 * q1[4]) + + (33153 * q1[3]) + + (17846 * q1[2]) + + (47184 * q1[1]) + + (41001 * q1[0]) + - 328008 + x1[12] - x2[12] - x3[12]; + + pol eq9_13 = + (64839 * q1[13]) + + (55420 * q1[12]) + + (35862 * q1[11]) + + (15392 * q1[10]) + + (51853 * q1[9]) + + (26737 * q1[8]) + + (27281 * q1[7]) + + (38785 * q1[6]) + + (22621 * q1[5]) + + (33153 * q1[4]) + + (17846 * q1[3]) + + (47184 * q1[2]) + + (41001 * q1[1]) + + (57649 * q1[0]) + - 461192 + x1[13] - x2[13] - x3[13]; + + pol eq9_14 = + (64839 * q1[14]) + + (55420 * q1[13]) + + (35862 * q1[12]) + + (15392 * q1[11]) + + (51853 * q1[10]) + + (26737 * q1[9]) + + (27281 * q1[8]) + + (38785 * q1[7]) + + (22621 * q1[6]) + + (33153 * q1[5]) + + (17846 * q1[4]) + + (47184 * q1[3]) + + (41001 * q1[2]) + + (57649 * q1[1]) + + (20082 * q1[0]) + - 160656 + x1[14] - x2[14] - x3[14]; + + pol eq9_15 = + (64839 * q1[15]) + + (55420 * q1[14]) + + (35862 * q1[13]) + + (15392 * q1[12]) + + (51853 * q1[11]) + + (26737 * q1[10]) + + (27281 * q1[9]) + + (38785 * q1[8]) + + (22621 * q1[7]) + + (33153 * q1[6]) + + (17846 * q1[5]) + + (47184 * q1[4]) + + (41001 * q1[3]) + + (57649 * q1[2]) + + (20082 * q1[1]) + + (12388 * q1[0]) + - 99104 + x1[15] - x2[15] - x3[15]; + + pol eq9_16 = + (55420 * q1[15]) + + (35862 * q1[14]) + + (15392 * q1[13]) + + (51853 * q1[12]) + + (26737 * q1[11]) + + (27281 * q1[10]) + + (38785 * q1[9]) + + (22621 * q1[8]) + + (33153 * q1[7]) + + (17846 * q1[6]) + + (47184 * q1[5]) + + (41001 * q1[4]) + + (57649 * q1[3]) + + (20082 * q1[2]) + + (12388 * q1[1]); + + pol eq9_17 = + (35862 * q1[15]) + + (15392 * q1[14]) + + (51853 * q1[13]) + + (26737 * q1[12]) + + (27281 * q1[11]) + + (38785 * q1[10]) + + (22621 * q1[9]) + + (33153 * q1[8]) + + (17846 * q1[7]) + + (47184 * q1[6]) + + (41001 * q1[5]) + + (57649 * q1[4]) + + (20082 * q1[3]) + + (12388 * q1[2]); + + pol eq9_18 = + (15392 * q1[15]) + + (51853 * q1[14]) + + (26737 * q1[13]) + + (27281 * q1[12]) + + (38785 * q1[11]) + + (22621 * q1[10]) + + (33153 * q1[9]) + + (17846 * q1[8]) + + (47184 * q1[7]) + + (41001 * q1[6]) + + (57649 * q1[5]) + + (20082 * q1[4]) + + (12388 * q1[3]); + + pol eq9_19 = + (51853 * q1[15]) + + (26737 * q1[14]) + + (27281 * q1[13]) + + (38785 * q1[12]) + + (22621 * q1[11]) + + (33153 * q1[10]) + + (17846 * q1[9]) + + (47184 * q1[8]) + + (41001 * q1[7]) + + (57649 * q1[6]) + + (20082 * q1[5]) + + (12388 * q1[4]); + + pol eq9_20 = + (26737 * q1[15]) + + (27281 * q1[14]) + + (38785 * q1[13]) + + (22621 * q1[12]) + + (33153 * q1[11]) + + (17846 * q1[10]) + + (47184 * q1[9]) + + (41001 * q1[8]) + + (57649 * q1[7]) + + (20082 * q1[6]) + + (12388 * q1[5]); + + pol eq9_21 = + (27281 * q1[15]) + + (38785 * q1[14]) + + (22621 * q1[13]) + + (33153 * q1[12]) + + (17846 * q1[11]) + + (47184 * q1[10]) + + (41001 * q1[9]) + + (57649 * q1[8]) + + (20082 * q1[7]) + + (12388 * q1[6]); + + pol eq9_22 = + (38785 * q1[15]) + + (22621 * q1[14]) + + (33153 * q1[13]) + + (17846 * q1[12]) + + (47184 * q1[11]) + + (41001 * q1[10]) + + (57649 * q1[9]) + + (20082 * q1[8]) + + (12388 * q1[7]); + + pol eq9_23 = + (22621 * q1[15]) + + (33153 * q1[14]) + + (17846 * q1[13]) + + (47184 * q1[12]) + + (41001 * q1[11]) + + (57649 * q1[10]) + + (20082 * q1[9]) + + (12388 * q1[8]); + + pol eq9_24 = + (33153 * q1[15]) + + (17846 * q1[14]) + + (47184 * q1[13]) + + (41001 * q1[12]) + + (57649 * q1[11]) + + (20082 * q1[10]) + + (12388 * q1[9]); + + pol eq9_25 = + (17846 * q1[15]) + + (47184 * q1[14]) + + (41001 * q1[13]) + + (57649 * q1[12]) + + (20082 * q1[11]) + + (12388 * q1[10]); + + pol eq9_26 = + (47184 * q1[15]) + + (41001 * q1[14]) + + (57649 * q1[13]) + + (20082 * q1[12]) + + (12388 * q1[11]); + + pol eq9_27 = + (41001 * q1[15]) + + (57649 * q1[14]) + + (20082 * q1[13]) + + (12388 * q1[12]); + + pol eq9_28 = + (57649 * q1[15]) + + (20082 * q1[14]) + + (12388 * q1[13]); + + pol eq9_29 = + (20082 * q1[15]) + + (12388 * q1[14]); + + pol eq9_30 = (12388 * q1[15]); + + pol eq9_31 = + 0; + + + /******* + * + * EQ10: y1 - y2 - y3 + p * (q2 - offset) = 0 + * + *******/ + + pol eq10_0 = + (64839 * q2[0]) + - 518712 + y1[0] - y2[0] - y3[0]; + + pol eq10_1 = + (64839 * q2[1]) + + (55420 * q2[0]) + - 443360 + y1[1] - y2[1] - y3[1]; + + pol eq10_2 = + (64839 * q2[2]) + + (55420 * q2[1]) + + (35862 * q2[0]) + - 286896 + y1[2] - y2[2] - y3[2]; + + pol eq10_3 = + (64839 * q2[3]) + + (55420 * q2[2]) + + (35862 * q2[1]) + + (15392 * q2[0]) + - 123136 + y1[3] - y2[3] - y3[3]; + + pol eq10_4 = + (64839 * q2[4]) + + (55420 * q2[3]) + + (35862 * q2[2]) + + (15392 * q2[1]) + + (51853 * q2[0]) + - 414824 + y1[4] - y2[4] - y3[4]; + + pol eq10_5 = + (64839 * q2[5]) + + (55420 * q2[4]) + + (35862 * q2[3]) + + (15392 * q2[2]) + + (51853 * q2[1]) + + (26737 * q2[0]) + - 213896 + y1[5] - y2[5] - y3[5]; + + pol eq10_6 = + (64839 * q2[6]) + + (55420 * q2[5]) + + (35862 * q2[4]) + + (15392 * q2[3]) + + (51853 * q2[2]) + + (26737 * q2[1]) + + (27281 * q2[0]) + - 218248 + y1[6] - y2[6] - y3[6]; + + pol eq10_7 = + (64839 * q2[7]) + + (55420 * q2[6]) + + (35862 * q2[5]) + + (15392 * q2[4]) + + (51853 * q2[3]) + + (26737 * q2[2]) + + (27281 * q2[1]) + + (38785 * q2[0]) + - 310280 + y1[7] - y2[7] - y3[7]; + + pol eq10_8 = + (64839 * q2[8]) + + (55420 * q2[7]) + + (35862 * q2[6]) + + (15392 * q2[5]) + + (51853 * q2[4]) + + (26737 * q2[3]) + + (27281 * q2[2]) + + (38785 * q2[1]) + + (22621 * q2[0]) + - 180968 + y1[8] - y2[8] - y3[8]; + + pol eq10_9 = + (64839 * q2[9]) + + (55420 * q2[8]) + + (35862 * q2[7]) + + (15392 * q2[6]) + + (51853 * q2[5]) + + (26737 * q2[4]) + + (27281 * q2[3]) + + (38785 * q2[2]) + + (22621 * q2[1]) + + (33153 * q2[0]) + - 265224 + y1[9] - y2[9] - y3[9]; + + pol eq10_10 = + (64839 * q2[10]) + + (55420 * q2[9]) + + (35862 * q2[8]) + + (15392 * q2[7]) + + (51853 * q2[6]) + + (26737 * q2[5]) + + (27281 * q2[4]) + + (38785 * q2[3]) + + (22621 * q2[2]) + + (33153 * q2[1]) + + (17846 * q2[0]) + - 142768 + y1[10] - y2[10] - y3[10]; + + pol eq10_11 = + (64839 * q2[11]) + + (55420 * q2[10]) + + (35862 * q2[9]) + + (15392 * q2[8]) + + (51853 * q2[7]) + + (26737 * q2[6]) + + (27281 * q2[5]) + + (38785 * q2[4]) + + (22621 * q2[3]) + + (33153 * q2[2]) + + (17846 * q2[1]) + + (47184 * q2[0]) + - 377472 + y1[11] - y2[11] - y3[11]; + + pol eq10_12 = + (64839 * q2[12]) + + (55420 * q2[11]) + + (35862 * q2[10]) + + (15392 * q2[9]) + + (51853 * q2[8]) + + (26737 * q2[7]) + + (27281 * q2[6]) + + (38785 * q2[5]) + + (22621 * q2[4]) + + (33153 * q2[3]) + + (17846 * q2[2]) + + (47184 * q2[1]) + + (41001 * q2[0]) + - 328008 + y1[12] - y2[12] - y3[12]; + + pol eq10_13 = + (64839 * q2[13]) + + (55420 * q2[12]) + + (35862 * q2[11]) + + (15392 * q2[10]) + + (51853 * q2[9]) + + (26737 * q2[8]) + + (27281 * q2[7]) + + (38785 * q2[6]) + + (22621 * q2[5]) + + (33153 * q2[4]) + + (17846 * q2[3]) + + (47184 * q2[2]) + + (41001 * q2[1]) + + (57649 * q2[0]) + - 461192 + y1[13] - y2[13] - y3[13]; + + pol eq10_14 = + (64839 * q2[14]) + + (55420 * q2[13]) + + (35862 * q2[12]) + + (15392 * q2[11]) + + (51853 * q2[10]) + + (26737 * q2[9]) + + (27281 * q2[8]) + + (38785 * q2[7]) + + (22621 * q2[6]) + + (33153 * q2[5]) + + (17846 * q2[4]) + + (47184 * q2[3]) + + (41001 * q2[2]) + + (57649 * q2[1]) + + (20082 * q2[0]) + - 160656 + y1[14] - y2[14] - y3[14]; + + pol eq10_15 = + (64839 * q2[15]) + + (55420 * q2[14]) + + (35862 * q2[13]) + + (15392 * q2[12]) + + (51853 * q2[11]) + + (26737 * q2[10]) + + (27281 * q2[9]) + + (38785 * q2[8]) + + (22621 * q2[7]) + + (33153 * q2[6]) + + (17846 * q2[5]) + + (47184 * q2[4]) + + (41001 * q2[3]) + + (57649 * q2[2]) + + (20082 * q2[1]) + + (12388 * q2[0]) + - 99104 + y1[15] - y2[15] - y3[15]; + + pol eq10_16 = + (55420 * q2[15]) + + (35862 * q2[14]) + + (15392 * q2[13]) + + (51853 * q2[12]) + + (26737 * q2[11]) + + (27281 * q2[10]) + + (38785 * q2[9]) + + (22621 * q2[8]) + + (33153 * q2[7]) + + (17846 * q2[6]) + + (47184 * q2[5]) + + (41001 * q2[4]) + + (57649 * q2[3]) + + (20082 * q2[2]) + + (12388 * q2[1]); + + pol eq10_17 = + (35862 * q2[15]) + + (15392 * q2[14]) + + (51853 * q2[13]) + + (26737 * q2[12]) + + (27281 * q2[11]) + + (38785 * q2[10]) + + (22621 * q2[9]) + + (33153 * q2[8]) + + (17846 * q2[7]) + + (47184 * q2[6]) + + (41001 * q2[5]) + + (57649 * q2[4]) + + (20082 * q2[3]) + + (12388 * q2[2]); + + pol eq10_18 = + (15392 * q2[15]) + + (51853 * q2[14]) + + (26737 * q2[13]) + + (27281 * q2[12]) + + (38785 * q2[11]) + + (22621 * q2[10]) + + (33153 * q2[9]) + + (17846 * q2[8]) + + (47184 * q2[7]) + + (41001 * q2[6]) + + (57649 * q2[5]) + + (20082 * q2[4]) + + (12388 * q2[3]); + + pol eq10_19 = + (51853 * q2[15]) + + (26737 * q2[14]) + + (27281 * q2[13]) + + (38785 * q2[12]) + + (22621 * q2[11]) + + (33153 * q2[10]) + + (17846 * q2[9]) + + (47184 * q2[8]) + + (41001 * q2[7]) + + (57649 * q2[6]) + + (20082 * q2[5]) + + (12388 * q2[4]); + + pol eq10_20 = + (26737 * q2[15]) + + (27281 * q2[14]) + + (38785 * q2[13]) + + (22621 * q2[12]) + + (33153 * q2[11]) + + (17846 * q2[10]) + + (47184 * q2[9]) + + (41001 * q2[8]) + + (57649 * q2[7]) + + (20082 * q2[6]) + + (12388 * q2[5]); + + pol eq10_21 = + (27281 * q2[15]) + + (38785 * q2[14]) + + (22621 * q2[13]) + + (33153 * q2[12]) + + (17846 * q2[11]) + + (47184 * q2[10]) + + (41001 * q2[9]) + + (57649 * q2[8]) + + (20082 * q2[7]) + + (12388 * q2[6]); + + pol eq10_22 = + (38785 * q2[15]) + + (22621 * q2[14]) + + (33153 * q2[13]) + + (17846 * q2[12]) + + (47184 * q2[11]) + + (41001 * q2[10]) + + (57649 * q2[9]) + + (20082 * q2[8]) + + (12388 * q2[7]); + + pol eq10_23 = + (22621 * q2[15]) + + (33153 * q2[14]) + + (17846 * q2[13]) + + (47184 * q2[12]) + + (41001 * q2[11]) + + (57649 * q2[10]) + + (20082 * q2[9]) + + (12388 * q2[8]); + + pol eq10_24 = + (33153 * q2[15]) + + (17846 * q2[14]) + + (47184 * q2[13]) + + (41001 * q2[12]) + + (57649 * q2[11]) + + (20082 * q2[10]) + + (12388 * q2[9]); + + pol eq10_25 = + (17846 * q2[15]) + + (47184 * q2[14]) + + (41001 * q2[13]) + + (57649 * q2[12]) + + (20082 * q2[11]) + + (12388 * q2[10]); + + pol eq10_26 = + (47184 * q2[15]) + + (41001 * q2[14]) + + (57649 * q2[13]) + + (20082 * q2[12]) + + (12388 * q2[11]); + + pol eq10_27 = + (41001 * q2[15]) + + (57649 * q2[14]) + + (20082 * q2[13]) + + (12388 * q2[12]); + + pol eq10_28 = + (57649 * q2[15]) + + (20082 * q2[14]) + + (12388 * q2[13]); + + pol eq10_29 = + (20082 * q2[15]) + + (12388 * q2[14]); + + pol eq10_30 = (12388 * q2[15]); + + pol eq10_31 = + 0; + + + pol eq0 = eq0_0*Global.CLK32[0] + eq0_1*Global.CLK32[1] + eq0_2*Global.CLK32[2] + eq0_3*Global.CLK32[3] + eq0_4*Global.CLK32[4] + eq0_5*Global.CLK32[5] + eq0_6*Global.CLK32[6] + eq0_7*Global.CLK32[7] + + eq0_8*Global.CLK32[8] + eq0_9*Global.CLK32[9] + eq0_10*Global.CLK32[10] + eq0_11*Global.CLK32[11] + eq0_12*Global.CLK32[12] + eq0_13*Global.CLK32[13] + eq0_14*Global.CLK32[14] + eq0_15*Global.CLK32[15] + + eq0_16*Global.CLK32[16] + eq0_17*Global.CLK32[17] + eq0_18*Global.CLK32[18] + eq0_19*Global.CLK32[19] + eq0_20*Global.CLK32[20] + eq0_21*Global.CLK32[21] + eq0_22*Global.CLK32[22] + eq0_23*Global.CLK32[23] + + eq0_24*Global.CLK32[24] + eq0_25*Global.CLK32[25] + eq0_26*Global.CLK32[26] + eq0_27*Global.CLK32[27] + eq0_28*Global.CLK32[28] + eq0_29*Global.CLK32[29] + eq0_30*Global.CLK32[30] + eq0_31*Global.CLK32[31]; + pol eq1 = eq1_0*Global.CLK32[0] + eq1_1*Global.CLK32[1] + eq1_2*Global.CLK32[2] + eq1_3*Global.CLK32[3] + eq1_4*Global.CLK32[4] + eq1_5*Global.CLK32[5] + eq1_6*Global.CLK32[6] + eq1_7*Global.CLK32[7] + + eq1_8*Global.CLK32[8] + eq1_9*Global.CLK32[9] + eq1_10*Global.CLK32[10] + eq1_11*Global.CLK32[11] + eq1_12*Global.CLK32[12] + eq1_13*Global.CLK32[13] + eq1_14*Global.CLK32[14] + eq1_15*Global.CLK32[15] + + eq1_16*Global.CLK32[16] + eq1_17*Global.CLK32[17] + eq1_18*Global.CLK32[18] + eq1_19*Global.CLK32[19] + eq1_20*Global.CLK32[20] + eq1_21*Global.CLK32[21] + eq1_22*Global.CLK32[22] + eq1_23*Global.CLK32[23] + + eq1_24*Global.CLK32[24] + eq1_25*Global.CLK32[25] + eq1_26*Global.CLK32[26] + eq1_27*Global.CLK32[27] + eq1_28*Global.CLK32[28] + eq1_29*Global.CLK32[29] + eq1_30*Global.CLK32[30] + eq1_31*Global.CLK32[31]; + pol eq2 = eq2_0*Global.CLK32[0] + eq2_1*Global.CLK32[1] + eq2_2*Global.CLK32[2] + eq2_3*Global.CLK32[3] + eq2_4*Global.CLK32[4] + eq2_5*Global.CLK32[5] + eq2_6*Global.CLK32[6] + eq2_7*Global.CLK32[7] + + eq2_8*Global.CLK32[8] + eq2_9*Global.CLK32[9] + eq2_10*Global.CLK32[10] + eq2_11*Global.CLK32[11] + eq2_12*Global.CLK32[12] + eq2_13*Global.CLK32[13] + eq2_14*Global.CLK32[14] + eq2_15*Global.CLK32[15] + + eq2_16*Global.CLK32[16] + eq2_17*Global.CLK32[17] + eq2_18*Global.CLK32[18] + eq2_19*Global.CLK32[19] + eq2_20*Global.CLK32[20] + eq2_21*Global.CLK32[21] + eq2_22*Global.CLK32[22] + eq2_23*Global.CLK32[23] + + eq2_24*Global.CLK32[24] + eq2_25*Global.CLK32[25] + eq2_26*Global.CLK32[26] + eq2_27*Global.CLK32[27] + eq2_28*Global.CLK32[28] + eq2_29*Global.CLK32[29] + eq2_30*Global.CLK32[30] + eq2_31*Global.CLK32[31]; + pol eq3 = eq3_0*Global.CLK32[0] + eq3_1*Global.CLK32[1] + eq3_2*Global.CLK32[2] + eq3_3*Global.CLK32[3] + eq3_4*Global.CLK32[4] + eq3_5*Global.CLK32[5] + eq3_6*Global.CLK32[6] + eq3_7*Global.CLK32[7] + + eq3_8*Global.CLK32[8] + eq3_9*Global.CLK32[9] + eq3_10*Global.CLK32[10] + eq3_11*Global.CLK32[11] + eq3_12*Global.CLK32[12] + eq3_13*Global.CLK32[13] + eq3_14*Global.CLK32[14] + eq3_15*Global.CLK32[15] + + eq3_16*Global.CLK32[16] + eq3_17*Global.CLK32[17] + eq3_18*Global.CLK32[18] + eq3_19*Global.CLK32[19] + eq3_20*Global.CLK32[20] + eq3_21*Global.CLK32[21] + eq3_22*Global.CLK32[22] + eq3_23*Global.CLK32[23] + + eq3_24*Global.CLK32[24] + eq3_25*Global.CLK32[25] + eq3_26*Global.CLK32[26] + eq3_27*Global.CLK32[27] + eq3_28*Global.CLK32[28] + eq3_29*Global.CLK32[29] + eq3_30*Global.CLK32[30] + eq3_31*Global.CLK32[31]; + pol eq4 = eq4_0*Global.CLK32[0] + eq4_1*Global.CLK32[1] + eq4_2*Global.CLK32[2] + eq4_3*Global.CLK32[3] + eq4_4*Global.CLK32[4] + eq4_5*Global.CLK32[5] + eq4_6*Global.CLK32[6] + eq4_7*Global.CLK32[7] + + eq4_8*Global.CLK32[8] + eq4_9*Global.CLK32[9] + eq4_10*Global.CLK32[10] + eq4_11*Global.CLK32[11] + eq4_12*Global.CLK32[12] + eq4_13*Global.CLK32[13] + eq4_14*Global.CLK32[14] + eq4_15*Global.CLK32[15] + + eq4_16*Global.CLK32[16] + eq4_17*Global.CLK32[17] + eq4_18*Global.CLK32[18] + eq4_19*Global.CLK32[19] + eq4_20*Global.CLK32[20] + eq4_21*Global.CLK32[21] + eq4_22*Global.CLK32[22] + eq4_23*Global.CLK32[23] + + eq4_24*Global.CLK32[24] + eq4_25*Global.CLK32[25] + eq4_26*Global.CLK32[26] + eq4_27*Global.CLK32[27] + eq4_28*Global.CLK32[28] + eq4_29*Global.CLK32[29] + eq4_30*Global.CLK32[30] + eq4_31*Global.CLK32[31]; + pol eq5 = eq5_0*Global.CLK32[0] + eq5_1*Global.CLK32[1] + eq5_2*Global.CLK32[2] + eq5_3*Global.CLK32[3] + eq5_4*Global.CLK32[4] + eq5_5*Global.CLK32[5] + eq5_6*Global.CLK32[6] + eq5_7*Global.CLK32[7] + + eq5_8*Global.CLK32[8] + eq5_9*Global.CLK32[9] + eq5_10*Global.CLK32[10] + eq5_11*Global.CLK32[11] + eq5_12*Global.CLK32[12] + eq5_13*Global.CLK32[13] + eq5_14*Global.CLK32[14] + eq5_15*Global.CLK32[15] + + eq5_16*Global.CLK32[16] + eq5_17*Global.CLK32[17] + eq5_18*Global.CLK32[18] + eq5_19*Global.CLK32[19] + eq5_20*Global.CLK32[20] + eq5_21*Global.CLK32[21] + eq5_22*Global.CLK32[22] + eq5_23*Global.CLK32[23] + + eq5_24*Global.CLK32[24] + eq5_25*Global.CLK32[25] + eq5_26*Global.CLK32[26] + eq5_27*Global.CLK32[27] + eq5_28*Global.CLK32[28] + eq5_29*Global.CLK32[29] + eq5_30*Global.CLK32[30] + eq5_31*Global.CLK32[31]; + pol eq6 = eq6_0*Global.CLK32[0] + eq6_1*Global.CLK32[1] + eq6_2*Global.CLK32[2] + eq6_3*Global.CLK32[3] + eq6_4*Global.CLK32[4] + eq6_5*Global.CLK32[5] + eq6_6*Global.CLK32[6] + eq6_7*Global.CLK32[7] + + eq6_8*Global.CLK32[8] + eq6_9*Global.CLK32[9] + eq6_10*Global.CLK32[10] + eq6_11*Global.CLK32[11] + eq6_12*Global.CLK32[12] + eq6_13*Global.CLK32[13] + eq6_14*Global.CLK32[14] + eq6_15*Global.CLK32[15] + + eq6_16*Global.CLK32[16] + eq6_17*Global.CLK32[17] + eq6_18*Global.CLK32[18] + eq6_19*Global.CLK32[19] + eq6_20*Global.CLK32[20] + eq6_21*Global.CLK32[21] + eq6_22*Global.CLK32[22] + eq6_23*Global.CLK32[23] + + eq6_24*Global.CLK32[24] + eq6_25*Global.CLK32[25] + eq6_26*Global.CLK32[26] + eq6_27*Global.CLK32[27] + eq6_28*Global.CLK32[28] + eq6_29*Global.CLK32[29] + eq6_30*Global.CLK32[30] + eq6_31*Global.CLK32[31]; + pol eq7 = eq7_0*Global.CLK32[0] + eq7_1*Global.CLK32[1] + eq7_2*Global.CLK32[2] + eq7_3*Global.CLK32[3] + eq7_4*Global.CLK32[4] + eq7_5*Global.CLK32[5] + eq7_6*Global.CLK32[6] + eq7_7*Global.CLK32[7] + + eq7_8*Global.CLK32[8] + eq7_9*Global.CLK32[9] + eq7_10*Global.CLK32[10] + eq7_11*Global.CLK32[11] + eq7_12*Global.CLK32[12] + eq7_13*Global.CLK32[13] + eq7_14*Global.CLK32[14] + eq7_15*Global.CLK32[15] + + eq7_16*Global.CLK32[16] + eq7_17*Global.CLK32[17] + eq7_18*Global.CLK32[18] + eq7_19*Global.CLK32[19] + eq7_20*Global.CLK32[20] + eq7_21*Global.CLK32[21] + eq7_22*Global.CLK32[22] + eq7_23*Global.CLK32[23] + + eq7_24*Global.CLK32[24] + eq7_25*Global.CLK32[25] + eq7_26*Global.CLK32[26] + eq7_27*Global.CLK32[27] + eq7_28*Global.CLK32[28] + eq7_29*Global.CLK32[29] + eq7_30*Global.CLK32[30] + eq7_31*Global.CLK32[31]; + pol eq8 = eq8_0*Global.CLK32[0] + eq8_1*Global.CLK32[1] + eq8_2*Global.CLK32[2] + eq8_3*Global.CLK32[3] + eq8_4*Global.CLK32[4] + eq8_5*Global.CLK32[5] + eq8_6*Global.CLK32[6] + eq8_7*Global.CLK32[7] + + eq8_8*Global.CLK32[8] + eq8_9*Global.CLK32[9] + eq8_10*Global.CLK32[10] + eq8_11*Global.CLK32[11] + eq8_12*Global.CLK32[12] + eq8_13*Global.CLK32[13] + eq8_14*Global.CLK32[14] + eq8_15*Global.CLK32[15] + + eq8_16*Global.CLK32[16] + eq8_17*Global.CLK32[17] + eq8_18*Global.CLK32[18] + eq8_19*Global.CLK32[19] + eq8_20*Global.CLK32[20] + eq8_21*Global.CLK32[21] + eq8_22*Global.CLK32[22] + eq8_23*Global.CLK32[23] + + eq8_24*Global.CLK32[24] + eq8_25*Global.CLK32[25] + eq8_26*Global.CLK32[26] + eq8_27*Global.CLK32[27] + eq8_28*Global.CLK32[28] + eq8_29*Global.CLK32[29] + eq8_30*Global.CLK32[30] + eq8_31*Global.CLK32[31]; + pol eq9 = eq9_0*Global.CLK32[0] + eq9_1*Global.CLK32[1] + eq9_2*Global.CLK32[2] + eq9_3*Global.CLK32[3] + eq9_4*Global.CLK32[4] + eq9_5*Global.CLK32[5] + eq9_6*Global.CLK32[6] + eq9_7*Global.CLK32[7] + + eq9_8*Global.CLK32[8] + eq9_9*Global.CLK32[9] + eq9_10*Global.CLK32[10] + eq9_11*Global.CLK32[11] + eq9_12*Global.CLK32[12] + eq9_13*Global.CLK32[13] + eq9_14*Global.CLK32[14] + eq9_15*Global.CLK32[15] + + eq9_16*Global.CLK32[16] + eq9_17*Global.CLK32[17] + eq9_18*Global.CLK32[18] + eq9_19*Global.CLK32[19] + eq9_20*Global.CLK32[20] + eq9_21*Global.CLK32[21] + eq9_22*Global.CLK32[22] + eq9_23*Global.CLK32[23] + + eq9_24*Global.CLK32[24] + eq9_25*Global.CLK32[25] + eq9_26*Global.CLK32[26] + eq9_27*Global.CLK32[27] + eq9_28*Global.CLK32[28] + eq9_29*Global.CLK32[29] + eq9_30*Global.CLK32[30] + eq9_31*Global.CLK32[31]; + pol eq10 = eq10_0*Global.CLK32[0] + eq10_1*Global.CLK32[1] + eq10_2*Global.CLK32[2] + eq10_3*Global.CLK32[3] + eq10_4*Global.CLK32[4] + eq10_5*Global.CLK32[5] + eq10_6*Global.CLK32[6] + eq10_7*Global.CLK32[7] + + eq10_8*Global.CLK32[8] + eq10_9*Global.CLK32[9] + eq10_10*Global.CLK32[10] + eq10_11*Global.CLK32[11] + eq10_12*Global.CLK32[12] + eq10_13*Global.CLK32[13] + eq10_14*Global.CLK32[14] + eq10_15*Global.CLK32[15] + + eq10_16*Global.CLK32[16] + eq10_17*Global.CLK32[17] + eq10_18*Global.CLK32[18] + eq10_19*Global.CLK32[19] + eq10_20*Global.CLK32[20] + eq10_21*Global.CLK32[21] + eq10_22*Global.CLK32[22] + eq10_23*Global.CLK32[23] + + eq10_24*Global.CLK32[24] + eq10_25*Global.CLK32[25] + eq10_26*Global.CLK32[26] + eq10_27*Global.CLK32[27] + eq10_28*Global.CLK32[28] + eq10_29*Global.CLK32[29] + eq10_30*Global.CLK32[30] + eq10_31*Global.CLK32[31]; + + pol commit selEq[7]; + + selEq[0]' * (1-Global.CLK32[31]) = selEq[0] * (1-Global.CLK32[31]); + selEq[1]' * (1-Global.CLK32[31]) = selEq[1] * (1-Global.CLK32[31]); + selEq[2]' * (1-Global.CLK32[31]) = selEq[2] * (1-Global.CLK32[31]); + selEq[3]' * (1-Global.CLK32[31]) = selEq[3] * (1-Global.CLK32[31]); + selEq[4]' * (1-Global.CLK32[31]) = selEq[4] * (1-Global.CLK32[31]); + selEq[5]' * (1-Global.CLK32[31]) = selEq[5] * (1-Global.CLK32[31]); + selEq[6]' * (1-Global.CLK32[31]) = selEq[6] * (1-Global.CLK32[31]); + + selEq[0] * (1-selEq[0]) = 0; + selEq[1] * (1-selEq[1]) = 0; + selEq[2] * (1-selEq[2]) = 0; + selEq[3] * (1-selEq[3]) = 0; + selEq[4] * (1-selEq[4]) = 0; + selEq[5] * (1-selEq[5]) = 0; + selEq[6] * (1-selEq[6]) = 0; + + + pol commit carry[3]; + + carry[0] * Global.CLK32[0] = 0; + carry[1] * Global.CLK32[0] = 0; + carry[2] * Global.CLK32[0] = 0; + + carry[0] in GL_SIGNED_22BITS; + carry[1] in GL_SIGNED_22BITS; + carry[2] in GL_SIGNED_22BITS; + + selEq[0] * (eq0 + carry[0]) = selEq[0] * carry[0]' * 2**16; + selEq[1] * (eq1 + carry[0]) = selEq[1] * carry[0]' * 2**16; + selEq[2] * (eq2 + carry[0]) = selEq[2] * carry[0]' * 2**16; + selEq[3] * (eq3 + carry[1]) = selEq[3] * carry[1]' * 2**16; + selEq[3] * (eq4 + carry[2]) = selEq[3] * carry[2]' * 2**16; + selEq[4] * (eq5 + carry[1]) = selEq[4] * carry[1]' * 2**16; + selEq[4] * (eq6 + carry[2]) = selEq[4] * carry[2]' * 2**16; + selEq[5] * (eq7 + carry[1]) = selEq[5] * carry[1]' * 2**16; + selEq[5] * (eq8 + carry[2]) = selEq[5] * carry[2]' * 2**16; + selEq[6] * (eq9 + carry[1]) = selEq[6] * carry[1]' * 2**16; + selEq[6] * (eq10 + carry[2]) = selEq[6] * carry[2]' * 2**16; diff --git a/test/pil2/zkevm-etrog/binary.pil b/test/pil2/zkevm-etrog/binary.pil new file mode 100644 index 0000000..4baaf42 --- /dev/null +++ b/test/pil2/zkevm-etrog/binary.pil @@ -0,0 +1,130 @@ +// PIL State Machine that compute 256 bits operations: +// +// ADD (OP:0) +// SUB (OP:1) +// LT (OP:2) +// SLT (OP:3) +// EQ (OP:4) +// AND (OP:5) +// OR (OP:6) +// XOR (OP:7) +// LT4 (OP:8) + +const int BINARY_ID = 1; + +subproof aggregate Binary(2**21, 2**23, 2**25) { + + col fixed RESET = [1,0:7]...; + + col witness freeInA[4], freeInB[4], freeInC[4]; // 4 x 1 Byte (2 inputs, 1 output) + col witness a, b, c; // rebuild registers for lookup. 8 clocks x 32 bits = 256 bits + col witness op; // operation code + col witness carry[5]; // 4 chunks carries [cin:0,cout:1],[cin:1,cout:2],[cin:2,cout:3],[cin:3,cout:4] + col witness result; // selector of result binary operation + + (1 - RESET) * result = 0; + result * (1 - result) = 0; + + (opcode' - opcode) * (1 - RESET') === 0; + + cIn' === cOut * ( 1 - RESET' ); + + for (int index = 0; index < length(carry); index += 1) { + carry[index] * (1 - carry[index]) === 0; + } + // pol commit lCout,lOpcode; + + // LT4 (opcode = 8) + // + // This instruction operates over 4 chunks of 64 bits, so we divide the 256-bit values "a" and "b" in 4 chunks of 64 bits. It verifies + // that the 4 "a" chunks are LESS THAN the 4 "b" chunks, one-to-one. + // + // Examples: + // (0x0FFF...FFFF, 0x0FFF...FFFF, 0x0FFF...FFFF, 0x0FFF...FFFF) LT4 (0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF) = 1 + // (0x0FFF...FFFF, 0x0FFF...FFFF, 0xFFFF...FFFF, 0x0FFF...FFFF) LT4 (0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF) = 0 + // ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ + // + // previousAreLt4: [binary value] flag (*) to indicate whether the first three chunks are lower than or not. + // It is 1 if all of the first three chunks of a are lower than those of b, and 0 otherwise. + // Before the first comparation is 0, and is set with the result of the first comparation. After that, the value is propagated. + // In particular, on the comparisons of the second and third chunks, the result of the comparison (cOut) is multiplied by its value, + // to force it being zero if some of the previous comparison are zero. It works similar to the AND operator. + // Mathematically, this is: + // first chunk --> previousAreLt4 = cOut + // second chunk --> previousAreLt4 = previousAreLt4 * cOut + // third chunk --> previousAreLt4 = previousAreLt4 * cOut + // fourth chunk --> no affects to previousAreLt4 + // + // usePreviousAreLt4: [binary value] flag (**) to use the value of previousAreLt4. It is only active if: + // (a) we are at the last byte, (b) we are in the LT4 operation and (c) it happens that cOut = 1. + // In the last clock, we have: + // · If cOut = 1, then lastChunk(a) < lastChunk(b). Then a LT4 b if the previous chunks are also lower. + // · If cOut = 0, then lastChunk(a) >= lastChunk(b). Then, it doesn't matter the previous chunks; the result of a LT4 b is cOut = 0. + // + // reset4: [binary value] flag (**) to indicate that cIn is reset each 4 clocks in the LT4 operation. + // + // NOTE: (*) Flag is validated by lookup values. + // + // NOTE: (**) To validate the flags usePreviousAreLt4, reset4, useCarry and cOut, check that the composition: + // cout + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 + // is in P_FLAGS. + // After the last optimization, these flags MUST BE constrained to be binary. + // + + col witness previousAreLt4; + col witness usePreviousAreLt4; + col witness reset4; + col witness useCarry; + + previousAreLt4 * (1 - previousAreLt4) === 0; + usePreviousAreLt4 * (1 - usePreviousAreLt4) === 0; + reset4 * (1 - reset4) === 0; + useCarry * (1 - useCarry) === 0; + cOut * (1 - cOut) === 0; + + // RESET = Global.CLK32[0] + Global.CLK32[16]; + + cIn' === cOut * ( 1 - RESET' + reset4 * (Global.CLK32[3] + Global.CLK32[7] + Global.CLK32[11] + + Global.CLK32[19] + Global.CLK32[23] + Global.CLK32[27])); + + // LT4_PROPAGATE (polynomial made up of constant, binary and disjoint polynomials, therefore it's a constant and binary polynomial) + // + // Each 4 clocks this sm has processed 8 bytes = 64 bits, last clock isn't relevant last clock cOut is ignored because: + // · last cout = 0 => means LT4 = 0 (if the last chunk of a isn't lower than the last of b then we are done). + // · last cout = 1 => means last a chunk is less than b, in this path result only deepends of ge4 value. + + const expr LT4_PROPAGATE = /* NO 0-2,3 */ Global.CLK32[4] + Global.CLK32[5] + Global.CLK32[6] + /* NO 7 */ + Global.CLK32[8] + Global.CLK32[9] + + Global.CLK32[10] + /* NO 11 */ + Global.CLK32[12] + Global.CLK32[13] + Global.CLK32[14] + Global.CLK32[15] + /* NO 16-18,19 */ + Global.CLK32[20] + Global.CLK32[21] + Global.CLK32[22] + /* NO 23 */ + Global.CLK32[24] + Global.CLK32[25] + + Global.CLK32[26] + /* NO 27 */ + Global.CLK32[28] + Global.CLK32[29] + Global.CLK32[30] + Global.CLK32[31]; + + previousAreLt4' === (Global.CLK32[3] + Global.CLK32[19]) * cOut + previousAreLt4 * (LT4_PROPAGATE + (Global.CLK32[7] + Global.CLK32[11] + Global.CLK32[23] + Global.CLK32[27]) * cOut); + + lCout' === cOut + usePreviousAreLt4 * (previousAreLt4 - cOut); + lOpcode' === opcode; + + // P_FLAGS = cOut + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 + // In even byte clocks, useCarry = usePreviousAreLt4 = 0 and cOut = cMiddle, therefore P_FLAGS = cMiddle + 8 * reset4 + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[0], freeInB[0], carry[0], freeInC[0], carry[1] + 8 * reset4]); + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[1], freeInB[1], carry[1], freeInC[1], carry[2] + 8 * reset4]); + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[2], freeInB[2], carry[2], freeInC[2], carry[3] + 8 * reset4]); + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[result', opcode, freeInA[3], freeInB[3], carry[3], freeInC[3], carry[4] + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4]); + + useCarry * usePreviousAreLt4 === 0; + + a === freeInA[0] + 2**8 * freeInA[1] + 2**16 * freeInA[2] + 2**24 * freeInA[3]; + b === freeInB[0] + 2**8 * freeInB[1] + 2**16 * freeInB[2] + 2**24 * freeInB[3]; + + // TODO: verify on each 8 clocks + c === useCarry * cOut + usePreviousAreLt4 * previousAreLt + (1 - useCarry - usePreviousAreLt4) * (freeInC[0] + 2**8 * freeInC[1] + 2**16 * freeInC[2] + 2**24 * freeInC[3]); + + // In the last byte, when useCarry or usePreviousAreLt4 are 1, the value of c[0] needs to change + // to result (0 or 1). In the first clock, freeInC must be changed to match with the lookup + // because lookup is a static table (has a 0 for comparators), but useCarry or + // usePreviousAreLt4 are dynamic. Otherwise, useCarry and usePreviousAreLt4 are enabled only in the last byte + // (verified lookup only enabled when P_LAST = 1). + + // In the last byte, only FACTOR[7] is active, and freeInC only affects to c[7]'. + + pol c7Temp = c[7] * (1 - RESET) + freeInC[0] * FACTOR[7] + 256 * freeInC[1] * FACTOR[7]; + c[7]' = (1 - useCarry - usePreviousAreLt4) * c7Temp; diff --git a/test/pil2/zkevm-etrog/binary_ops_table.pil b/test/pil2/zkevm-etrog/binary_ops_table.pil new file mode 100644 index 0000000..3ca8a04 --- /dev/null +++ b/test/pil2/zkevm-etrog/binary_ops_table.pil @@ -0,0 +1,85 @@ +// PIL Binary Operations Table used by Binary +// +// ADD (OP:0) +// SUB (OP:1) +// LT (OP:2) +// SLT (OP:3) +// EQ (OP:4) +// AND (OP:5) +// OR (OP:6) +// XOR (OP:7) +// LT4 (OP:8) + +const int BINARY_OPS_TABLE_ID = 1; + +subproof aggregate BinaryOpsTable(2**23) { + + constant OP_C = 256*256*4; // 2 CarryIn + 2 LastByte = 4 (OC = OPERATION CYCLE) + constant LAST_C = 256*256*2; // 2 CarryIn + + col fixed P_A = [0..255]...; // Input A (8 bits) + col fixed P_B = [0:256..255:256]...; // Input B (8 bits) + col fixed P_OP = [0:OP_C..7:OP_C]...; // Operation (3 bits) + col fixed P_CIN = [0:256*256,1:256*256]...; // CarryIn (1 bits) + col fixed P_LAST = [0:LAST_C, 1:LAST_C]...; // Last byte (1 bits) + col fixed P_USE_CARRY = [ 0:OP_C*2, // Carry => C (1 bits) - ADD,SUB + [0:LAST_C, 1:LAST_C]:3, // - LT,SLT,AND + 0:OP_C*2 ]...; // - OR,NOP + col fixed P_C; // Output C (8 bits) + col fixed P_COUT; // CarryOut (1 bits) + + // TODO pol RESET = Global.CLK32[0] + Global.CLK32[16]; + // col fixed RESET = [1,0:15]...; + col fixed FACTOR = [1, 2**16, 0:14]; + col fixed P_FLAGS; + col fixed FACTOR[8]; + + // P_FLAGS = cOut + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 + // In even byte clocks, useCarry = usePreviousAreLt4 = 0 and cOut = cMiddle, therefore P_FLAGS = cMiddle + 8 * reset4 + lockup_proves(BINARY_OPS_TABLE_ID, 1,[P_LAST, P_OPCODE, Global.BYTE_2A, Global.BYTE, P_CIN, P_C, P_FLAGS]); + + for (int i = 0; i < OP_C; ++i) { + fe [a, b, cin, plast, c, cout, op] = [P_A[i], P_B[i], P_CIN[i], P_LAST[i], 0, 0, P_OPCODE[i]]; + + switch (op) { + case 0: // ADD + c = (cin + a + b) & 0xFF; + cout = (cin + a + b) >> 8; + + case 1: // SUB + cout = ((a - cin) >= b ? 0 : 1); + c = 256 * cout + a - cin - b; + + case 2,3: // LT,SLT + if (a < b) { + cout = 1; + c = plast; + } else if (a == b) { + cout = cin; + c = plast * cin; + } + if (op == 3 && plast && (a & 0x80) != (b & 0x80)) { + c = (a & 0x80); + cout = c; + } + + case 4: // EQ + if (a == b && !cin) c = plast; + else cout = 1; + cout = plast ? !cout : cout; + + case 5: // AND + c = a & b; + cout = cin || c; + + case 6: // OR + c = a | b; + + case 7: // XOR + c = a ^ b; + + } + P_C[i] = c; + P_COUT[i] = c; + } + diff --git a/test/pil2/zkevm-etrog/bits2field.pil b/test/pil2/zkevm-etrog/bits2field.pil new file mode 100644 index 0000000..cba76c0 --- /dev/null +++ b/test/pil2/zkevm-etrog/bits2field.pil @@ -0,0 +1,13 @@ +include "keccakf.pil"; + +namespace Bits2Field(%N); + pol constant FieldLatch; // [0:44,1] + pol constant Factor; // 1,2,4,8,...,2**43 + + pol commit bit; + pol commit field44; + + field44' = (1-FieldLatch)*field44 + bit*Factor; + bit *(1-bit) = 0; + + FieldLatch*(field44 - KeccakF.a44) = 0; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/bits2field_sha256.pil b/test/pil2/zkevm-etrog/bits2field_sha256.pil new file mode 100644 index 0000000..1d39599 --- /dev/null +++ b/test/pil2/zkevm-etrog/bits2field_sha256.pil @@ -0,0 +1,13 @@ +include "sha256f.pil"; + +namespace Bits2FieldSha256(%N); + pol constant FieldLatch; // [0:6,1] + pol constant Factor; // 1,2,4,8,...,2**10 + + pol commit bit; + pol commit packField; + + packField' = (1-FieldLatch)*packField + bit'*Factor'; + bit *(1-bit) = 0; + + FieldLatch*(packField - Sha256F.input[0]) = 0; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/climb_key.pil b/test/pil2/zkevm-etrog/climb_key.pil new file mode 100644 index 0000000..e3c55ec --- /dev/null +++ b/test/pil2/zkevm-etrog/climb_key.pil @@ -0,0 +1,98 @@ + +subproof ClimbKey(2**16, 2**20); + +// ClimbKey +// +// Description: +// ============ +// SM to correctly navigate (climb up) the given merkle tree path. Here, by correct, we mean verifying that not overflow occurs. +// The overflowing is detected by not including ALL possible combinations of values that produce an overflow in the lookup. +// +// keyx = 4 goldilocks values holding the key. It must be satisfied that keyx' = keyx·2 + bit (which should be checked to not overflow). +// Clearly, the key [key0 || key1 || key2 || key3] is at most [0xffffffff00000000 || 0xffffffff00000000 || 0xffffffff00000000 || 0xffffffff00000000] +// bit = Bit to add to climb up the path +// level = A value of 8 bits to indicate the level of the tree (depth) +// keyInChunk = Value of the current chunk (maximum 18 bits) used to verify by the lookup and in the rebuild of the key. +// keySelx = Binary value that is distinct from zero only if in CLK3 and keyx is the key chunk to "increase" based on the level. +// It is validated by the lookup in CLK3. +// keyIn = Accumulator of the values of keyInChunk. It is used to rebuild the key and check for consistency with the expected one. +// ============ +// Example: +// key0 key1 key2 key3 bit keyInChunk FACTOR keyIn keySel0 keySel1 keySel2 keySel3 result level +// CLK0 A0 A1 A2 A3 z A2[0..17] 1 A2[0..17] 0 0 0 0 0 X +// CLK1 A0 A1 A2 A3 z A2[18..35] 2**18 A2[0..35] 0 0 0 0 0 X +// ==> CLK2 {A0 A1 A2 A3} z A2[36..53] 2**36 A2[0..53] 0 0 0 0 1 X <=== key = keyIn +// CLK3 {A0 A1 2*A2+z A3} z A2[54..63] 2**54 A2[0..63] 0 0 1 0 0 22 <=== key = keyOut = keyIn' +// +// CLK0 B0 B1 B2 B3 y B1[0..17] 1 B1[0..17] 0 0 0 0 0 X +// CLK1 B0 B1 B2 B3 y B1[18..35] 2**18 B1[0..35] 0 0 0 0 0 X +// ==> CLK2 {B0 B1 B2 B3} y B1[36..53] 2**36 B1[0..53] 0 0 0 0 {1} X <=== key = keyIn +// CLK3 {B0 2*B1+y B2 B3} y B1[54..63] 2**54 B1[0..63] 0 1 0 0 0 {37} <=== key = keyOut = keyIn' +// +// "{·}" is used to indicate the columns used in the lookup for the storage +// "==>" is used to indicate the result clock + +// key = keyIn on CLK0,CLK1,CLK2 +// key = keyOut = keyIn' on CLK3 +col witness key[4]; + +// Domain verification of level,keyIn,keyInChunk is ensured in the lookup +col witness level; +col witness keyInChunk; + +// Result is used to relate the storage SM with this SM via permutation +col witness result; + +// Binary checks of the following pols are necessary because they are introduced in the lookup as a composition +col witness keySel[4]; + +col witness carryLt; + +const expr CLK0 = Global.CLK32[0] + Global.CLK32[4] + Global.CLK32[8] + Global.CLK32[12] + Global.CLK32[16] + Global.CLK32[20] + Global.CLK32[24] + Global.CLK32[28]; +const expr CLK1 = Global.CLK32[1] + Global.CLK32[5] + Global.CLK32[9] + Global.CLK32[13] + Global.CLK32[17] + Global.CLK32[21] + Global.CLK32[25] + Global.CLK32[29]; +const expr CLK2 = Global.CLK32[2] + Global.CLK32[6] + Global.CLK32[10] + Global.CLK32[14] + Global.CLK32[18] + Global.CLK32[22] + Global.CLK32[26] + Global.CLK32[30]; +const expr CLK3 = Global.CLK32[3] + Global.CLK32[7] + Global.CLK32[11] + Global.CLK32[15] + Global.CLK32[19] + Global.CLK32[23] + Global.CLK32[27] + Global.CLK32[31]; + +// these constraints applies on CLK0, CLK1, CLK2, but for selected key on +// CLK2 don't apply, because CLK2 - keySelx' = 1 - keySelx + +// keyx must remain constant on the transitions CLK0 -> CLK1 -> CLK2 -> CLK except +// for the selected key chunk, which varies on the transition CLK2 -> CLK3. +// On CLK2 we have that CLK2 - keySelx' = 0 for the selected key chunk, and CLK2 - keySelx' = 1 for the rest of keys. +// Note: We use the fact that if keySelx = 1 on CLK3 then keySelx' = 1 on CLK2. +(CLK0 + CLK1 + CLK2 - keySel[0]') * (key[0]' - key[0]) === 0; +(CLK0 + CLK1 + CLK2 - keySel[1]') * (key[1]' - key[1]) === 0; +(CLK0 + CLK1 + CLK2 - keySel[2]') * (key[2]' - key[2]) === 0; +(CLK0 + CLK1 + CLK2 - keySel[3]') * (key[3]' - key[3]) === 0; + +// The next two constraints only apply on CLK2 if keySelx' is selected. + +// 1] Key rebuild. Update keyx for the only key chunk x that changes --> keyx[CLK3] = 2 * keyx[CLK0 ∨ CLK1 ∨ CLK2] + bit (carryLt on CLK0) +keySel[0]' * (key[0]' - 2 * key[0] - 2'carryLt) + +keySel[1]' * (key[1]' - 2 * key[1] - 2'carryLt) + +keySel[2]' * (key[2]' - 2 * key[2] - 2'carrtLt) + +keySel[3]' * (key[3]' - 2 * key[3] - 2'carrtLt) === 0; + +// 2] Key consistency. keyIn is equal to the selected key chunk before the update --> keyIn[CLK3] = keyx[CLK2] +// Further: if this constraint holds true, then it also means that keyInChunks are valid and keyx was rebuilt correctly. +CLK2 * (2'keyInChunk + 2**18 * 'keyInChunk + 2**36 * keyInChunk + 2**54 * keyInChunk') - keySel0' * key0 - keySel1' * key1 - keySel2' * key2 - keySel3' * key3 === 0; + +// Binary checks +bit * (1 - bit) = 0; +keySel[0] * (1 - keySel[0]) = 0; +keySel[1] * (1 - keySel[1]) = 0; +keySel[2] * (1 - keySel[2]) = 0; +keySel[3] * (1 - keySel[3]) = 0; +result * (1 - result) = 0; + +// Result is equal to 1 at CLK2 and 0 in the rest +result * (1 - CLK2) = 0; + +// CLK0 (2 bits) + keyChunk = keyIn[ 0..17] 18 bits + carryLt (2 bits) = 22 bits (only one value of level) +// CLK1 (2 bits) + keyChunk = keyIn[18..35] 18 bits + carryLt (2 bits) = 22 bits (only one value of level) +// CLK2 (2 bits) + keyChunk = keyIn[36..53] 18 bits + carryLt (2 bits) = 22 bits (only one value of level) +// CLK3 (2 bits) + keyChunk = keyIn[54..63] 10 bits + carryLt (2 bits) + level (8 bits) = 22 bits +// Note: keySelx is zero on CLK0,CLK1,CLK2 +const expr clkeySel = CLK1 + 2 * CLK2 + 3 * CLK3 + 2**2 * keySel[0] + 2**3 * keySel[1] + 2**4 * keySel[2] + 2**5 * keySel[3]; + +lockup_assumes(CLIMB_KEY_TABLE_ID, 1, [clkeySel, level * CLK3, keyInChunk, carryLt, (1 - CLK3) * carryLt' } in { T_CLKEYSEL, T_LEVEL, T_CHUNK_VALUE, T_CARRYLT_IN, T_CARRYLT_OUT]); \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/climb_key_table.pil b/test/pil2/zkevm-etrog/climb_key_table.pil new file mode 100644 index 0000000..7094304 --- /dev/null +++ b/test/pil2/zkevm-etrog/climb_key_table.pil @@ -0,0 +1,12 @@ + +const int CLIMB_KEY_TABLE_ID = 10; + +subproof ClimbKeyTable(2**22) { + +col fixed T_CLKEYSEL, T_LEVEL, T_CHUNK_VALUE, T_CARRYLT_IN, T_CARRYLT_OUT; + +// TODO: build constants !!! + +lockup_proves(CLIMB_KEY_TABLE_ID, 1, [T_CLKEYSEL, T_LEVEL, T_CHUNK_VALUE, T_CARRYLT_IN, T_CARRYLT_OUT]); + +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/config.pil b/test/pil2/zkevm-etrog/config.pil new file mode 100644 index 0000000..1a40364 --- /dev/null +++ b/test/pil2/zkevm-etrog/config.pil @@ -0,0 +1 @@ +constant %N = 2**23; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/global.pil b/test/pil2/zkevm-etrog/global.pil new file mode 100644 index 0000000..e2cff71 --- /dev/null +++ b/test/pil2/zkevm-etrog/global.pil @@ -0,0 +1,23 @@ +namespace Global(%N); + constant %GL_H = 0xFFFFFFFF; + constant %GL_L = 0x00000001; + + pol constant L1; // 1, 0, 0, 0, 0, + pol constant LLAST; // 0,0,0,0,0, ...., 0, 1 + pol constant BYTE; + pol constant BYTE_2A; + pol constant BYTE2; + pol constant CLK32[32]; // [0] = 1, 0:31 (cyclic) + // [1] = 0, 1, 0:30 (cyclic) + // [7] = 0:31, 1 (cyclic) + + pol constant BYTE_FACTOR[8]; // [0] = 1,256,256**2,256**3, 0:28 (cyclic) + // [1] = 0:4, 1,256,256**2,256**3, 0:24 (cyclic) + // [7] = 0:28, 1,256,256**2,256**3 (cyclic) + + /////// Constant Polynomials + pol constant STEP; // 0, 1, 2, 3, ...... N-1 + + // STEP32 = 0,1,2,...,30,31,0,1,2,... + pol constant STEP32; // [0..32] + diff --git a/test/pil2/zkevm-etrog/keccakf.pil b/test/pil2/zkevm-etrog/keccakf.pil new file mode 100644 index 0000000..5ffeb62 --- /dev/null +++ b/test/pil2/zkevm-etrog/keccakf.pil @@ -0,0 +1,21 @@ +include "global.pil"; + + +namespace KeccakF(%N); + + pol constant ConnA, ConnB, ConnC, GateType, kGateType, kA, kB, kC; + pol commit a[4], b[4], c[4]; + + pol a44 = a[3] * 2**33 + a[2] * 2**22 + a[1] * 2**11 + a[0]; + pol b44 = b[3] * 2**33 + b[2] * 2**22 + b[1] * 2**11 + b[0]; + pol c44 = c[3] * 2**33 + c[2] * 2**22 + c[1] * 2**11 + c[0]; + + {a44, b44, c44} connect {ConnA, ConnB, ConnC}; + + { GateType, a[0], b[0], c[0] } in { kGateType, kA, kB, kC } ; + { GateType, a[1], b[1], c[1] } in { kGateType, kA, kB, kC } ; + { GateType, a[2], b[2], c[2] } in { kGateType, kA, kB, kC } ; + { GateType, a[3], b[3], c[3] } in { kGateType, kA, kB, kC } ; + + Global.L1 * a44 = 0; + Global.L1 * (2**44-1-b44) = 0; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/main.pil b/test/pil2/zkevm-etrog/main.pil new file mode 100644 index 0000000..f06fa4a --- /dev/null +++ b/test/pil2/zkevm-etrog/main.pil @@ -0,0 +1,1005 @@ +include "config.pil"; +include "global.pil"; +include "rom.pil"; +include "mem_align.pil"; +include "arith.pil"; +include "binary.pil"; +include "poseidong.pil"; +include "padding_pg.pil"; +include "storage.pil"; +include "padding_kk.pil"; +include "mem.pil"; +include "padding_sha256.pil"; + +namespace Main(%N); + +/////////// +// Definitions +/////////// + + /////// State Polynomials + pol commit A7, A6, A5, A4, A3, A2, A1; + pol commit A0; + + pol commit B7, B6, B5, B4, B3, B2, B1; + pol commit B0; + + pol commit C7, C6, C5, C4, C3, C2, C1; + pol commit C0; + + pol commit D7, D6, D5, D4, D3, D2, D1; + pol commit D0; + + pol commit E7, E6, E5, E4, E3, E2, E1; + pol commit E0; + + pol commit SR7, SR6, SR5, SR4, SR3, SR2, SR1, SR0; // State Root + pol commit CTX; // Call Cntext + pol commit SP; // Stack Pointer + pol commit PC; // EVM Program counter + pol commit GAS; + pol commit zkPC; // Program Counter of current micro instruction + pol commit RR; // Micro code return address (subroutines) + pol commit HASHPOS; + pol commit RCX; + + /////// Instruction related polynomials + pol commit CONST7, CONST6, CONST5, CONST4, CONST3, CONST2, CONST1, CONST0; + pol commit FREE7, FREE6, FREE5, FREE4, FREE3, FREE2, FREE1, FREE0; + pol commit inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, inCTX, inSP, inPC, inGAS, inSTEP, inRR, inHASHPOS, inRCX; + pol commit setA, setB, setC, setD, setE, setSR, setCTX, setSP, setPC, setGAS, setRR, setHASHPOS, setRCX; + pol commit JMP, JMPN, JMPC, JMPZ, offset; + pol commit incStack; + pol commit isStack; + pol commit isMem; + pol commit ind, indRR; + pol commit useCTX; + pol commit carry; + + // operations + pol commit mOp, mWR; + pol commit sWR, sRD; + pol commit arithEq0, arithEq1, arithEq2, arithEq3, arithEq4, arithEq5; + pol commit memAlignRD, memAlignWR, memAlignWR8; + pol commit hashK, hashK1, hashKLen, hashKDigest; + pol commit hashP, hashP1, hashPLen, hashPDigest; + pol commit hashS, hashS1, hashSLen, hashSDigest; + pol commit bin; + pol commit binOpcode; + pol commit assert; + pol commit repeat, call, return; + + /////// Intermediary commit polynomials + pol commit isNeg; + + /// Counters + pol commit cntArith, cntBinary, cntMemAlign, cntKeccakF, cntSha256F, cntPoseidonG, cntPaddingPG; + pol commit inCntArith, inCntBinary, inCntMemAlign, inCntKeccakF, inCntSha256F, inCntPoseidonG, inCntPaddingPG; + pol commit incCounter; + +/////////// +// Intermediary calculations and checks +/////////// + + + /////// op + pol op0 = + A0 * inA + + B0 * inB + + C0 * inC + + C7 * inROTL_C + + D0 * inD + + E0 * inE + + FREE0 * (inFREE + inFREE0) + + SR0 * inSR + + CTX * inCTX + + SP * inSP + + PC * inPC + + GAS * inGAS + + Global.STEP * inSTEP + + RR * inRR + + HASHPOS * inHASHPOS + + cntArith * inCntArith + + cntBinary * inCntBinary + + cntMemAlign * inCntMemAlign + + cntKeccakF * inCntKeccakF + + cntSha256F * inCntSha256F + + cntPoseidonG * inCntPoseidonG + + cntPaddingPG * inCntPaddingPG + + RCX * inRCX + + CONST0; + + pol op1 = + A1 * inA + + B1 * inB + + C1 * inC + + C0 * inROTL_C + + D1 * inD + + E1 * inE + + SR1 * inSR + + FREE1 * inFREE + + CONST1; + + pol op2 = + A2 * inA + + B2 * inB + + C2 * inC + + C1 * inROTL_C + + D2 * inD + + E2 * inE + + SR2 * inSR + + FREE2 * inFREE + + CONST2; + + pol op3 = + A3 * inA + + B3 * inB + + C3 * inC + + C2 * inROTL_C + + D3 * inD + + E3 * inE + + SR3 * inSR + + FREE3 * inFREE + + CONST3; + + pol op4 = + A4 * inA + + B4 * inB + + C4 * inC + + C3 * inROTL_C + + D4 * inD + + E4 * inE + + SR4 * inSR + + FREE4 * inFREE + + CONST4; + + pol op5 = + A5 * inA + + B5 * inB + + C5 * inC + + C4 * inROTL_C + + D5 * inD + + E5 * inE + + SR5 * inSR + + FREE5 * inFREE + + CONST5; + + pol op6 = + A6 * inA + + B6 * inB + + C6 * inC + + C5 * inROTL_C + + D6 * inD + + E6 * inE + + SR6 * inSR + + FREE6 * inFREE + + CONST6; + + pol op7 = + A7 * inA + + B7 * inB + + C7 * inC + + C6 * inROTL_C + + D7 * inD + + E7 * inE + + SR7 * inSR + + FREE7 * inFREE + + CONST7; + + /////// addr + + /* + + ctxBase = CTX * 0x040000 ctxSize = 256K addresses * 32 bytes (256 bits) = 8MiB + + Memory Region Size isMem isStack Content + ctxBase + [0x000000 - 0x00FFFF] 2MiB 0 0 Context specific variables + ctxBase + [0x010000 - 0x000000] 2MiB 0 1 EVM Stack + ctxBase + [0x020000 - 0x03FFFF] 4MiB 1 0 EVM Memory + + */ + + pol addrRel = ind*E0 + indRR*RR + offset; + pol addr = useCTX*CTX*2**18 + isStack*2**16 + isStack*SP + isMem*2**17+ addrRel; + + /////// isNeg + + pol commit lJmpnCondValue; + pol jmpnCondValue = JMPN*(isNeg*2**32 + op0); + isNeg * (1 - isNeg) = 0; + + lJmpnCondValue in Global.STEP; + + pol commit hJmpnCondValueBit[9]; + + hJmpnCondValueBit[8] * (1-hJmpnCondValueBit[8]) = 0; + hJmpnCondValueBit[7] * (1-hJmpnCondValueBit[7]) = 0; + hJmpnCondValueBit[6] * (1-hJmpnCondValueBit[6]) = 0; + hJmpnCondValueBit[5] * (1-hJmpnCondValueBit[5]) = 0; + hJmpnCondValueBit[4] * (1-hJmpnCondValueBit[4]) = 0; + hJmpnCondValueBit[3] * (1-hJmpnCondValueBit[3]) = 0; + hJmpnCondValueBit[2] * (1-hJmpnCondValueBit[2]) = 0; + hJmpnCondValueBit[1] * (1-hJmpnCondValueBit[1]) = 0; + hJmpnCondValueBit[0] * (1-hJmpnCondValueBit[0]) = 0; + + jmpnCondValue = 2**31*hJmpnCondValueBit[8] + 2**30*hJmpnCondValueBit[7] + 2**29*hJmpnCondValueBit[6] + 2**28*hJmpnCondValueBit[5] + + 2**27*hJmpnCondValueBit[4] + 2**26*hJmpnCondValueBit[3] + 2**25*hJmpnCondValueBit[2] + 2**24*hJmpnCondValueBit[1] + + 2**23*hJmpnCondValueBit[0] + lJmpnCondValue; + + + /// RCX check zero + pol commit RCXInv; + pol RCXIsZero = 1 - RCX*RCXInv; + RCXIsZero*RCX = 0; + + /// op0 check zero + pol commit op0Inv; + pol op0IsZero = 1 - op0*op0Inv; + op0IsZero*op0 = 0; + +/////////// +// Calculate New State +/////////// + + A0' = setA * (op0 - A0) + A0; + A1' = setA * (op1 - A1) + A1; + A2' = setA * (op2 - A2) + A2; + A3' = setA * (op3 - A3) + A3; + A4' = setA * (op4 - A4) + A4; + A5' = setA * (op5 - A5) + A5; + A6' = setA * (op6 - A6) + A6; + A7' = setA * (op7 - A7) + A7; + + B0' = setB * (op0 - B0) + B0; + B1' = setB * (op1 - B1) + B1; + B2' = setB * (op2 - B2) + B2; + B3' = setB * (op3 - B3) + B3; + B4' = setB * (op4 - B4) + B4; + B5' = setB * (op5 - B5) + B5; + B6' = setB * (op6 - B6) + B6; + B7' = setB * (op7 - B7) + B7; + + C0' = setC * (op0 - C0) + C0; + C1' = setC * (op1 - C1) + C1; + C2' = setC * (op2 - C2) + C2; + C3' = setC * (op3 - C3) + C3; + C4' = setC * (op4 - C4) + C4; + C5' = setC * (op5 - C5) + C5; + C6' = setC * (op6 - C6) + C6; + C7' = setC * (op7 - C7) + C7; + + D0' = setD * (op0 - D0) + D0; + D1' = setD * (op1 - D1) + D1; + D2' = setD * (op2 - D2) + D2; + D3' = setD * (op3 - D3) + D3; + D4' = setD * (op4 - D4) + D4; + D5' = setD * (op5 - D5) + D5; + D6' = setD * (op6 - D6) + D6; + D7' = setD * (op7 - D7) + D7; + + E0' = setE * (op0 - E0) + E0; + E1' = setE * (op1 - E1) + E1; + E2' = setE * (op2 - E2) + E2; + E3' = setE * (op3 - E3) + E3; + E4' = setE * (op4 - E4) + E4; + E5' = setE * (op5 - E5) + E5; + E6' = setE * (op6 - E6) + E6; + E7' = setE * (op7 - E7) + E7; + + SR0' = setSR * (op0 - SR0) + SR0; + SR1' = setSR * (op1 - SR1) + SR1; + SR2' = setSR * (op2 - SR2) + SR2; + SR3' = setSR * (op3 - SR3) + SR3; + SR4' = setSR * (op4 - SR4) + SR4; + SR5' = setSR * (op5 - SR5) + SR5; + SR6' = setSR * (op6 - SR6) + SR6; + SR7' = setSR * (op7 - SR7) + SR7; + + CTX' = setCTX * (op0 - CTX) + CTX; + SP' = setSP * (op0 - (SP +incStack)) + (SP +incStack); + PC' = setPC * (op0 - PC) + PC; + + // ROM constraint: call * setRR = 0 + RR' = setRR * (op0 - RR) + call * (zkPC + 1 - RR) + RR; + GAS' = setGAS * (op0 - GAS) + GAS; + + pol decRCX = repeat * (1-RCXIsZero); + RCX' = setRCX * (op0 - (RCX-decRCX)) + (RCX-decRCX); + + HASHPOS' = setHASHPOS * (op0 - HASHPOS) + HASHPOS + (hashK + hashP + hashS)*D0 + hashK1 + hashP1 + hashS1; + + pol doJMP = JMPN*isNeg + JMP + JMPC*carry + JMPZ*op0IsZero + return + call; + pol elseJMP = JMPN*(1-isNeg) + JMPC*(1-carry) + JMPZ*(1-op0IsZero); + + pol commit jmpAddr; + pol commit elseAddr; + pol commit useJmpAddr; + pol commit useElseAddr; + + // ROM/Zkasm constraint: useJmpAddr * return = 0 + pol finalJmpAddr = useJmpAddr * (jmpAddr - addr ) + return * (RR - addr) + addr; + pol nextNoJmpZkPC = zkPC + 1 - ((1-RCXIsZero)*repeat); + pol finalElseAddr = useElseAddr * (elseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; + + // if elseAddr wasn't specified on zkasm, compiler put current address + 1 + zkPC' = doJMP * (finalJmpAddr - nextNoJmpZkPC) + elseJMP * (finalElseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; + + zkPC * Global.L1 = 0; + + (A0-op0)*assert = 0; + (A1-op1)*assert = 0; + (A2-op2)*assert = 0; + (A3-op3)*assert = 0; + (A4-op4)*assert = 0; + (A5-op5)*assert = 0; + (A6-op6)*assert = 0; + (A7-op7)*assert = 0; + + public oldStateRoot0 = B0(0); + public oldStateRoot1 = B1(0); + public oldStateRoot2 = B2(0); + public oldStateRoot3 = B3(0); + public oldStateRoot4 = B4(0); + public oldStateRoot5 = B5(0); + public oldStateRoot6 = B6(0); + public oldStateRoot7 = B7(0); + Global.L1 * (B0 - :oldStateRoot0) = 0; + Global.L1 * (B1 - :oldStateRoot1) = 0; + Global.L1 * (B2 - :oldStateRoot2) = 0; + Global.L1 * (B3 - :oldStateRoot3) = 0; + Global.L1 * (B4 - :oldStateRoot4) = 0; + Global.L1 * (B5 - :oldStateRoot5) = 0; + Global.L1 * (B6 - :oldStateRoot6) = 0; + Global.L1 * (B7 - :oldStateRoot7) = 0; + + public oldAccInputHash0 = C0(0); + public oldAccInputHash1 = C1(0); + public oldAccInputHash2 = C2(0); + public oldAccInputHash3 = C3(0); + public oldAccInputHash4 = C4(0); + public oldAccInputHash5 = C5(0); + public oldAccInputHash6 = C6(0); + public oldAccInputHash7 = C7(0); + Global.L1 * (C0 - :oldAccInputHash0) = 0; + Global.L1 * (C1 - :oldAccInputHash1) = 0; + Global.L1 * (C2 - :oldAccInputHash2) = 0; + Global.L1 * (C3 - :oldAccInputHash3) = 0; + Global.L1 * (C4 - :oldAccInputHash4) = 0; + Global.L1 * (C5 - :oldAccInputHash5) = 0; + Global.L1 * (C6 - :oldAccInputHash6) = 0; + Global.L1 * (C7 - :oldAccInputHash7) = 0; + + public oldBatchNum = SP(0); + Global.L1 * (SP - :oldBatchNum) = 0; + + public chainId = GAS(0); + Global.L1 * (GAS - :chainId) = 0; + + public forkId = CTX(0); + Global.L1 * (CTX - :forkId) = 0; + + public newStateRoot0 = SR0(%N-1); + public newStateRoot1 = SR1(%N-1); + public newStateRoot2 = SR2(%N-1); + public newStateRoot3 = SR3(%N-1); + public newStateRoot4 = SR4(%N-1); + public newStateRoot5 = SR5(%N-1); + public newStateRoot6 = SR6(%N-1); + public newStateRoot7 = SR7(%N-1); + Global.LLAST * (SR0 - :newStateRoot0) = 0; + Global.LLAST * (SR1 - :newStateRoot1) = 0; + Global.LLAST * (SR2 - :newStateRoot2) = 0; + Global.LLAST * (SR3 - :newStateRoot3) = 0; + Global.LLAST * (SR4 - :newStateRoot4) = 0; + Global.LLAST * (SR5 - :newStateRoot5) = 0; + Global.LLAST * (SR6 - :newStateRoot6) = 0; + Global.LLAST * (SR7 - :newStateRoot7) = 0; + + public newAccInputHash0 = D0(%N -1); + public newAccInputHash1 = D1(%N -1); + public newAccInputHash2 = D2(%N -1); + public newAccInputHash3 = D3(%N -1); + public newAccInputHash4 = D4(%N -1); + public newAccInputHash5 = D5(%N -1); + public newAccInputHash6 = D6(%N -1); + public newAccInputHash7 = D7(%N -1); + Global.LLAST * (D0 - :newAccInputHash0) = 0; + Global.LLAST * (D1 - :newAccInputHash1) = 0; + Global.LLAST * (D2 - :newAccInputHash2) = 0; + Global.LLAST * (D3 - :newAccInputHash3) = 0; + Global.LLAST * (D4 - :newAccInputHash4) = 0; + Global.LLAST * (D5 - :newAccInputHash5) = 0; + Global.LLAST * (D6 - :newAccInputHash6) = 0; + Global.LLAST * (D7 - :newAccInputHash7) = 0; + + public localExitRoot0 = E0(%N-1); + public localExitRoot1 = E1(%N-1); + public localExitRoot2 = E2(%N-1); + public localExitRoot3 = E3(%N-1); + public localExitRoot4 = E4(%N-1); + public localExitRoot5 = E5(%N-1); + public localExitRoot6 = E6(%N-1); + public localExitRoot7 = E7(%N-1); + Global.LLAST * (E0 - :localExitRoot0) = 0; + Global.LLAST * (E1 - :localExitRoot1) = 0; + Global.LLAST * (E2 - :localExitRoot2) = 0; + Global.LLAST * (E3 - :localExitRoot3) = 0; + Global.LLAST * (E4 - :localExitRoot4) = 0; + Global.LLAST * (E5 - :localExitRoot5) = 0; + Global.LLAST * (E6 - :localExitRoot6) = 0; + Global.LLAST * (E7 - :localExitRoot7) = 0; + + public newBatchNum = PC(%N-1); + Global.LLAST * (PC - :newBatchNum) = 0; + + + + // Check that the calculated hash is well formed + sWR + hashPDigest { + op0, op1, op2, op3, op4, op5, op6, op7, + %GL_L, %GL_H, %GL_L, %GL_H, %GL_L, %GL_H, %GL_L, %GL_H, + 8, 1 + } is + Binary.resultValidRange { + Binary.a[0], Binary.a[1], Binary.a[2], Binary.a[3], Binary.a[4], Binary.a[5], Binary.a[6], Binary.a[7], + Binary.b[0], Binary.b[1], Binary.b[2], Binary.b[3], Binary.b[4], Binary.b[5], Binary.b[6], Binary.b[7], + Binary.lOpcode, Binary.lCout + }; + +///////// +// ROM Plookpups +///////// + + /* + code generated with: + node tools/pil_pol_table/bits_compose.js "arithEq0,arithEq1,arithEq2,assert,bin,hashK,hashKDigest,hashKLen,hashP,hashPDigest,hashPLen,ind,indRR,isMem,isStack,JMP,JMPC,JMPN,memAlignRD,memAlignWR,memAlignWR8,mOp,mWR,repeat,setA,setB,setC,setCTX,setD,setE,setGAS,setHASHPOS,setPC,setRCX,setRR,setSP,setSR,sRD,sWR,useCTX,useJmpAddr,JMPZ,call,return,hashK1,hashP1,useElseAddr,arithEq3,arithEq4,arithEq5,hashS,hashSDigest,hashSLen,hashS1" -b + */ + + pol operations = + 2**0 * arithEq0 + 2**1 * arithEq1 + 2**2 * arithEq2 + 2**3 * assert + + 2**4 * bin + 2**5 * hashK + 2**6 * hashKDigest + 2**7 * hashKLen + + 2**8 * hashP + 2**9 * hashPDigest + 2**10 * hashPLen + 2**11 * ind + + 2**12 * indRR + 2**13 * isMem + 2**14 * isStack + 2**15 * JMP + + 2**16 * JMPC + 2**17 * JMPN + 2**18 * memAlignRD + 2**19 * memAlignWR + + 2**20 * memAlignWR8 + 2**21 * mOp + 2**22 * mWR + 2**23 * repeat + + 2**24 * setA + 2**25 * setB + 2**26 * setC + 2**27 * setCTX + + 2**28 * setD + 2**29 * setE + 2**30 * setGAS + 2**31 * setHASHPOS + + 2**32 * setPC + 2**33 * setRCX + 2**34 * setRR + 2**35 * setSP + + 2**36 * setSR + 2**37 * sRD + 2**38 * sWR + 2**39 * useCTX + + 2**40 * useJmpAddr + 2**41 * JMPZ + 2**42 * call + 2**43 * return + + 2**44 * hashK1 + 2**45 * hashP1 + 2**46 * useElseAddr + 2**47 * arithEq3 + + 2**48 * arithEq4 + 2**49 * arithEq5 + 2**50 * hashS + 2**51 * hashSDigest + + 2**52 * hashSLen + 2**53 * hashS1; + + (1 - arithEq0) * arithEq0 = 0; + (1 - arithEq1) * arithEq1 = 0; + (1 - arithEq2) * arithEq2 = 0; + (1 - assert) * assert = 0; + (1 - bin) * bin = 0; + (1 - hashK) * hashK = 0; + (1 - hashKDigest) * hashKDigest = 0; + (1 - hashKLen) * hashKLen = 0; + (1 - hashP) * hashP = 0; + (1 - hashPDigest) * hashPDigest = 0; + (1 - hashPLen) * hashPLen = 0; + (1 - ind) * ind = 0; + (1 - indRR) * indRR = 0; + (1 - isMem) * isMem = 0; + (1 - isStack) * isStack = 0; + (1 - JMP) * JMP = 0; + (1 - JMPC) * JMPC = 0; + (1 - JMPN) * JMPN = 0; + (1 - memAlignRD) * memAlignRD = 0; + (1 - memAlignWR) * memAlignWR = 0; + (1 - memAlignWR8) * memAlignWR8 = 0; + (1 - mOp) * mOp = 0; + (1 - mWR) * mWR = 0; + (1 - repeat) * repeat = 0; + (1 - setA) * setA = 0; + (1 - setB) * setB = 0; + (1 - setC) * setC = 0; + (1 - setCTX) * setCTX = 0; + (1 - setD) * setD = 0; + (1 - setE) * setE = 0; + (1 - setGAS) * setGAS = 0; + (1 - setHASHPOS) * setHASHPOS = 0; + (1 - setPC) * setPC = 0; + (1 - setRCX) * setRCX = 0; + (1 - setRR) * setRR = 0; + (1 - setSP) * setSP = 0; + (1 - setSR) * setSR = 0; + (1 - sRD) * sRD = 0; + (1 - sWR) * sWR = 0; + (1 - useCTX) * useCTX = 0; + (1 - useJmpAddr) * useJmpAddr = 0; + (1 - JMPZ) * JMPZ = 0; + (1 - call) * call = 0; + (1 - return) * return = 0; + (1 - hashK1) * hashK1 = 0; + (1 - hashP1) * hashP1 = 0; + (1 - useElseAddr) * useElseAddr = 0; + (1 - arithEq3) * arithEq3 = 0; + (1 - arithEq4) * arithEq4 = 0; + (1 - arithEq5) * arithEq5 = 0; + (1 - hashS) * hashS = 0; + (1 - hashSDigest) * hashSDigest = 0; + (1 - hashSLen) * hashSLen = 0; + (1 - hashS1) * hashS1 = 0; + + { + CONST0, CONST1, CONST2, CONST3, CONST4, CONST5, CONST6, CONST7, + inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, + inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR, inRCX, + inCntArith, inCntBinary, inCntKeccakF, inCntSha256F, inCntMemAlign, inCntPaddingPG, inCntPoseidonG, + operations, offset, incStack, binOpcode, jmpAddr, elseAddr, zkPC + } in { + Rom.CONST0, Rom.CONST1, Rom.CONST2, Rom.CONST3, Rom.CONST4, Rom.CONST5, Rom.CONST6, Rom.CONST7, + Rom.inA, Rom.inB, Rom.inC, Rom.inROTL_C, Rom.inD, Rom.inE, Rom.inSR, Rom.inFREE, Rom.inFREE0, + Rom.inCTX, Rom.inSP, Rom.inPC, Rom.inGAS, Rom.inHASHPOS, Rom.inSTEP, Rom.inRR, Rom.inRCX, + Rom.inCntArith, Rom.inCntBinary, Rom.inCntKeccakF, Rom.inCntSha256F, Rom.inCntMemAlign, Rom.inCntPaddingPG, Rom.inCntPoseidonG, + Rom.operations, Rom.offset, Rom.incStack, Rom.binOpcode, Rom.jmpAddr, Rom.elseAddr, Rom.line + }; + + pol commit sKeyI[4]; + pol commit sKey[4]; + +///////// +// Arithmetic Plookpups +///////// + + pol ax1_0 = Arith.x1[0] + Arith.x1[1]*2**16; + pol ax1_1 = Arith.x1[2] + Arith.x1[3]*2**16; + pol ax1_2 = Arith.x1[4] + Arith.x1[5]*2**16; + pol ax1_3 = Arith.x1[6] + Arith.x1[7]*2**16; + pol ax1_4 = Arith.x1[8] + Arith.x1[9]*2**16; + pol ax1_5 = Arith.x1[10] + Arith.x1[11]*2**16; + pol ax1_6 = Arith.x1[12] + Arith.x1[13]*2**16; + pol ax1_7 = Arith.x1[14] + Arith.x1[15]*2**16; + + pol ay1_0 = Arith.y1[0] + Arith.y1[1]*2**16; + pol ay1_1 = Arith.y1[2] + Arith.y1[3]*2**16; + pol ay1_2 = Arith.y1[4] + Arith.y1[5]*2**16; + pol ay1_3 = Arith.y1[6] + Arith.y1[7]*2**16; + pol ay1_4 = Arith.y1[8] + Arith.y1[9]*2**16; + pol ay1_5 = Arith.y1[10] + Arith.y1[11]*2**16; + pol ay1_6 = Arith.y1[12] + Arith.y1[13]*2**16; + pol ay1_7 = Arith.y1[14] + Arith.y1[15]*2**16; + + pol ax2_0 = Arith.x2[0] + Arith.x2[1]*2**16; + pol ax2_1 = Arith.x2[2] + Arith.x2[3]*2**16; + pol ax2_2 = Arith.x2[4] + Arith.x2[5]*2**16; + pol ax2_3 = Arith.x2[6] + Arith.x2[7]*2**16; + pol ax2_4 = Arith.x2[8] + Arith.x2[9]*2**16; + pol ax2_5 = Arith.x2[10] + Arith.x2[11]*2**16; + pol ax2_6 = Arith.x2[12] + Arith.x2[13]*2**16; + pol ax2_7 = Arith.x2[14] + Arith.x2[15]*2**16; + + pol ay2_0 = Arith.y2[0] + Arith.y2[1]*2**16; + pol ay2_1 = Arith.y2[2] + Arith.y2[3]*2**16; + pol ay2_2 = Arith.y2[4] + Arith.y2[5]*2**16; + pol ay2_3 = Arith.y2[6] + Arith.y2[7]*2**16; + pol ay2_4 = Arith.y2[8] + Arith.y2[9]*2**16; + pol ay2_5 = Arith.y2[10] + Arith.y2[11]*2**16; + pol ay2_6 = Arith.y2[12] + Arith.y2[13]*2**16; + pol ay2_7 = Arith.y2[14] + Arith.y2[15]*2**16; + + pol ax3_0 = Arith.x3[0] + Arith.x3[1]*2**16; + pol ax3_1 = Arith.x3[2] + Arith.x3[3]*2**16; + pol ax3_2 = Arith.x3[4] + Arith.x3[5]*2**16; + pol ax3_3 = Arith.x3[6] + Arith.x3[7]*2**16; + pol ax3_4 = Arith.x3[8] + Arith.x3[9]*2**16; + pol ax3_5 = Arith.x3[10] + Arith.x3[11]*2**16; + pol ax3_6 = Arith.x3[12] + Arith.x3[13]*2**16; + pol ax3_7 = Arith.x3[14] + Arith.x3[15]*2**16; + + pol ay3_0 = Arith.y3[0] + Arith.y3[1]*2**16; + pol ay3_1 = Arith.y3[2] + Arith.y3[3]*2**16; + pol ay3_2 = Arith.y3[4] + Arith.y3[5]*2**16; + pol ay3_3 = Arith.y3[6] + Arith.y3[7]*2**16; + pol ay3_4 = Arith.y3[8] + Arith.y3[9]*2**16; + pol ay3_5 = Arith.y3[10] + Arith.y3[11]*2**16; + pol ay3_6 = Arith.y3[12] + Arith.y3[13]*2**16; + pol ay3_7 = Arith.y3[14] + Arith.y3[15]*2**16; + + // We group arithmetic operations by the number of inputs they have + // 1] 5 inputs (A * B + C = D * 2^256 + E) + arithEq0 { 1, 0, 0, 0, 0, 0, 0, + A0, A1, A2, A3, A4, A5, A6, A7, + B0, B1, B2, B3, B4, B5, B6, B7, + C0, C1, C2, C3, C4, C5, C6, C7, + D0, D1, D2, D3, D4, D5, D6, D7, + op0, op1, op2, op3, op4, op5, op6, op7 } is + Arith.resultEq0 { + Arith.selEq[0], Arith.selEq[1], Arith.selEq[2], Arith.selEq[3], Arith.selEq[4], Arith.selEq[5], Arith.selEq[6], + ax1_0, ax1_1, ax1_2, ax1_3, ax1_4, ax1_5, ax1_6, ax1_7, + ay1_0, ay1_1, ay1_2, ay1_3, ay1_4, ay1_5, ay1_6, ay1_7, + ax2_0, ax2_1, ax2_2, ax2_3, ax2_4, ax2_5, ax2_6, ax2_7, + ay2_0, ay2_1, ay2_2, ay2_3, ay2_4, ay2_5, ay2_6, ay2_7, + ay3_0, ay3_1, ay3_2, ay3_3, ay3_4, ay3_5, ay3_6, ay3_7 + }; + + // 2] 6 inputs (Point addition, complex multiplication, complex addition, complex subtraction) + arithEq1 + arithEq3 + arithEq4 + arithEq5 { + 0, arithEq1, 0, arithEq1, arithEq3, arithEq4, arithEq5, + A0, A1, A2, A3, A4, A5, A6, A7, + B0, B1, B2, B3, B4, B5, B6, B7, + C0, C1, C2, C3, C4, C5, C6, C7, + D0, D1, D2, D3, D4, D5, D6, D7, + E0, E1, E2, E3, E4, E5, E6, E7, + op0, op1, op2, op3, op4, op5, op6, op7 } is + Arith.resultEq1 { + Arith.selEq[0], Arith.selEq[1], Arith.selEq[2], Arith.selEq[3], Arith.selEq[4], Arith.selEq[5], Arith.selEq[6], + ax1_0, ax1_1, ax1_2, ax1_3, ax1_4, ax1_5, ax1_6, ax1_7, + ay1_0, ay1_1, ay1_2, ay1_3, ay1_4, ay1_5, ay1_6, ay1_7, + ax2_0, ax2_1, ax2_2, ax2_3, ax2_4, ax2_5, ax2_6, ax2_7, + ay2_0, ay2_1, ay2_2, ay2_3, ay2_4, ay2_5, ay2_6, ay2_7, + ax3_0, ax3_1, ax3_2, ax3_3, ax3_4, ax3_5, ax3_6, ax3_7, + ay3_0, ay3_1, ay3_2, ay3_3, ay3_4, ay3_5, ay3_6, ay3_7 + }; + + // 3] 4 inputs (Point doubling) + arithEq2 { 0, 0, 1, 1, 0, 0, 0, + A0, A1, A2, A3, A4, A5, A6, A7, + B0, B1, B2, B3, B4, B5, B6, B7, + A0, A1, A2, A3, A4, A5, A6, A7, + B0, B1, B2, B3, B4, B5, B6, B7, + E0, E1, E2, E3, E4, E5, E6, E7, + op0, op1, op2, op3, op4, op5, op6, op7 } is + Arith.resultEq2 { + Arith.selEq[0], Arith.selEq[1], Arith.selEq[2], Arith.selEq[3], Arith.selEq[4], Arith.selEq[5], Arith.selEq[6], + ax1_0, ax1_1, ax1_2, ax1_3, ax1_4, ax1_5, ax1_6, ax1_7, + ay1_0, ay1_1, ay1_2, ay1_3, ay1_4, ay1_5, ay1_6, ay1_7, + ax2_0, ax2_1, ax2_2, ax2_3, ax2_4, ax2_5, ax2_6, ax2_7, + ay2_0, ay2_1, ay2_2, ay2_3, ay2_4, ay2_5, ay2_6, ay2_7, + ax3_0, ax3_1, ax3_2, ax3_3, ax3_4, ax3_5, ax3_6, ax3_7, + ay3_0, ay3_1, ay3_2, ay3_3, ay3_4, ay3_5, ay3_6, ay3_7 + }; + + cntArith' = cntArith*(1-Global.L1) + arithEq0 + arithEq1 + arithEq2 + arithEq3 + arithEq4 + arithEq5; + +///////// +// Binary Plookpups +///////// + + bin { + binOpcode, + A0, A1, A2, A3, A4, A5, A6, A7, + B0, B1, B2, B3, B4, B5, B6, B7, + op0, op1, op2, op3, op4, op5, op6, op7, + carry + } is + Binary.resultBinOp { + Binary.lOpcode, + Binary.a[0], Binary.a[1], Binary.a[2], Binary.a[3], Binary.a[4], Binary.a[5], Binary.a[6], Binary.a[7], + Binary.b[0], Binary.b[1], Binary.b[2], Binary.b[3], Binary.b[4], Binary.b[5], Binary.b[6], Binary.b[7], + Binary.c[0], Binary.c[1], Binary.c[2], Binary.c[3], Binary.c[4], Binary.c[5], Binary.c[6], Binary.c[7], + Binary.lCout + }; + + cntBinary' = cntBinary*(1-Global.L1) + bin + sWR + hashPDigest; + +///////// +// HASHK Plookpups +///////// + hashK + hashK1 { + addr, + HASHPOS, + D0 * hashK + hashK1, + op0, op1, op2, op3, + op4, op5, op6, op7 + } in + PaddingKK.crLatch * PaddingKK.r8valid { + PaddingKK.addr, + PaddingKK.len - PaddingKK.rem - PaddingKK.crLen + 1, + PaddingKK.crLen, + PaddingKK.crV0C, PaddingKK.crV1C, PaddingKK.crV2C, PaddingKK.crV3C, + PaddingKK.crV4C, PaddingKK.crV5C, PaddingKK.crV6C, PaddingKK.crV7C + }; + + hashKLen { + addr, + op0 + } is + PaddingKK.lastHashLen { + PaddingKK.addr, + PaddingKK.len + }; + + hashKDigest { + addr, + op0, op1, op2, op3, + op4, op5, op6, op7, + incCounter + } is + PaddingKK.lastHashDigest { + PaddingKK.addr, + PaddingKK.hash0, PaddingKK.hash1, PaddingKK.hash2, PaddingKK.hash3, + PaddingKK.hash4, PaddingKK.hash5, PaddingKK.hash6, PaddingKK.hash7, + PaddingKK.incCounter + }; + + cntKeccakF' = cntKeccakF*(1-Global.L1) + incCounter*hashKDigest; + +///////// +// HASHS Plookpups (Sha256) +///////// + + hashS + hashS1 { + addr, + HASHPOS, + D0 * hashS + hashS1, + op0, op1, op2, op3, + op4, op5, op6, op7 + } in + PaddingSha256.crLatch * PaddingSha256.r8valid { + PaddingSha256.addr, + PaddingSha256.len - PaddingSha256.rem - PaddingSha256.crLen + 1, + PaddingSha256.crLen, + PaddingSha256.crV0C, PaddingSha256.crV1C, PaddingSha256.crV2C, PaddingSha256.crV3C, + PaddingSha256.crV4C, PaddingSha256.crV5C, PaddingSha256.crV6C, PaddingSha256.crV7C + }; + + hashSLen { + addr, + op0 + } is + PaddingSha256.lastHashLen { + PaddingSha256.addr, + PaddingSha256.len + }; + + // The Sha digest's chunks are ordered from most to least significant. + // (hash0 => op7, hash1 => op6, ..) + hashSDigest { + addr, + op0, op1, op2, op3, + op4, op5, op6, op7, + incCounter + } is + PaddingSha256.lastHashDigest { + PaddingSha256.addr, + PaddingSha256.hash7, PaddingSha256.hash6, PaddingSha256.hash5, PaddingSha256.hash4, + PaddingSha256.hash3, PaddingSha256.hash2, PaddingSha256.hash1, PaddingSha256.hash0, + PaddingSha256.incCounter + }; + + cntSha256F' = cntSha256F*(1-Global.L1) + incCounter*hashSDigest; + +///////// +// HASHP Plookpups +///////// + hashP + hashP1 { + addr, + HASHPOS, + D0 * hashP + hashP1, + op0, op1, op2, op3, + op4, op5, op6, op7 + } in + PaddingPG.crLatch * PaddingPG.crValid { + PaddingPG.addr, + PaddingPG.len - PaddingPG.rem - PaddingPG.crLen + 1, + PaddingPG.crLen, + PaddingPG.crV0C, PaddingPG.crV1C, PaddingPG.crV2C, PaddingPG.crV3C, + PaddingPG.crV4C, PaddingPG.crV5C, PaddingPG.crV6C, PaddingPG.crV7C + }; + + hashPLen { + addr, + op0 + } is + PaddingPG.lastHashLen { + PaddingPG.addr, + PaddingPG.len + }; + + hashPDigest { + addr, + op0 + 2**32 * op1, + op2 + 2**32 * op3, + op4 + 2**32 * op5, + op6 + 2**32 * op7, + incCounter + } is + PaddingPG.lastHashDigest { + PaddingPG.addr, + PaddingPG.curHash0, + PaddingPG.curHash1, + PaddingPG.curHash2, + PaddingPG.curHash3, + PaddingPG.incCounter + }; + + cntPaddingPG' = cntPaddingPG*(1-Global.L1) + hashPDigest*incCounter; + cntPoseidonG' = cntPoseidonG*(1-Global.L1) + (hashPDigest + sRD + sWR) * incCounter; + +///////// +// Mem Plookpups +///////// + mOp { + addr, + Global.STEP, + mWR, + op0, op1, op2, op3, + op4, op5, op6, op7 + } is + Mem.mOp { + Mem.addr, + Mem.step, + Mem.mWr, + Mem.val[0], Mem.val[1], Mem.val[2], Mem.val[3], + Mem.val[4], Mem.val[5], Mem.val[6], Mem.val[7] + }; + + +///////// +// Storage Plookpups +///////// + + (sRD + sWR) { + 1, 0, 0, // Poseidon Result ID + C0, C1, C2, C3, C4, C5, C6, C7, + 0, 0, 0, 0, + sKeyI[0], sKeyI[1], sKeyI[2], sKeyI[3] + } is + PoseidonG.result1 { + PoseidonG.result1, PoseidonG.result2, PoseidonG.result3, + PoseidonG.in0, + PoseidonG.in1, + PoseidonG.in2, + PoseidonG.in3, + PoseidonG.in4, + PoseidonG.in5, + PoseidonG.in6, + PoseidonG.in7, + PoseidonG.hashType, + PoseidonG.cap1, + PoseidonG.cap2, + PoseidonG.cap3, + PoseidonG.hash0, + PoseidonG.hash1, + PoseidonG.hash2, + PoseidonG.hash3 + }; + + (sRD + sWR) { + 0, 1, 0, + A0, A1, A2, A3, A4, 0, B0, B1, + sKeyI[0], sKeyI[1], sKeyI[2], sKeyI[3], + sKey[0], sKey[1], sKey[2], sKey[3], + A5, A6, A7, B2, B3, B4, B5, B6, B7 } is + PoseidonG.result2 { + PoseidonG.result1, PoseidonG.result2, PoseidonG.result3, + PoseidonG.in0, + PoseidonG.in1, + PoseidonG.in2, + PoseidonG.in3, + PoseidonG.in4, + PoseidonG.in5, + PoseidonG.in6, + PoseidonG.in7, + PoseidonG.hashType, + PoseidonG.cap1, + PoseidonG.cap2, + PoseidonG.cap3, + PoseidonG.hash0, + PoseidonG.hash1, + PoseidonG.hash2, + PoseidonG.hash3, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + sRD { + SR0 + 2**32*SR1, SR2 + 2**32*SR3, SR4 + 2**32*SR5, SR6 + 2**32*SR7, + sKey[0], sKey[1], sKey[2], sKey[3], + op0, op1, op2, op3, + op4, op5, op6, op7, + incCounter + } is + Storage.latchGet { + Storage.oldRoot0, Storage.oldRoot1, Storage.oldRoot2, Storage.oldRoot3, + Storage.rkey0, Storage.rkey1, Storage.rkey2, Storage.rkey3, + Storage.valueLow0, Storage.valueLow1, Storage.valueLow2, Storage.valueLow3, + Storage.valueHigh0, Storage.valueHigh1, Storage.valueHigh2, Storage.valueHigh3, + Storage.incCounter + 2 + }; + + + sWR { + SR0 + 2**32*SR1, SR2 + 2**32*SR3, SR4 + 2**32*SR5, SR6 + 2**32*SR7, + sKey[0], sKey[1], sKey[2], sKey[3], + D0, D1, D2, D3, + D4, D5, D6, D7, + op0 + 2**32*op1, op2 + 2**32*op3, op4 + 2**32*op5, op6 + 2**32*op7, + incCounter + } is + Storage.latchSet { + Storage.oldRoot0, Storage.oldRoot1, Storage.oldRoot2, Storage.oldRoot3, + Storage.rkey0, Storage.rkey1, Storage.rkey2, Storage.rkey3, + Storage.valueLow0, Storage.valueLow1, Storage.valueLow2, Storage.valueLow3, + Storage.valueHigh0, Storage.valueHigh1, Storage.valueHigh2, Storage.valueHigh3, + Storage.newRoot0, Storage.newRoot1, Storage.newRoot2, Storage.newRoot3, + Storage.incCounter + 2 + }; + + +///////// +// MemAlign Plookpups +///////// + + // memAlign RD + memAlignRD { + 0, 0, + A0, A1, A2, A3, + A4, A5, A6, A7, + B0, B1, B2, B3, + B4, B5, B6, B7, + op0, op1, op2, op3, + op4, op5, op6, op7, + C0 + } is + MemAlign.resultRd { + MemAlign.wr256, + MemAlign.wr8, + MemAlign.m0[0], MemAlign.m0[1], MemAlign.m0[2], MemAlign.m0[3], + MemAlign.m0[4], MemAlign.m0[5], MemAlign.m0[6], MemAlign.m0[7], + MemAlign.m1[0], MemAlign.m1[1], MemAlign.m1[2], MemAlign.m1[3], + MemAlign.m1[4], MemAlign.m1[5], MemAlign.m1[6], MemAlign.m1[7], + MemAlign.v[0], MemAlign.v[1], MemAlign.v[2], MemAlign.v[3], + MemAlign.v[4], MemAlign.v[5], MemAlign.v[6], MemAlign.v[7], + MemAlign.offset + }; + + memAlignWR { + 1, 0, + A0, A1, A2, A3, + A4, A5, A6, A7, + B0, B1, B2, B3, + B4, B5, B6, B7, + op0, op1, op2, op3, + op4, op5, op6, op7, + C0, + D0, D1, D2, D3, + D4, D5, D6, D7, + E0, E1, E2, E3, + E4, E5, E6, E7 + } is + MemAlign.resultWr256 { + MemAlign.wr256, + MemAlign.wr8, + MemAlign.m0[0], MemAlign.m0[1], MemAlign.m0[2], MemAlign.m0[3], + MemAlign.m0[4], MemAlign.m0[5], MemAlign.m0[6], MemAlign.m0[7], + MemAlign.m1[0], MemAlign.m1[1], MemAlign.m1[2], MemAlign.m1[3], + MemAlign.m1[4], MemAlign.m1[5], MemAlign.m1[6], MemAlign.m1[7], + MemAlign.v[0], MemAlign.v[1], MemAlign.v[2], MemAlign.v[3], + MemAlign.v[4], MemAlign.v[5], MemAlign.v[6], MemAlign.v[7], + MemAlign.offset, + MemAlign.w0[0], MemAlign.w0[1], MemAlign.w0[2], MemAlign.w0[3], + MemAlign.w0[4], MemAlign.w0[5], MemAlign.w0[6], MemAlign.w0[7], + MemAlign.w1[0], MemAlign.w1[1], MemAlign.w1[2], MemAlign.w1[3], + MemAlign.w1[4], MemAlign.w1[5], MemAlign.w1[6], MemAlign.w1[7] + }; + + memAlignWR8 { + 0, 1, + A0, A1, A2, A3, + A4, A5, A6, A7, + op0, op1, op2, op3, + op4, op5, op6, op7, + C0, + D0, D1, D2, D3, + D4, D5, D6, D7 + } is + MemAlign.resultWr8 { + MemAlign.wr256, + MemAlign.wr8, + MemAlign.m0[0], MemAlign.m0[1], MemAlign.m0[2], MemAlign.m0[3], + MemAlign.m0[4], MemAlign.m0[5], MemAlign.m0[6], MemAlign.m0[7], + MemAlign.v[0], MemAlign.v[1], MemAlign.v[2], MemAlign.v[3], + MemAlign.v[4], MemAlign.v[5], MemAlign.v[6], MemAlign.v[7], + MemAlign.offset, + MemAlign.w0[0], MemAlign.w0[1], MemAlign.w0[2], MemAlign.w0[3], + MemAlign.w0[4], MemAlign.w0[5], MemAlign.w0[6], MemAlign.w0[7] + }; + + cntMemAlign' = cntMemAlign*(1-Global.L1) + memAlignRD + memAlignWR + memAlignWR8; + diff --git a/test/pil2/zkevm-etrog/mem.pil b/test/pil2/zkevm-etrog/mem.pil new file mode 100644 index 0000000..675ac7b --- /dev/null +++ b/test/pil2/zkevm-etrog/mem.pil @@ -0,0 +1,57 @@ +include "global.pil"; + +subproof Mem(2**23) { + + const expr INCS = Global.STEP + 1; + const expr ISNOTLAST = (1 - Global.LLAST); + const int MAX_STEP = 2**23; + + // single: 13 cols + // double: 15 cols <== safe area if more than 26.7% of memory access are R-R,W-R for same addr and value + // for example: with 80% => double = 60% * single (safe 40% of area) + + col witness addr; + col witness step[2]; + col witness mOp, mWr; + col witness value[8]; + col witness isDouble; + col witness lastAccess; // 1 if its the last access of a given address + + // The list is sorted by [addr, step] + lastAccess * (1 - lastAccess) = 0; + isDouble * (1 - isDouble) = 0; + isDouble * (1 - mOp) = 0; + + const expr stepDelta = step[0]' + isDouble * (step[0] - step[1]) - step[0]; + + range_check(ISNOTLAST, lastAccess * (addr' - addr - stepDelta) + stepDelta, 1, MAX_STEP); + range_check(isDouble, step[1] - step[0], 1, MAX_STEP); + + + // ISNOTLAST { lastAccess * (addr' - addr - (step'-step)) + (step'-step) } in INCS; + (1 - lastAccess) * (addr' - addr) = 0; + + mOp * (1 - mOp) === 0; + mWr * (1 - mWr) === 0; + // mWr could be 1 only if mOp is 1 + (1 - mOp) * mWr = 0; + + const expr isWrite = mOp' * mWr'; + const expr rdSame = (1-isWrite) * (1-lastAccess); + const expr rdDifferent = (1-isWrite) * lastAccess; + + // lastAccess has to be 1 in the last evaluation. This is necessary to + // validate [rdDifferent * (val[0]') = 0;] correctly (in a cyclic way) + (lastAccess - 1) * (1 - ISNOTLAST) = 0; + + for (int index = 0; index < length(val); index += 1) { + rdSame * (value[index]' - value[index]) = 0; + rdDifferent * (value[index]') = 0; + } + + multiset_proves(MEM_ID, mOp, [addr, step[0], mWr, ...value]); + + // only allowed double operations: R R or W R (always same addr and value) + // second operation always is a read + multiset_proves(MEM_ID, isDouble, [addr, step[1], 0, ...value]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/mem_align.pil b/test/pil2/zkevm-etrog/mem_align.pil new file mode 100644 index 0000000..eadde2b --- /dev/null +++ b/test/pil2/zkevm-etrog/mem_align.pil @@ -0,0 +1,163 @@ +// subair MemAlign(2**20, 2**23, 2**26) +namespace MemAlign:: { + + /* + * OPERATIONS + * + * (m0,m1,D) => v + * (m0,m1,D,v) => (w0, w1) + * + * @m0 = addr @m1 = addr + 32 (ethereum) + * + * Ethereum => BigEndian + * m0[7],m0[6],...,m0[1],m0[0],m1[7],m1[6],...,m1[1],m1[0] + * + * inM (8 bits, 32 steps) + */ + + // 32 bytes of M0, M1 ordered from HSB to LSB (32, 31, 30, ... == M[7].3, M[7].2, M[7].1, M[7].0, M[6].3, ..) + col witness inM[2]; + + // 32 bytes of V + col witness inV; + + // write 32 bytes (256 bits) + col witness wr256; + + // write 1 byte (8 bits), its special case because need to ignore + // the rest of bytes, only LSB of V was stored (on w0 with offset) + col witness wr8; + + // clk registers + // 0-7 m0[0]-m0[7] + // 8-15 m1[0]-m1[7] + // 16-23 w0[0]-w0[7] + // 23-31 w1[0]-w1[7] + col witness mw; + + // clk registers + // 0-7 v[0]-v[7] + col witness v; + + // col witness m0[8]; + // col witness m1[8]; + // col witness w0[8]; + // col witness w1[8]; + // col witness v[8]; + + // when m1 is "active", means aligned with inV + // also when wr8 = 1, used to indicate when store the LSB + col witness selM1; + + // factors to build V[] in correct way, because order of V bytes + // changes according the offset and wr8 + col witness factorV[8]; + + col witness offset; + + // BYTE_C4096 = 0 (x4096), 1 (x4096), ... , 31 (x4096), 32 (x4096), 0 (x4096), 1 (x4096), ... + col fixed BYTE_C4096 = [0:4096..255:4096]...; + + // FACTOR was same for all combinations of offset, wr8, wr256 is a f(step) + // FACTOR = 2**24, 2**16, 2**8, 1, 0 (x28) + col fixed FACTOR = [2**24, 2**16, 2**8, 1, 0:28]...; + + // FACTOR change according the combinations of offset, wr8, wr256 and step. + col fixed FACTORV[8]; + + // STEP32 + // 0 - 1023 WR256 = 0 WR8 = 0 + // 1024 - 2047 WR256 = 0 WR8 = 0 + // 2048 - 3071 WR256 = 1 WR8 = 0 + // 3072 - 4096 WR256 = 0 WR8 = 1 + col fixed WR256 = [0:2048,1:1024:0:1024]...; + col fixed WR8 = [0:3072,1:1024]...; + col fixed OFFSET = [0:32..31:32]...; + col fixed SELM1; + + col RESET = Global.CLK32[0]; + + // RangeCheck Latch Clock + // factorV Plookup (FACTORV) no yes + // wr256 Plookup (WR256) yes no + // wr8 Plookup (WR8) yes no + // offset Plookup (OFFSET) yes no + // inV RangeCheck (BYTE_C4096) no yes + // inM[0..1] RangeCheck (BYTE2A,BYTE2) no yes + // m0[0..7] Built no yes + // m1[0..7] Built no yes + // w0[0..7] Built no yes + // w1[0..7] Built no yes + // v[0..7] Built no yes + // selM1 Plookup (SELM1) no yes + + // 40 => 2 (-38) + // +2 inW[2] + // factorV 8 => 2 (-6) + // +1 inVOrdenat + // Latchs + (1 - RESET) * wr256' === (1 - RESET) * wr256; + (1 - RESET) * offset' === (1 - RESET) * offset; + (1 - RESET) * wr8' === (1 - RESET) * wr8; + + col witness resultRd; + col witness resultWr8; + col witness resultWr256; + + (1 - RESET) * resultRd === 0; + (1 - RESET) * resultWr8 === 0; + (1 - RESET) * resultWr256 === 0; + resultRd * (1 - resultRd) === 0; + resultWr8 * (1 - resultWr8) === 0; + resultWr256 * (1 - resultWr256) === 0; + + (1 - wr8) * resultWr8 === 0; + (1 - wr256) * resultWr256 === 0; + (wr8 + wr256) * resultRd === 0; + + // RangeCheck + range_check([...inM], 0, 255); + + // Plookup + lookup ([STEP32, offset', wr256', wr8', selM1, inV, ...factorV], + [STEP32, OFFSET, WR256, WR8, SELM1, BYTE_C4096, ...FACTORV]); + + // selW0 contains data to be store in w0, must be 0 in "reading mode" + // in "writting mode", in particular with wr8 only on byte must be + // stored, for this reason use selM1 that was active only one clock (in wr8 mode) + col selW0 = (1 - selM1) * wr256' + selM1 * wr8'; + + // selW1 contains data to be store in w1, must be 0 in "reading mode" + col selW1 = selM1 * wr256'; + + // NOTE: when wr8 = 1 implies wr256 = 0, check in this situations where use selM1 + // to verify that non exists collateral effects + // + // col selW0 = selM1 (because wr256 = 0 and wr8 = 1) + // + // selM1 used in col _inM, but _inM is only used on dataV + // col dataV = (1 - wr256' - wr8') * _inM + (wr256' + wr8') * inV; + // col dataV = inV (because wr256 = 0 and wr8 = 1) + // + // CONCLUSION: it's safe reuse selM1 to indicate when store byte + + // data to "write" on w, if current byte must be override by V contains inV + // if not contains inM "in reading mode" must be 0. + col dataW0 = (wr8' + wr256') * inM[0] + selW0 * (inV - inM[0]); + col dataW1 = (wr8' + wr256') * inM[1] + selW1 * (inV - inM[1]); + + for (int i=0;i<8; ++i) { + m0[i]' === (1-RESET) * m0[i] + FACTOR'(i) * inM[0]; + m1[i]' === (1-RESET) * m1[i] + FACTOR'(i) * inM[1]; + w0[i]' === (1-RESET) * w0[i] + FACTOR'(i) * dataW0; + w1[i]' === (1-RESET) * w1[i] + FACTOR'(i) * dataW1; + // factorV === f(STEP, offset, wr8) + v[i]' === (1-RESET) * v[i] + factorV[i] * dataV; + } + + // _inM contains "active" value of inM + col _inM = (1 - selM1) * inM[0] + selM1 * inM[1]; + + // contains data to store in V, could be one of inM if was reading or inV if was writting + col dataV = (1 - wr256' - wr8') * _inM + (wr256' + wr8') * inV; +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/padding_kk.pil b/test/pil2/zkevm-etrog/padding_kk.pil new file mode 100644 index 0000000..b403b49 --- /dev/null +++ b/test/pil2/zkevm-etrog/padding_kk.pil @@ -0,0 +1,153 @@ +include "padding_kkbit.pil"; + +namespace PaddingKK(%N); + + // Polynomials that are used to compute a hash chunk + pol commit freeIn; + pol constant r8Id; + pol commit connected; + pol commit addr; + + pol constant lastBlock; + pol constant lastBlockLatch; + pol constant r8valid; + + // rem: It can be different only the first byte of a new Hash. + pol commit rem; + + rem' * (1-lastHash) = (rem-1)*(1-lastHash); + + pol commit remInv; + pol remIsZero = 1 - rem*remInv; + remIsZero*rem = 0; + + pol commit spare; + pol lastHash = lastBlock*(spare + remIsZero); + pol lastHashLatch = lastBlockLatch * (spare + remIsZero); + spare' = (spare + remIsZero)*(1-lastHash); + spare * (1 - spare) = 0; + + pol commit lastHashLen; + pol commit lastHashDigest; + + lastHashLen * (1 - lastHashLen) = 0; + lastHashDigest * (1 - lastHashDigest) = 0; + + lastHashLen * (1 - lastHashLatch) = 0; + lastHashDigest * (1 - lastHashLatch) = 0; + + pol aFreeIn = (1 - (remIsZero + spare))*freeIn + remIsZero + lastHash*0x80; + r8valid {aFreeIn, r8Id, connected} in { PaddingKKBit.r8, PaddingKKBit.r8Id, PaddingKKBit.connected }; + + connected' * ( 1-lastBlock) = connected * (1-lastBlock); + connected'*lastBlock = (1 - lastHash)*lastBlock; + + pol constant sOutId; + + lastHashLatch { + hash0, + hash1, + hash2, + hash3, + hash4, + hash5, + hash6, + hash7, + sOutId + } in { + PaddingKKBit.sOut0, + PaddingKKBit.sOut1, + PaddingKKBit.sOut2, + PaddingKKBit.sOut3, + PaddingKKBit.sOut4, + PaddingKKBit.sOut5, + PaddingKKBit.sOut6, + PaddingKKBit.sOut7, + PaddingKKBit.sOutId + }; + + pol constant forceLastHash; + (1-lastHash)*forceLastHash = 0; // Force first block to be the beggining + + pol commit len; + len' * lastHash = rem' * lastHash; + len'*(1-lastHash) = len*(1-lastHash); + + pol commit hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7; + (hash0' - hash0) * (1-lastHash) = 0; + (hash1' - hash1) * (1-lastHash) = 0; + (hash2' - hash2) * (1-lastHash) = 0; + (hash3' - hash3) * (1-lastHash) = 0; + (hash4' - hash4) * (1-lastHash) = 0; + (hash5' - hash5) * (1-lastHash) = 0; + (hash6' - hash6) * (1-lastHash) = 0; + (hash7' - hash7) * (1-lastHash) = 0; + + (addr' -addr) * (1-lastHash) = 0; + (addr' - 1 -addr) * lastHashLatch = 0; + + pol commit incCounter; + // if lastHash=0 && lastBLock=0 then incCounter'=incCounter + // if lastHash=0 && lastBLock=1 then incCounter'=incCounter+1 + // if lastHash=1 && lastBlock=1 then incCounter'=1 + incCounter' = incCounter*(1-lastBlock) + (incCounter +1)*(lastBlock-lastHash) + lastHash; + (incCounter - 1) * Global.L1 = 0; + + // chunkReader generator + + pol commit crOffset; + pol commit crLen; + + pol commit crOffsetInv; + pol crLatch = 1 - crOffset*crOffsetInv; + crOffset * crLatch = 0; + + crOffset'*(1-crLatch) = (crOffset - 1)*(1-crLatch); + crLen'*(1-crLatch) = crLen*(1-crLatch); + crLatch * crOffset' = crLatch * (crLen' -1); + + pol commit crF0, crF1, crF2, crF3, crF4, crF5, crF6, crF7; + + { crOffset, crF0, crF1, crF2, crF3, + crF4, crF5, crF6, crF7} in + { Global.STEP32, Global.BYTE_FACTOR[0], Global.BYTE_FACTOR[1], Global.BYTE_FACTOR[2], Global.BYTE_FACTOR[3], + Global.BYTE_FACTOR[4], Global.BYTE_FACTOR[5], Global.BYTE_FACTOR[6], Global.BYTE_FACTOR[7] }; + + + pol commit crV0, crV1, crV2, crV3, crV4, crV5, crV6, crV7; + + pol crV0C = crV0 + crF0 * aFreeIn; + pol crV1C = crV1 + crF1 * aFreeIn; + pol crV2C = crV2 + crF2 * aFreeIn; + pol crV3C = crV3 + crF3 * aFreeIn; + pol crV4C = crV4 + crF4 * aFreeIn; + pol crV5C = crV5 + crF5 * aFreeIn; + pol crV6C = crV6 + crF6 * aFreeIn; + pol crV7C = crV7 + crF7 * aFreeIn; + + crV0' = crV0C*(1-crLatch); + crV1' = crV1C*(1-crLatch); + crV2' = crV2C*(1-crLatch); + crV3' = crV3C*(1-crLatch); + crV4' = crV4C*(1-crLatch); + crV5' = crV5C*(1-crLatch); + crV6' = crV6C*(1-crLatch); + crV7' = crV7C*(1-crLatch); + + (1-crLatch) * lastHash = 0; // Ensure qhen a hash ends it resets the address. + + /* Read Data output + crLatch * crValid {addr, PaddingKK.len - PaddingKK.rem - PaddingKK.crLen + 1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C} + */ + + /* Read Len output + lastHashLatch {addr, len} + */ + + /* Read Len digest + lastHashLatch { addr, hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7 } + */ + + + + diff --git a/test/pil2/zkevm-etrog/padding_kkbit.pil b/test/pil2/zkevm-etrog/padding_kkbit.pil new file mode 100644 index 0000000..ae685cb --- /dev/null +++ b/test/pil2/zkevm-etrog/padding_kkbit.pil @@ -0,0 +1,131 @@ +/* + Padding Keccak rBit + This state machine packs the rBits in bytes (r8) + And stOut bits in 8 field Elements of 32bit slints. + It also forces the connection bettwien keccak-f blocks. + + rBit sOutBit sInBit + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● + ● ● ● + ● ● ● + ● ● ● ┌─────────────────┐ + ● ● ● │ r8 calculations │ + ● ● ● │ 9*136 = 1224 │ + ● ● ● │ │ + ● ● ● └─────────────────┘ + ● ● ● + ● r8[i*136+k] + . . . + . . . + . . . + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● ● ● + ● + ─────────────────────────────────────────────── + ● ● + ● ● + ● ● ┌─────────────────┐ + ● ● │ capacity │ + ● ● │ connection │ + . . │ 512 │ + . . └─────────────────┘ + . . + ● ● + ● ● + ────────────────────────────────────────────── + ● + ● ┌─────────────────┐ + ● │ packet sOut │ + . │ Calculation │ + . │ 256+1 │ + . └─────────────────┘ + ● + ● + ●●●●●●●● sOut{0..7}[i] +*/ + +/* + + The output for r8 is: + + [r8, r8Id] + + The output for sOut + + [sOut0, sOut1, sOut2, sOut3, sOut4, sOut5, sOut6, sOut7, connect, sOutId] + +*/ + +include "bits2field.pil"; + +namespace PaddingKKBit(%N); + pol commit rBit, sOutBit; + + // Input connection rBit -> 1 1 0 1 0 1 1 1 X + // Fr8 -> 1 2 4 8 16 32 64 128 0 + // r8 -> 0 1 3 3 11 11 43 107 235 + //latchR8-> 0 0 0 0 0 0 0 0 1 0 0 0 0 0 + pol commit r8; + pol constant r8Id; + + pol commit connected; + pol commit sOut0, sOut1, sOut2, sOut3, sOut4, sOut5, sOut6, sOut7; + pol constant sOutId; + + pol constant latchR8; + pol constant Fr8; // Factor to add to r8 + pol constant rBitValid; // 1 when rIn can be 0 or 1 + + pol constant latchSOut; + pol constant FSOut0, FSOut1, FSOut2, FSOut3, FSOut4, FSOut5, FSOut6, FSOut7; + + r8' = r8 * (1-latchR8) + rBit*Fr8; + + sOut0' = sOut0*(1-latchSOut) + sOutBit*FSOut0; + sOut1' = sOut1*(1-latchSOut) + sOutBit*FSOut1; + sOut2' = sOut2*(1-latchSOut) + sOutBit*FSOut2; + sOut3' = sOut3*(1-latchSOut) + sOutBit*FSOut3; + sOut4' = sOut4*(1-latchSOut) + sOutBit*FSOut4; + sOut5' = sOut5*(1-latchSOut) + sOutBit*FSOut5; + sOut6' = sOut6*(1-latchSOut) + sOutBit*FSOut6; + sOut7' = sOut7*(1-latchSOut) + sOutBit*FSOut7; + + connected'*(1-latchSOut) = connected*(1-latchSOut); + connected * (1-connected) = 0; + rBit *( 1- rBit) = 0; + (1-rBitValid)*rBit = 0; // Force rBit to 0 on non used pins. + sOutBit *( 1- sOutBit) = 0; + + /* + connected, sOutBit, rBit => sInBit + 0 0 0 0 + 0 0 1 1 + 0 1 0 0 + 0 1 1 1 + 1 0 0 0 + 1 0 1 1 + 1 1 0 1 + 1 1 1 0 + */ + + pol aux_sInBit = (sOutBit - 2*sOutBit*rBit); + pol sInBit = connected * aux_sInBit + rBit; + + pol constant ConnSOutBit, ConnSInBit, ConnBits2FieldBit; + + {sOutBit, sInBit, Bits2Field.bit} connect {ConnSOutBit, ConnSInBit, ConnBits2FieldBit} + diff --git a/test/pil2/zkevm-etrog/padding_pg.pil b/test/pil2/zkevm-etrog/padding_pg.pil new file mode 100644 index 0000000..cd29673 --- /dev/null +++ b/test/pil2/zkevm-etrog/padding_pg.pil @@ -0,0 +1,181 @@ +include "global.pil"; +include "poseidong.pil"; + +namespace PaddingPG(%N); + + // Polynomials that are used to compute a hash chunk + pol commit acc[8]; + pol commit freeIn; + pol commit addr; + + freeIn in Global.BYTE; + + pol constant F[8]; + pol constant lastBlock; // [0:55 1] + [0:N-1 1] blocks of 56 steps, 0 in the first 55 steps and 1 in the last step of the block. + // Also the last global step was 1 to close the global cycle (allowing addr change from step N-1 to 0) + pol constant crValid; // 1 for valid/complete 56 steps blocks, 0 for last smaller/incomplete block + + // rem: It can be different only the first byte of a new Hash. + pol commit rem; + + rem' * (1-lastHash) = (rem-1)*(1-lastHash); + + pol commit remInv; + pol remIsZero = 1 - rem*remInv; + remIsZero*rem = 0; + + + pol commit spare; + pol lastHash = lastBlock*(spare + remIsZero); + spare' = (spare + remIsZero)*(1-lastHash); + spare * (1 - spare) = 0; + + pol commit lastHashLen; + pol commit lastHashDigest; + + lastHashLen * (1 - lastHashLen) = 0; + lastHashDigest * (1 - lastHashDigest) = 0; + + lastHashLen * (1 - lastHash) = 0; + lastHashDigest * (1 - lastHash) = 0; + + pol aFreeIn = (1 - (remIsZero + spare))*freeIn + remIsZero + lastHash*0x80; + + pol acc0C = acc[0] + F[0] * aFreeIn; + pol acc1C = acc[1] + F[1] * aFreeIn; + pol acc2C = acc[2] + F[2] * aFreeIn; + pol acc3C = acc[3] + F[3] * aFreeIn; + pol acc4C = acc[4] + F[4] * aFreeIn; + pol acc5C = acc[5] + F[5] * aFreeIn; + pol acc6C = acc[6] + F[6] * aFreeIn; + pol acc7C = acc[7] + F[7] * aFreeIn; + + acc[0]' = acc0C*(1-lastBlock); + acc[1]' = acc1C*(1-lastBlock); + acc[2]' = acc2C*(1-lastBlock); + acc[3]' = acc3C*(1-lastBlock); + acc[4]' = acc4C*(1-lastBlock); + acc[5]' = acc5C*(1-lastBlock); + acc[6]' = acc6C*(1-lastBlock); + acc[7]' = acc7C*(1-lastBlock); + + lastBlock { + acc0C, + acc1C, + acc2C, + acc3C, + acc4C, + acc5C, + acc6C, + acc7C, + prevHash0, + prevHash1, + prevHash2, + prevHash3, + curHash0, + curHash1, + curHash2, + curHash3 + } in PoseidonG.LATCH { + PoseidonG.in0, + PoseidonG.in1, + PoseidonG.in2, + PoseidonG.in3, + PoseidonG.in4, + PoseidonG.in5, + PoseidonG.in6, + PoseidonG.in7, + PoseidonG.hashType, + PoseidonG.cap1, + PoseidonG.cap2, + PoseidonG.cap3, + PoseidonG.hash0, + PoseidonG.hash1, + PoseidonG.hash2, + PoseidonG.hash3 + }; + + pol commit curHash0, curHash1, curHash2, curHash3; + curHash0' * (1-lastBlock) = curHash0*(1-lastBlock); + curHash1' * (1-lastBlock) = curHash1*(1-lastBlock); + curHash2' * (1-lastBlock) = curHash2*(1-lastBlock); + curHash3' * (1-lastBlock) = curHash3*(1-lastBlock); + + pol commit prevHash0, prevHash1, prevHash2, prevHash3; + prevHash0' = lastBlock*(curHash0 - prevHash0) + prevHash0 - lastHash*curHash0; + prevHash1' = lastBlock*(curHash1 - prevHash1) + prevHash1 - lastHash*curHash1; + prevHash2' = lastBlock*(curHash2 - prevHash2) + prevHash2 - lastHash*curHash2; + prevHash3' = lastBlock*(curHash3 - prevHash3) + prevHash3 - lastHash*curHash3; + + pol commit incCounter; + // if lastHash=0 && lastBLock=0 then incCounter'=incCounter + // if lastHash=0 && lastBLock=1 then incCounter'=incCounter+1 + // if lastHash=1 && lastBlock=1 then incCounter'=1 + incCounter' = incCounter*(1-lastBlock) + (incCounter +1)*(lastBlock-lastHash) + lastHash; + (incCounter - 1) * Global.L1 = 0; + + pol commit len; + len' * lastHash = rem' * lastHash; + len'*(1-lastHash) = len*(1-lastHash); + + (addr' -addr) * (1-lastHash) = 0; + + pol doInc = lastHash * (1-Global.L1'); + (addr' - 1 -addr) * doInc = 0; + + // chunkReader generator + + pol commit crOffset; + pol commit crLen; + + pol commit crOffsetInv; + pol crLatch = 1 - crOffset*crOffsetInv; + crOffset * crLatch = 0; + + crOffset'*(1-crLatch) = (crOffset - 1)*(1-crLatch); + crLen'*(1-crLatch) = crLen*(1-crLatch); + crLatch * crOffset' = crLatch * (crLen' -1); + + pol commit crF0, crF1, crF2, crF3, crF4, crF5, crF6, crF7; + + { crOffset, crF0, crF1, crF2, crF3, + crF4, crF5, crF6, crF7} in + { Global.STEP32, Global.BYTE_FACTOR[0], Global.BYTE_FACTOR[1], Global.BYTE_FACTOR[2], Global.BYTE_FACTOR[3], + Global.BYTE_FACTOR[4], Global.BYTE_FACTOR[5], Global.BYTE_FACTOR[6], Global.BYTE_FACTOR[7] }; + + + pol commit crV0, crV1, crV2, crV3, crV4, crV5, crV6, crV7; + + pol crV0C = crV0 + crF0 * aFreeIn; + pol crV1C = crV1 + crF1 * aFreeIn; + pol crV2C = crV2 + crF2 * aFreeIn; + pol crV3C = crV3 + crF3 * aFreeIn; + pol crV4C = crV4 + crF4 * aFreeIn; + pol crV5C = crV5 + crF5 * aFreeIn; + pol crV6C = crV6 + crF6 * aFreeIn; + pol crV7C = crV7 + crF7 * aFreeIn; + + crV0' = crV0C*(1-crLatch); + crV1' = crV1C*(1-crLatch); + crV2' = crV2C*(1-crLatch); + crV3' = crV3C*(1-crLatch); + crV4' = crV4C*(1-crLatch); + crV5' = crV5C*(1-crLatch); + crV6' = crV6C*(1-crLatch); + crV7' = crV7C*(1-crLatch); + + (1-crLatch) * lastHash = 0; // Ensure when a hash ends it resets the address. + + + /* Read Data output + crLatch * crValid [hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, crOffset - crLen -1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C] + */ + + /* Read Len output + lastHash [hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, len] + */ + + + + + diff --git a/test/pil2/zkevm-etrog/padding_sha256.pil b/test/pil2/zkevm-etrog/padding_sha256.pil new file mode 100644 index 0000000..c7d9650 --- /dev/null +++ b/test/pil2/zkevm-etrog/padding_sha256.pil @@ -0,0 +1,167 @@ +include "global.pil"; +include "padding_sha256bit.pil"; + +namespace PaddingSha256(%N); + + // Polynomials that are used to compute a hash chunk + pol commit freeIn; + pol constant r8Id; + pol commit connected; + pol commit addr; + + pol constant lastBlock; + pol constant lastBlockLatch; + pol constant r8valid; + + // rem: It can be different only the first byte of a new Hash. + pol commit rem; + + rem' * (1-lastHash) = (rem-1)*(1-lastHash); + + pol commit remInv; + pol remIsZero = 1 - rem*remInv; + remIsZero*rem = 0; + + pol commit spare; + pol lastHash = lastBlock*lengthSection; // 1 in the last row of the last block of a hash + pol lastHashLatch = lastBlockLatch*lengthSection; + spare' = (spare + remIsZero)*(1-lastHash); + spare * (1 - spare) = 0; + + pol constant PrevLengthSection; + pol commit lengthSection; + pol commit accLength; + pol constant LengthWeight; + pol startLengthSection = (spare + remIsZero)*PrevLengthSection; + lengthSection' = (lengthSection + startLengthSection)*(1-lastHash); + lengthSection * (1-lengthSection) = 0; + + pol freeIn_LengthWeight = freeIn * LengthWeight; + accLength' = accLength*(1-lastHash) + lengthSection'*freeIn_LengthWeight'; + (accLength - len*8)*lastHash = 0; + + pol commit lastHashLen; + pol commit lastHashDigest; + + lastHashLen * (1 - lastHashLen) = 0; + lastHashDigest * (1 - lastHashDigest) = 0; + + lastHashLen * (1 - lastHashLatch) = 0; + lastHashDigest * (1 - lastHashLatch) = 0; + + + pol aFreeIn = (1 - (remIsZero + spare))*freeIn + remIsZero*0x80 + lengthSection*freeIn; + r8valid {aFreeIn, r8Id, connected} in { PaddingSha256Bit.r8, PaddingSha256Bit.r8Id, PaddingSha256Bit.connected }; + + connected' * ( 1-lastBlock) = connected * (1-lastBlock); + connected'*lastBlock = (1 - lastHash)*lastBlock; + + pol constant sOutId; + + lastHashLatch { + hash0, + hash1, + hash2, + hash3, + hash4, + hash5, + hash6, + hash7, + sOutId + } in { + PaddingSha256Bit.sOut0, + PaddingSha256Bit.sOut1, + PaddingSha256Bit.sOut2, + PaddingSha256Bit.sOut3, + PaddingSha256Bit.sOut4, + PaddingSha256Bit.sOut5, + PaddingSha256Bit.sOut6, + PaddingSha256Bit.sOut7, + PaddingSha256Bit.sOutId + }; + + pol constant forceLastHash; + (1-lastHash)*forceLastHash = 0; // Force first block to be the beggining + + pol commit len; + len' * lastHash = rem' * lastHash; + len'*(1-lastHash) = len*(1-lastHash); + + pol commit hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7; + (hash0' - hash0) * (1-lastHash) = 0; + (hash1' - hash1) * (1-lastHash) = 0; + (hash2' - hash2) * (1-lastHash) = 0; + (hash3' - hash3) * (1-lastHash) = 0; + (hash4' - hash4) * (1-lastHash) = 0; + (hash5' - hash5) * (1-lastHash) = 0; + (hash6' - hash6) * (1-lastHash) = 0; + (hash7' - hash7) * (1-lastHash) = 0; + + (addr' -addr) * (1-lastHash) = 0; + (addr' - 1 -addr) * lastHashLatch = 0; + + pol commit incCounter; + // if lastHash=0 && lastBLock=0 then incCounter'=incCounter + // if lastHash=0 && lastBLock=1 then incCounter'=incCounter+1 + // if lastHash=1 && lastBlock=1 then incCounter'=1 + incCounter' = incCounter*(1-lastBlock) + (incCounter +1)*(lastBlock-lastHash) + lastHash; + (incCounter - 1) * Global.L1 = 0; + + // chunkReader generator + + pol commit crOffset; + pol commit crLen; + + pol commit crOffsetInv; + pol crLatch = 1 - crOffset*crOffsetInv; + crOffset * crLatch = 0; + + crOffset'*(1-crLatch) = (crOffset - 1)*(1-crLatch); + crLen'*(1-crLatch) = crLen*(1-crLatch); + crLatch * crOffset' = crLatch * (crLen' -1); + + pol commit crF0, crF1, crF2, crF3, crF4, crF5, crF6, crF7; + + { crOffset, crF0, crF1, crF2, crF3, + crF4, crF5, crF6, crF7} in + { Global.STEP32, Global.BYTE_FACTOR[0], Global.BYTE_FACTOR[1], Global.BYTE_FACTOR[2], Global.BYTE_FACTOR[3], + Global.BYTE_FACTOR[4], Global.BYTE_FACTOR[5], Global.BYTE_FACTOR[6], Global.BYTE_FACTOR[7] }; + + + pol commit crV0, crV1, crV2, crV3, crV4, crV5, crV6, crV7; + + pol crV0C = crV0 + crF0 * aFreeIn; + pol crV1C = crV1 + crF1 * aFreeIn; + pol crV2C = crV2 + crF2 * aFreeIn; + pol crV3C = crV3 + crF3 * aFreeIn; + pol crV4C = crV4 + crF4 * aFreeIn; + pol crV5C = crV5 + crF5 * aFreeIn; + pol crV6C = crV6 + crF6 * aFreeIn; + pol crV7C = crV7 + crF7 * aFreeIn; + + crV0' = crV0C*(1-crLatch); + crV1' = crV1C*(1-crLatch); + crV2' = crV2C*(1-crLatch); + crV3' = crV3C*(1-crLatch); + crV4' = crV4C*(1-crLatch); + crV5' = crV5C*(1-crLatch); + crV6' = crV6C*(1-crLatch); + crV7' = crV7C*(1-crLatch); + + (1-crLatch) * lastHash = 0; // Ensure qhen a hash ends it resets the address. + + /* Read Data output + crLatch * crValid {addr, PaddingSha256.len - PaddingSha256.rem - PaddingSha256.crLen + 1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C} + */ + + /* Read Len output + lastHashLatch {addr, len} + */ + + /* Read Len digest + lastHashLatch { addr, hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7 } + */ + + + + diff --git a/test/pil2/zkevm-etrog/padding_sha256bit.pil b/test/pil2/zkevm-etrog/padding_sha256bit.pil new file mode 100644 index 0000000..00d7720 --- /dev/null +++ b/test/pil2/zkevm-etrog/padding_sha256bit.pil @@ -0,0 +1,139 @@ +/* + Padding sha256 rBit + This state machine packs the rBits in bytes (r8) + And stOut bits in 8 field Elements of 32bit slints. + It also forces the connection bettwien keccak-f blocks. + + s1 s2 + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● ┌─────────────────┐ + ● ● │ s1 = sout(n-1) │ + ● ● │ s2 = sin(n) │ + ● ● │ 8*64 = 256 │ + ● ● └─────────────────┘ + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● +─────────────────────────────────────────────── + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● + ● ● + ● ● ┌─────────────────┐ + ● ● │ s1 = rIn (1/2) │ + ● ● | s2 = sout(n) | + ● ● │ │ + ● ● │ 32*8 = 256 │ + ● ● └─────────────────┘ + ● ● + ● + . . + . . + . . + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ● + ● ●●●●●●●● sOut{0..7}[i] + ────────────────────────────────────────────── + ● + ● + ● + ● + ● + ● + ● + ● + ● + ● + ● ┌─────────────────┐ + ● │ s1 = rIn (2/2) │ + . │ │ + . │ 32*8 = 256 │ + . └─────────────────┘ + ● + ● + ● +*/ + +/* + + The output for r8 is: + + [r8, r8Id] + + The output for sOut + + [sOut0, sOut1, sOut2, sOut3, sOut4, sOut5, sOut6, sOut7, connect, sOutId] + +*/ + +include "bits2field_sha256.pil"; + +namespace PaddingSha256Bit(%N); + pol commit s1, s2; + + // Input connection rBit -> 1 1 0 1 0 1 1 1 X + // Fr8 -> 128 64 32 16 8 4 2 1 0 + // r8 -> 128 192 192 208 208 212 214 215 0 + //latchR8-> 0 0 0 0 0 0 0 0 1 0 0 0 0 0 + pol commit r8; + pol constant r8Id; + + pol commit connected; + pol commit sOut0, sOut1, sOut2, sOut3, sOut4, sOut5, sOut6, sOut7; + pol constant sOutId; + + pol constant latchR8; + pol constant Fr8; // Factor to add to r8 + + pol constant latchSOut; + pol constant FSOut0, FSOut1, FSOut2, FSOut3, FSOut4, FSOut5, FSOut6, FSOut7; + + r8' = r8 * (1-latchR8) + s1'*Fr8'; + + sOut0' = sOut0*(1-latchSOut) + s2'*FSOut0'; + sOut1' = sOut1*(1-latchSOut) + s2'*FSOut1'; + sOut2' = sOut2*(1-latchSOut) + s2'*FSOut2'; + sOut3' = sOut3*(1-latchSOut) + s2'*FSOut3'; + sOut4' = sOut4*(1-latchSOut) + s2'*FSOut4'; + sOut5' = sOut5*(1-latchSOut) + s2'*FSOut5'; + sOut6' = sOut6*(1-latchSOut) + s2'*FSOut6'; + sOut7' = sOut7*(1-latchSOut) + s2'*FSOut7'; + + connected'*(1-latchSOut) = connected*(1-latchSOut); + connected * (1-connected) = 0; + s1 *( 1- s1) = 0; + s2 *( 1- s2) = 0; + + + pol constant HIn; + pol constant DoConnect; + + pol muxOut = connected*(s1 - HIn) + HIn; + DoConnect*(s2-muxOut) = 0; + + pol constant ConnS1, ConnS2, ConnBits2FieldBit; + + {s1, s2, Bits2FieldSha256.bit} connect {ConnS1, ConnS2, ConnBits2FieldBit} + diff --git a/test/pil2/zkevm-etrog/poseidong.pil b/test/pil2/zkevm-etrog/poseidong.pil new file mode 100644 index 0000000..dbb9e3b --- /dev/null +++ b/test/pil2/zkevm-etrog/poseidong.pil @@ -0,0 +1,120 @@ +const int POSEIDON_G_ID = 11; + +subproof PoseidonG(2**23) { + + const int N_ROUNDS_F = 8; + const int N_ROUNDS_P = 22; + const int N_ROUNDS = N_ROUNDS_F + N_ROUNDS_P; + const int MAX_HASHES = N \\ N_ROUNDS; + + col fixed LAST = [[0:N_ROUNDS,1]...,1]; + col fixed LATCH = [[1,0:N_ROUNDS]:MAX_HASHES,0...]; + col fixed LASTBLOCK = [0:N_ROUNDS,1]...; + col fixed PARTIAL = [0:(N_ROUNDS_F/2),1:N_ROUNDS_F,0:(N_ROUNDS_F/2)+1]...; + col fixed C[12]; + + col witness value[8], hashType, cap[3]; + col witness hash[4]; + col witness result; + + const expr a[12]; + int index = 0; + for (const expr c in [...value, hashType, cap]) { + a[index] = c + C[index]; + (value[index]' - c[index]) * (1 - LAST) === 0; + ++index; + } + + const int M_CIRC[12] = [17, 15, 41, 16, 2, 28, 13, 13, 39, 18, 34, 20]; + const int M_DIAG[12] = [8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + + const expr x2[12], x4[12], x6[12], x7[12], b[12], c[12]; + for (int i = 0; i < 12; i += 1) { + x2[i] = a[i] * a[i]; + x4[i] = x2[i] * x2[i]; + x6[i] = x2[i] * x4[i]; + x7[i] = x6[i] * a[i]; + if (i == 0) b[0] = x7[0]; + else b[i] = PARTIAL * (a[i] - x7[i]) + x7[i]; + } + + for (int i=0; i < 12; i += 1) { + expr ce; + for (int j=0; j<12; ++j) { + ce += (M_CIRC[(12 - i + j) % 12] + (i == j ? M_DIAG[i] : 0)) * b[j]; + } + c[i] = ce; + } + + for (int i = 0; i < 4; i += 1) { + (hash[i] - value[i]) * LASTBLOCK === 0; + (hash[i] - hash[i]') * (1-LAST) === 0; + if (i > 2) continue; + } + result * (1 - result) === 0; + result * (1 - LATCH) === 0; + + C[0] = [0xb585f766f2144405, 0x7746a55f43921ad7, 0xb2fb0d31cee799b4, 0x0f6760a4803427d7, 0xe10d666650f4e012, 0x8cae14cb07d09bf1, + 0xd438539c95f63e9f, 0xef781c7ce35b4c3d, 0xcdc4a239b0c44426, 0x277fa208bf337bff, 0xe17653a29da578a1, 0xc54302f225db2c76 ]...; + C[1] = [0x86287821f722c881, 0x59cd1a8a41c18e55, 0xc3b919ad495dc574, 0xa484c4c5ef6a0781, 0x308bbd23dc5416cc, 0x6e4a40c18f30c09c, + 0x9a2eedb70d8f8cfa, 0xe360c6e0ae486f38, 0xd5c7718fbfc647fb, 0xc35eae071903ff0b, 0x849c2656969c4be7, 0xc0572c8c08cbbbad ]...; + C[2] = [0xe9fa634a21de0082, 0xf56f6d48959a600d, 0xf7d713e806391165, 0x8297132b32825daf, 0xad6805e0e30b2c8a, 0xac51d9f5fcf8535e, + 0x502ad7dc18c2ad87, 0x57a1550c110b3041, 0x66bbd30e6ce0e583, 0x0da2abef589d644e, 0xf061274fdb150d61, 0x28b8ec3ae9c29633 ]...; + C[3] = [0x92a756e67e2b9413, 0x70e741ebfee96586, 0x019d5ee2af82ec1c, 0x6f6f2ed772466352, 0x7cf416cfe7e14ca1, 0x61df517b86a46439, + 0x85dc499b11d77b75, 0x4b959b48b9c10733, 0xe8be3e5da8043e57, 0xf5c0bc1de6da8699, 0x40b12cbf09ef74bf, 0xa637093ecb2ad631 ]...; + C[4] = [0x3cc3f892184df408, 0x2e479dc157bf31bb, 0x6f49de07a6234346, 0x213ce7bede378d7b, 0x5b0431345d4dea83, 0xa2de45780344d6a1, + 0x7103aaf94a7bf308, 0x5326fc0d97279301, 0xa9ceb74fec024747, 0x27f8ec88bb21b1a3, 0xfceb4fda1ded0893, 0xfac6ff1346a41675 ]...; + C[5] = [0x7131aa45268d7d8c, 0x9351036095630f9f, 0xad535b24afc26bfb, 0x4627f5c6993e44be, 0x645cf794b8f1cc58, 0x241c70ed0af61617, + 0xacb8e076647905f1, 0x3737e9db4c4f474d, 0xe7ea5e33e75fffb6, 0x90dee49fc9bfc23a, 0xd1b1edf76bc09c92, 0x0b65481ba645c602 ]...; + C[6] = [0x99ad1aab0814283b, 0x438a7c91d416ca4d, 0xb60de3bcc5ea751c, 0xc99cab6aef6f58bc, 0x69a5ed92a72ee4ff, 0x5e7b329c1ed4ad71, + 0x5fc0ac0800144885, 0x32db829239774eca, 0x0ade699c5830f310, 0x7cc5583b10415f21, 0x85df9ed2e166d64f, 0x6604df4fee32bcb1 ]...; + C[7] = [0xeb84f608da56ef48, 0xda608834c40e603d, 0x8f97fe408061f183, 0xa93f485c96f37b89, 0x6704e8ee8f18d563, 0xcee3e9ac1e072119, + 0x510d0e65e2b470c1, 0xf6323f486b9038f0, 0x0b508cdeffa5ceef, 0xf2417089e4fb3cbd, 0x60e75c2890d15730, 0xa6217d8bf660f29c ]...; + C[8] = [0x7159cd30c3ac118e, 0x839b4e8fafead540, 0x0d3f3e5e82920adc, 0x8f7d83bddee7bba8, 0x780f2243ea071d06, 0xeb915845f3de1634, + 0xd19e120d26b6f386, 0x016ee53a7e5fecc6, 0xcb5fd54e7933e477, 0xacb8417879fd449f, 0x9c22190be7f74732, 0x5d693c1ba3ba3621 ]...; + C[9] = [0xdcef0797c2b69ec7, 0x3d639263da827b13, 0xe273fd971bc8d0e7, 0x418f02702d227ed5, 0x8c25fda3b503038c, 0x2cbaed4daec8c07c, + 0x5f58e6afcdd6ddc2, 0x284650ac5e1b0eba, 0x635b337ee819dab5, 0x9f9a036ed4f2d49f, 0xb93e260cae5c170e, 0xb0a7eae879ddb76d ]...; + C[10] = [0xd0762cbc8ca6570c, 0x34c6efb812b04bf5, 0x40bf0ab5fa14c112, 0xb6b570fc7c5740d3, 0x5a27b9002de33454, 0xb1a5b165b6d2b2d2, + 0x8722e0ace9d1be22, 0x788ee3b37e5680fb, 0x14a726661551e284, 0x98b7672f9ef3b419, 0xbb93ae776bb30e3a, 0x28fd3b046380f850 ]...; + C[11] = [0x30a4680593258387, 0x337dc00c61bd9ce1, 0xd5eca244c7a4ff1d, 0x7762638264d279bd, 0xc1e434bedeefd767, 0x0299351a53b8ec22, + 0xb2d456e4ad251b80, 0x3e9ed1fda49cea0b, 0x2972a92ba450bed8, 0x20216dd77be493de, 0xadffe8cf28449ec6, 0x1c4dbb1c4c27d243 ]...; + C[12] = [0x15a16a8a8322d458, 0x388a128b7fd9a609, 0x2300e5d6baedf0fb, 0x2f63aa8647e15104, 0xf1c36ce86ecec269, 0x27181125183970c9, + 0xe584029370dca96d, 0x4d9bbc3e02f1cfb2, 0xea35bc29692af6f8, 0x18e21b4beabb4137, 0x1e3b9fc625b554f4, 0x25d64362697828fd ]...; + C[13] = [0x5a3f1bb1c53a9645, 0xdb7f023869fb8d38, 0xb462065911d4e1fc, 0x49c24ae4437d8030, 0xd793862c112b0566, 0xaadd1106730d8feb, + 0xc43b6e0e97b0d568, 0xe29024c18ee6fca2, 0x5e50c27535b88c66, 0x10383f20a4ff9a87, 0x38e8ee9d71a45af8, 0xdd5118375bf1a9b9 ]...; + C[14] = [0x775005982d74d7f7, 0x86ab99b4dde6c8b0, 0xb1204f603f51c080, 0xef61ac8470250ecf, 0x1bbcd90f132c603f, 0x0cd1dabd964db557, + 0x11a3ae5beb9d1ec9, 0xf755bfeea585d11d, 0xa3b83250268ea4d7, 0x516306f4927c93af, 0xddb4ac49c9efa1da, 0x64bb6dec369d4418 ]...; + C[15] = [0xf9cc95c22b4c1fcc, 0x08d37f755f4ae9f6, 0xeec49b613478675b, 0xf143933aed25e0b0, 0xe4c5dd8255dfc622, 0xe7ad7756f193198e, + 0x92c2318b87fff9cb, 0x739c25f8fd73596d, 0x5636cac9f16dfed0, 0xdd8f909a938e0172, 0xc6401fe115063f5b, 0x8ad97b33f1ac1455 ]...; + C[16] = [0x0c49366bb25e8513, 0x0784d3d2f1698309, 0x530fb67ea1809a81, 0x410492299bb01f49, 0x139542347424b9ac, 0x9cb0bd5ea1a1115e, + 0x02e3f615c38f49a1, 0x985d4f4a9c5291ef, 0x775b9feafdcd26e7, 0x304265a6384f0f2d, 0x593664c39773012c, 0x4f0a2e5fb028f2ce ]...; + C[17] = [0xdd611f1000c17442, 0xd8185f9adfea4fd0, 0xef87139ca9a3ab1e, 0x3ba71336c34ee133, 0x7d3a455d56b70238, 0x660d32e130182684, + 0x297a863f48cd1f43, 0x90e0a736a751ebb7, 0x549f80ce550c4fd3, 0x0f73b2922f38bd64, 0x16bf1f73fb7a9c3f, 0x6d1f5a59005bec17 ]...; + C[18] = [0x02ff876fa5ef97c4, 0xc5cb72a2a51159b0, 0x8470f39d2d5c900e, 0x25abb3f1d39fcb76, 0x23eb8cc9b372442f, 0xd687ba55c64f6364, + 0xda8d9e90fd8ff158, 0xe3cbdc7d2fe45ea7, 0xb9a8c9b3aee52297, 0xc0d28a5c10960bd3, 0x45d7ac9b68f71a34, 0xeeb76e397069e804 ]...; + C[19] = [0x3d06c8bd1514e2d9, 0x9c9c98207cb10767, 0x65700b51aedfb5ef, 0x911f451539869408, 0x7ae6849fbc3a0ec6, 0x3bb340eba06afe7e, + 0xb46e9d8b682ea65e, 0x8dcf22f9a3b34356, 0x77bdaeda586257a7, 0xf19e400a5104d20d, 0xc368a348e46d950f, 0x9ef1cd60e679f284 ]...; + C[20] = [0xe89cd854d5d01d33, 0x5cd377dc8bb882a2, 0xa7b0fb7883eee860, 0x7684403ec392950d, 0x5fa3f06f4fed3b52, 0x8df57ac11bc04831, + 0x2db01efa1e1e1897, 0x54846de4aadb9ca2, 0xba6745385893c784, 0x541d496344d2c75b, 0xe909678474e687fe, 0xdfe89923f6c9c2ff ]...; + C[21] = [0xece5a71e0cfedc75, 0x5ff98fd5d51fe610, 0x83e8941918964615, 0x5922040b47f150c1, 0xf97d750e3dd94521, 0x5080d4c2b86f56d7, + 0xa7de115b56c78d70, 0x6a9242ac87538194, 0xf7856ef7f9173e44, 0x2265fc92feb0dc09, 0x17dfc8e4f7ba8a57, 0x9001a64209f21db8 ]...; + C[22] = [0x90004c1371b893c5, 0xb932b7cf752e5545, 0xa0b1df81b6fe59fc, 0x8ef1dd26770af2c2, 0x0541a4f9cfbeed35, 0x9e61106178bfc530, + 0xb3767e80935d8af2, 0x0098d5782065af06, 0x31d191cd5c1466c7, 0x410fefafa319ac9d, 0xbdf8f242e316c4ab, 0x9e8cd55b57637ed0 ]...; + C[23] = [0xde122bebe9a39368, 0x4d001fd58f002526, 0xca6637000eb4a9f8, 0x2f2339d624f91f78, 0x6d1a7918c80df518, 0xdf9a4939342308e9, + 0xebc2151ee6c8398c, 0x03cc2ba8a1116515, 0xd341d037e840cf83, 0x387cb5d25af4afcc, 0xbba2515f22909e87, 0x7248fe7705f38e47 ]...; + C[24] = [0x4d61e56a525d225a, 0x262e963c8da05d3d, 0x59e89b094d220ec2, 0x055d5b52b78b9c5e, 0x82b27eb33514ef99, 0xd30094ca96b7ce7b, + 0xcf5cb381cd0a1535, 0xfeed4db6919e5a7c, 0x41703f53753be59f, 0x5eeea940fcde8b6f, 0x4cd1f1b175100206, 0x4a20358574454ec0 ]...; + C[25] = [0x1478d361dbbf9fac, 0x6f02dc07d141875c, 0x296a202ed8e556a2, 0x2afd67999bf32ee5, 0x7acfd96efa95491d, 0x6798ba0c0abb2c6d, + 0x34c6f57b26c92122, 0x5736e1bad206b5de, 0x20057d2a0056521b, 0x3dea5bd5d0578bd7, 0x16e50d897d4634ac, 0x29bff3ecb9b7a6e3 ]...; + C[26] = [0x475cd3205a3bdcde, 0x18a42105c31b7e88, 0x023e7414af663068, 0x15147108121967d7, 0xe4a3dff1d7d6fef9, 0x01a8d1a588085737, + 0x11b4c74eda62beef, 0xe587cc0d69a73346, 0x1ff7327017aa2a6e, 0x594e29c42473d06b, 0xf6f31db1899b12d5, 0xc02ac5e47312d3ca ]...; + C[27] = [0xe70201e960cb78b8, 0x6f90ff3b6a65f108, 0x42747a7245e7fa84, 0xd1f507e43ab749b2, 0x1c86d265f15750cd, 0x3996ce73dd832c1c, + 0x8e7fba02983224bd, 0xba0dec7103255dd4, 0x9e9cbd781628fc5b, 0xdae8645996edd6a5, 0xdebe0853b1a1d378, 0xa49229d24d014343 ]...; + C[28] = [0x7be5b9ffda905e1c, 0xa3c95eaec244aa30, 0x0230bca8f4df0544, 0x4135c2bebfe148c6, 0x166fc0cc438a3c72, 0x3762b59a8ae83efa, + 0xe8928a4c89114750, 0x2a440b51a4945ee5, 0x80cefd2b7d99ff83, 0xbb9879c6e61fd62a, 0x6e7c8f1a84265034, 0x164bb2de1bbeddc8 ]...; + C[29] = [0xf3c12fe54d5c653b, 0x40b9e922ed9771e2, 0x551f5b0fbe7b1840, 0x25032aa7c4cb1811, 0xaaed34074b164346, 0x8ffd96bbf9c9c81d, + 0x70fc91eb5937085c, 0x7f795e2a5f915440, 0x4543d9df5476d3cb, 0xf172d73e004fc90d, 0xdfd1c4febcc81238, 0xbc8dfb627fe558fc ]...; + C[30] = [0...]; + + multiset_assumes(POSEIDON_G_ID, result, [...value, hashType, ...cap, ...hash]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/rom.pil b/test/pil2/zkevm-etrog/rom.pil new file mode 100644 index 0000000..a81480d --- /dev/null +++ b/test/pil2/zkevm-etrog/rom.pil @@ -0,0 +1,43 @@ +namespace Rom(%N); + + pol constant CONST0; + pol constant CONST1; + pol constant CONST2; + pol constant CONST3; + pol constant CONST4; + pol constant CONST5; + pol constant CONST6; + pol constant CONST7; + pol constant offset; + + pol constant inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR ,inRCX; + pol constant inCntArith, inCntBinary, inCntKeccakF, inCntMemAlign, inCntPaddingPG, inCntPoseidonG, inCntSha256F; + pol constant incStack; + pol constant binOpcode; + pol constant jmpAddr, elseAddr; + + pol constant line; + + pol constant operations; + + /* + comment genereated with: + node tools/pil_pol_table/bits_compose.js "arithEq0,arithEq1,arithEq2,assert,bin,hashK,hashKDigest,hashKLen,hashP,hashPDigest,hashPLen,ind,indRR,isMem,isStack,JMP,JMPC,JMPN,memAlignRD,memAlignWR,memAlignWR8,mOp,mWR,repeat,setA,setB,setC,setCTX,setD,setE,setGAS,setHASHPOS,setPC,setRCX,setRR,setSP,setSR,sRD,sWR,useCTX,useJmpAddr,JMPZ,call,return,hashK1,hashP1,useElseAddr,arithEq3,arithEq4,arithEq5, hashS, hashSDigest, hashSLen, hashS1" + + operations = + 2**0 * arithEq0 + 2**1 * arithEq1 + 2**2 * arithEq2 + 2**3 * assert + + 2**4 * bin + 2**5 * hashK + 2**6 * hashKDigest + 2**7 * hashKLen + + 2**8 * hashP + 2**9 * hashPDigest + 2**10 * hashPLen + 2**11 * ind + + 2**12 * indRR + 2**13 * isMem + 2**14 * isStack + 2**15 * JMP + + 2**16 * JMPC + 2**17 * JMPN + 2**18 * memAlignRD + 2**19 * memAlignWR + + 2**20 * memAlignWR8 + 2**21 * mOp + 2**22 * mWR + 2**23 * repeat + + 2**24 * setA + 2**25 * setB + 2**26 * setC + 2**27 * setCTX + + 2**28 * setD + 2**29 * setE + 2**30 * setGAS + 2**31 * setHASHPOS + + 2**32 * setPC + 2**33 * setRCX + 2**34 * setRR + 2**35 * setSP + + 2**36 * setSR + 2**37 * sRD + 2**38 * sWR + 2**39 * useCTX + + 2**40 * useJmpAddr + 2**41 * JMPZ + 2**42 * call + 2**43 * return + + 2**44 * hashK1 + 2**45 * hashP1 + 2**46 * useElseAddr + 2**47 * arithEq3 + + 2**48 * arithEq4 + 2**49 * arithEq5 + 2**50 * hashS + 2**51 * hashSDigest + + 2**52 * hashSLen + 2**53 * hashS1 + + */ diff --git a/test/pil2/zkevm-etrog/sha256f.pil b/test/pil2/zkevm-etrog/sha256f.pil new file mode 100644 index 0000000..d9416b3 --- /dev/null +++ b/test/pil2/zkevm-etrog/sha256f.pil @@ -0,0 +1,27 @@ +include "global.pil"; + +namespace Sha256F(%N); + + pol commit input[3], output; + pol constant kGateType, kA, kB, kC, kOut, kCarryOut; + pol constant Conn[4]; + // 0 -> XOR + // 1 -> CH + // 2 -> MAJ + // 3 -> ADD + pol constant GATE_TYPE; + pol constant CARRY_ENABLED; // 1 WHEN ADD + + // GATE_TYPE => script gate sequence + // kGateType => type of gate, used to define all combinations of valid values. + // input[], output are the witness, gate used in each row defined by GATE_TYPE. + { GATE_TYPE, input[0], input[1], input[2], output, input[2]' * CARRY_ENABLED } in { kGateType, kA, kB, kC, kOut, kCarryOut }; + + // wires: conections between gates + {input[0], input[1], input[2], output} connect {Conn[0], Conn[1], Conn[2], Conn[3]}; + + // signal constant 0 (conect to use constant 0 in gate) + Global.L1 * input[0] = 0; + + // signal constant 1 => 1 x 7 = 1111111 (conect to use constant 1 in gate) + Global.L1 * (2**7-1-input[1]) = 0; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/storage.pil b/test/pil2/zkevm-etrog/storage.pil new file mode 100644 index 0000000..ae8cb01 --- /dev/null +++ b/test/pil2/zkevm-etrog/storage.pil @@ -0,0 +1,202 @@ +include "poseidong.pil"; +include "climb_key.pil"; + +const int STORAGE_ID 10; + +subproof Storage(2**23) { + + col witness free0, free1, free2, free3; + + // Registers + col witness hashLeft[4]; + col witness hashRight[4]; + col witness oldRoot[4]; + col witness newRoot[4]; + col witness valueLow[4]; + col witness valueHigh[4]; + col witness siblingValueHash[4]; + col witness rkey[4]; + col witness siblingRkey[4]; + col witness rkeyBit; + col witness level; + col witness pc; + + col witness inOldRoot; + col witness inNewRoot; + col witness inValueLow; + col witness inValueHigh; + col witness inSiblingValueHash; + col witness inRkey; + col witness inRkeyBit; + col witness inSiblingRkey; + col witness inFree; + col witness inRotlVh; + col witness inLevel; + + col witness setHashLeft; + col witness setHashRight; + col witness setOldRoot; + col witness setNewRoot; + col witness setValueLow; + col witness setValueHigh; + col witness setSiblingValueHash; + col witness setRkey; + col witness setSiblingRkey; + col witness setRkeyBit; + col witness setLevel; + + col witness hash; + col witness hashType; + col witness latchSet; + col witness latchGet; + col witness climbRkey; + col witness climbSiblingRkey; + col witness climbBitN; + col witness jmpz; + col witness jmpnz; + col witness jmp; + col witness const0; + col witness jmpAddress; + + col witness incCounter; + incCounter' === incCounter * (1 - latchSet - latchGet - Global.L1) + hash; + + // We assume hash and latch never goes together + // We assume first instruction is not a latch nor a hash. + + // Selectors + + const expr op[4]; + const expr climbKey[4]; + for (int index = 0; index < 4; ++index) { + op[index] = (index == 0 ? 0 : (inLevel * level + inRkeyBit * rkeyBit + const0)) + + inOldRoot * oldRoot[index] + + inNewRoot * newRoot[index] + + inValueLow * valueLow[index] + + inValueHigh * valueHigh[index] + + inSiblingValueHash * siblingValueHash[index] + + inSiblingRkey * siblingRkey[index] + + inRkey * rkey[index] + + inFree * free[index] + + inRotlVh * valueHigh[(index + 3) % 4]; + + climbKey[index] = climbRkey * rkey[index] + climbSiblingRkey * siblingRkey[index]; + // Setters + + hashLeft[index]' === setHashLeft * (op[index] - hashLeft[index]) + hashLeft[index]; + hashRight[index]' === setHashRight * (op[index] - hashRight[index]) + hashRight[index]; + oldRoot[index]' === setOldRoot * (op[index] - oldRoot[index]) + oldRoot[index]; + newRoot[index]' === setNewRoot * (op[index] - newRoot[index]) + newRoot[index]; + valueLow[index]' === setValueLow * (op[index] - valueLow[index]) + valueLow[index]; + valueHigh[index]' === setValueHigh * (op[index] - valueHigh[index]) + valueHigh[index]; + siblingValueHash[index]' === setSiblingValueHash * (op[index] - siblingValueHash[index]) + siblingValueHash[index]; + rkey[index]' === setRkey * (op[index] - rkey[index]) + rkey[index]; + siblingRkey[index]' === setSiblingRkey * (op[index] - siblingRkey[index]) + siblingRkey[index]; + } + + rkeyBit' === setRkeyBit * (op0-rkeyBit) + rkeyBit; + rkeyBit * (1 - rkeyBit) === 0; + + level' === setLevel * (op0-level) + level; + + // Instruction that guarantees that op = hash(hl, hr); the poseidon SM will do the work; the result will be feeded by free + + multiset_assumes(POSEIDON_G_ID, hash, [ ...hashLeft, ...hashRight3, hashType, 0, 0, 0, ...op0]); +/* + } is PoseidonG.result3 { + PoseidonG.in0, + PoseidonG.in1, + PoseidonG.in2, + PoseidonG.in3, + PoseidonG.in4, + PoseidonG.in5, + PoseidonG.in6, + PoseidonG.in7, + PoseidonG.hashType, + PoseidonG.cap1, + PoseidonG.cap2, + PoseidonG.cap3, + PoseidonG.hash0, + PoseidonG.hash1, + PoseidonG.hash2, + PoseidonG.hash3}; +*/ + const expr climbKeyBit = climbBitN * (1 - rkeyBit) + (1 - climbBitN) * rkeyBit; + + multiset_assumes(CLIMB_KEY_ID, climbRkey + climbSiblingRkey, [...climbKey, level, climbKeyBit, ...op0]) + /* + climbRkey + climbSiblingRkey { + climbRkey * rkey0 + climbSiblingRkey * siblingRkey0, climbRkey * rkey1 + climbSiblingRkey * siblingRkey1, climbRkey * rkey2 + climbSiblingRkey * siblingRkey2, climbRkey * rkey3 + climbSiblingRkey * siblingRkey3, + level, climbKeyBit, + op0, op1, op2, op3 + } is ClimbKey.result { + ClimbKey.key0, ClimbKey.key1, ClimbKey.key2, ClimbKey.key3, + ClimbKey.level', ClimbKey.bit, + ClimbKey.key0', ClimbKey.key1', ClimbKey.key2', ClimbKey.key3' + };*/ + + + col witness op0inv; + + const expr opIsZero === 1 - op0 * op0inv; + opIsZero * op0 === 0; + + const expr doJump === jmp + jmpz * opIsZero + jmpnz * (1 - opIsZero); + pc' === doJump * (jmpAddress - pc - 1) + pc + 1; + + pc * Global.L1 === 0; + incCounter * Global.L1 === 0; + + // Last pc' must return to be pc = 0 in order to close the program loop + // Once the work is done, the rest of instructions must be: + // if op0 = $n-1 (last instruction of the program) then pc = 0 (jump to the beginning of the program) + + /* + code generated with: + node tools/pil_pol_table/bits_compose.js "hash,hashType,latchGet,latchSet,climbRkey,climbSiblingRkey,climbBitN,jmpz,jmp,setHashLeft,setHashRight,setLevel,setNewRoot,setOldRoot,setRkey,setRkeyBit,setSiblingRkey,setSiblingValueHash,setValueHigh,setValueLow,jmpnz,inFree,inNewRoot,inOldRoot,inRkey,inRkeyBit,inSiblingValueHash,inValueLow,inValueHigh,inRotlVh,inLevel" -b + */ + + const expr operation = + 2**0 * hash + 2**1 * hashType + 2**2 * latchGet + 2**3 * latchSet + + 2**4 * climbRkey + 2**5 * climbSiblingRkey + 2**6 * climbBitN + 2**7 * jmpz + + 2**8 * jmp + 2**9 * setHashLeft + 2**10 * setHashRight + 2**11 * setLevel + + 2**12 * setNewRoot + 2**13 * setOldRoot + 2**14 * setRkey + 2**15 * setRkeyBit + + 2**16 * setSiblingRkey + 2**17 * setSiblingValueHash + 2**18 * setValueHigh + 2**19 * setValueLow + + 2**20 * jmpnz + 2**21 * inFree + 2**22 * inNewRoot + 2**23 * inOldRoot + + 2**24 * inRkey + 2**25 * inRkeyBit + 2**26 * inSiblingValueHash + 2**27 * inValueLow + + 2**28 * inValueHigh + 2**29 * inRotlVh + 2**30 * inLevel; + + (1 - hash) * hash === 0; + (1 - hashType) * hashType === 0; + (1 - latchGet) * latchGet === 0; + (1 - latchSet) * latchSet === 0; + (1 - climbRkey) * climbRkey === 0; + (1 - climbSiblingRkey) * climbSiblingRkey === 0; + (1 - climbBitN) * climbBitN === 0; + (1 - jmpz) * jmpz === 0; + (1 - jmp) * jmp === 0; + (1 - setHashLeft) * setHashLeft === 0; + (1 - setHashRight) * setHashRight === 0; + (1 - setLevel) * setLevel === 0; + (1 - setNewRoot) * setNewRoot === 0; + (1 - setOldRoot) * setOldRoot === 0; + (1 - setRkey) * setRkey === 0; + (1 - setRkeyBit) * setRkeyBit === 0; + (1 - setSiblingRkey) * setSiblingRkey === 0; + (1 - setSiblingValueHash) * setSiblingValueHash === 0; + (1 - setValueHigh) * setValueHigh === 0; + (1 - setValueLow) * setValueLow === 0; + (1 - jmpnz) * jmpnz === 0; + (1 - inFree) * inFree === 0; + (1 - inNewRoot) * inNewRoot === 0; + (1 - inOldRoot) * inOldRoot === 0; + (1 - inRkey) * inRkey === 0; + (1 - inRkeyBit) * inRkeyBit === 0; + (1 - inSiblingValueHash) * inSiblingValueHash === 0; + (1 - inValueLow) * inValueLow === 0; + (1 - inValueHigh) * inValueHigh === 0; + (1 - inRotlVh) * inRotlVh === 0; + (1 - inLevel) * inLevel === 0; + + lookup_assumes(STORAGE_ROM_ID, 1, [operation, const0, jmpAddress, pc, inSiblingRkey]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/storage_rom.pil b/test/pil2/zkevm-etrog/storage_rom.pil new file mode 100644 index 0000000..7582c15 --- /dev/null +++ b/test/pil2/zkevm-etrog/storage_rom.pil @@ -0,0 +1,13 @@ +const int STORAGE_ROM_ID 10; + +subproof StorageRom(2**16) { + + col fixed OPERATION; + col fixed CONST0; + col fixed JMP_ADDRESS; + col fixed LINE; + col fixed IN_SIBLING_RKEY; + + lookup_proves(STORAGE_ROM_ID, 1, [OPERATION, CONST0, JMP_ADDRESS, LINE, IN_SIBLING_RKEY]); +} + From 11310d3ad31d95d83c2474546647b6e39ef9c634 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 30 Jan 2024 10:43:32 +0100 Subject: [PATCH 26/33] WIP zkevm-etrog --- build/pil_parser.js | 731 +++++----- src/assign.js | 11 +- src/debug.js | 7 + src/definition_items/expression_variable.js | 17 +- src/definition_items/int_variable.js | 3 +- src/definition_items/witness_col.js | 5 +- src/expression.js | 126 +- src/expression_class.js | 18 + src/expression_factory.js | 62 +- src/expression_items/expression_item.js | 18 +- src/expression_items/expression_list.js | 4 + src/expression_items/function_call.js | 32 +- src/expression_items/reference_item.js | 21 +- src/expression_items/witness_col.js | 3 +- src/expression_operations_info.js | 2 +- src/function.js | 43 +- src/indexable.js | 11 +- src/multi_array.js | 5 +- src/pil_parser.jison | 31 +- src/processor.js | 109 +- src/reference.js | 15 +- src/references.js | 27 +- src/sequence.js | 31 +- test/pil2/zkevm-etrog/binary.pil | 93 +- test/pil2/zkevm-etrog/binary_lib.pil | 118 ++ test/pil2/zkevm-etrog/binary_one_row.pil | 155 +++ test/pil2/zkevm-etrog/climb_key.pil | 198 +-- test/pil2/zkevm-etrog/climb_key_table.pil | 111 +- test/pil2/zkevm-etrog/main.pil | 1347 ++++++------------- test/pil2/zkevm-etrog/mem_align.pil | 11 +- test/pil2/zkevm-etrog/padding_pg.pil | 234 ++-- test/pil2/zkevm-etrog/range_32.pil | 9 + test/pil2/zkevm-etrog/storage_rom.pil | 2 +- tools/sm/sm_climb_key/compact.js | 70 + tools/sm/sm_climb_key/table.js | 99 ++ 35 files changed, 1939 insertions(+), 1840 deletions(-) create mode 100644 src/debug.js create mode 100644 src/expression_class.js create mode 100644 test/pil2/zkevm-etrog/binary_lib.pil create mode 100644 test/pil2/zkevm-etrog/binary_one_row.pil create mode 100644 test/pil2/zkevm-etrog/range_32.pil create mode 100644 tools/sm/sm_climb_key/compact.js create mode 100644 tools/sm/sm_climb_key/table.js diff --git a/build/pil_parser.js b/build/pil_parser.js index 5666f60..b73294b 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -72,14 +72,12 @@ } */ var pil_parser = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,20,25,32,56,57,62,63,71,72,73,74,75,78,79,80,81,83,84,138],$V1=[1,38],$V2=[1,32],$V3=[1,33],$V4=[1,22],$V5=[1,34],$V6=[1,35],$V7=[1,36],$V8=[1,31],$V9=[1,24],$Va=[1,25],$Vb=[1,37],$Vc=[1,28],$Vd=[1,29],$Ve=[1,26],$Vf=[1,27],$Vg=[1,23],$Vh=[1,46],$Vi=[1,48],$Vj=[1,49],$Vk=[27,69,96,144],$Vl=[2,217],$Vm=[1,51],$Vn=[1,52],$Vo=[1,53],$Vp=[1,57],$Vq=[1,58],$Vr=[1,60],$Vs=[1,59],$Vt=[6,8,20,25,31,32,56,57,62,63,71,72,73,74,75,78,79,80,81,83,84,108,109,138],$Vu=[1,67],$Vv=[1,74],$Vw=[1,73],$Vx=[1,75],$Vy=[1,72],$Vz=[1,80],$VA=[1,91],$VB=[1,120],$VC=[1,150],$VD=[1,143],$VE=[1,142],$VF=[1,119],$VG=[2,39],$VH=[1,115],$VI=[1,136],$VJ=[1,116],$VK=[1,159],$VL=[1,155],$VM=[1,156],$VN=[1,157],$VO=[1,127],$VP=[1,158],$VQ=[1,140],$VR=[1,125],$VS=[1,126],$VT=[1,144],$VU=[1,145],$VV=[1,146],$VW=[1,147],$VX=[1,148],$VY=[1,149],$VZ=[1,132],$V_=[1,133],$V$=[1,152],$V01=[1,134],$V11=[1,141],$V21=[1,128],$V31=[1,129],$V41=[1,130],$V51=[1,138],$V61=[1,154],$V71=[2,68],$V81=[1,178],$V91=[1,163],$Va1=[1,166],$Vb1=[1,167],$Vc1=[1,168],$Vd1=[1,169],$Ve1=[1,170],$Vf1=[1,171],$Vg1=[1,172],$Vh1=[1,173],$Vi1=[1,174],$Vj1=[1,175],$Vk1=[1,176],$Vl1=[1,177],$Vm1=[6,8,20,25,31,32,56,57,62,63,71,72,73,74,75,78,79,80,81,83,84,109,138],$Vn1=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$Vo1=[2,257],$Vp1=[1,191],$Vq1=[1,192],$Vr1=[6,8,20,25,31,32,52,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,128,138],$Vs1=[6,8,20,25,31,32,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,138],$Vt1=[2,347],$Vu1=[2,57],$Vv1=[1,196],$Vw1=[1,197],$Vx1=[2,196],$Vy1=[6,8,20,25,31,32,54,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,128,138],$Vz1=[2,193],$VA1=[1,200],$VB1=[6,8,20,25,26,29,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$VC1=[1,219],$VD1=[1,222],$VE1=[1,223],$VF1=[1,224],$VG1=[1,225],$VH1=[1,226],$VI1=[20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],$VJ1=[1,233],$VK1=[8,31,109],$VL1=[1,241],$VM1=[1,235],$VN1=[1,236],$VO1=[1,237],$VP1=[1,238],$VQ1=[1,239],$VR1=[1,240],$VS1=[1,242],$VT1=[1,243],$VU1=[1,244],$VV1=[1,245],$VW1=[1,246],$VX1=[1,247],$VY1=[1,248],$VZ1=[1,249],$V_1=[1,250],$V$1=[1,251],$V02=[1,252],$V12=[1,253],$V22=[1,254],$V32=[1,255],$V42=[1,256],$V52=[1,257],$V62=[8,20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,115,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],$V72=[1,267],$V82=[1,269],$V92=[2,310],$Va2=[1,273],$Vb2=[1,274],$Vc2=[1,276],$Vd2=[1,277],$Ve2=[1,278],$Vf2=[1,279],$Vg2=[1,283],$Vh2=[1,282],$Vi2=[1,284],$Vj2=[1,286],$Vk2=[1,288],$Vl2=[1,302],$Vm2=[1,303],$Vn2=[1,301],$Vo2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$Vp2=[2,339],$Vq2=[1,310],$Vr2=[1,309],$Vs2=[1,312],$Vt2=[1,315],$Vu2=[1,318],$Vv2=[1,321],$Vw2=[6,8,20,25,31,32,47,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$Vx2=[49,65],$Vy2=[6,8,20,25,27,29,31,32,49,52,54,56,57,59,62,63,65,66,69,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$Vz2=[1,347],$VA2=[1,356],$VB2=[1,357],$VC2=[54,65],$VD2=[1,379],$VE2=[49,54,65],$VF2=[8,20,22,25,27,29,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,122,124,130,138,142,143,144,155,171,172,173,179,181],$VG2=[1,413],$VH2=[1,417],$VI2=[1,418],$VJ2=[1,423],$VK2=[1,424],$VL2=[27,32,47,63,69,71,72,73,75,79,96,122,124,142,143,144,171,172,173,179,181],$VM2=[1,427],$VN2=[2,244],$VO2=[1,458],$VP2=[1,489],$VQ2=[6,8,20,25,26,29,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,152,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$VR2=[6,8,20,25,31,32,52,54,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,128,138],$VS2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168],$VT2=[6,8,20,25,29,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$VU2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,109,119,138,147,148,163,164,168],$VV2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,109,119,138,147,148,164,168],$VW2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173],$VX2=[6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177],$VY2=[1,506],$VZ2=[31,65],$V_2=[1,509],$V$2=[31,54,65],$V03=[6,8,20,25,29,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$V13=[1,518],$V23=[1,520],$V33=[2,42],$V43=[8,108],$V53=[1,546],$V63=[1,591],$V73=[1,592],$V83=[1,593],$V93=[54,65,66],$Va3=[2,243],$Vb3=[1,595],$Vc3=[8,31],$Vd3=[6,8,20,25,31,32,47,49,52,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,122,124,128,132,133,134,138,147,148,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,181],$Ve3=[6,8,20,25,31,32,49,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,138],$Vf3=[54,59,65,66],$Vg3=[6,8,20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,115,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],$Vh3=[1,680],$Vi3=[1,687],$Vj3=[1,688],$Vk3=[1,721],$Vl3=[59,65],$Vm3=[31,117,120]; -var parser = {trace: function trace () { - Jison.print.apply(null, arguments); - }, +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,20,21,26,33,57,58,63,64,72,73,74,75,76,79,80,81,82,84,85,139],$V1=[1,39],$V2=[1,33],$V3=[1,34],$V4=[1,23],$V5=[1,35],$V6=[1,36],$V7=[1,37],$V8=[1,32],$V9=[1,25],$Va=[1,26],$Vb=[1,38],$Vc=[1,29],$Vd=[1,30],$Ve=[1,27],$Vf=[1,28],$Vg=[1,24],$Vh=[1,47],$Vi=[1,49],$Vj=[1,50],$Vk=[28,70,97,145],$Vl=[2,219],$Vm=[1,52],$Vn=[1,53],$Vo=[1,54],$Vp=[1,58],$Vq=[1,59],$Vr=[1,61],$Vs=[1,60],$Vt=[6,8,20,21,26,32,33,57,58,63,64,72,73,74,75,76,79,80,81,82,84,85,109,110,139],$Vu=[1,68],$Vv=[1,75],$Vw=[1,74],$Vx=[1,76],$Vy=[1,73],$Vz=[1,81],$VA=[1,92],$VB=[1,121],$VC=[1,151],$VD=[1,152],$VE=[1,144],$VF=[1,143],$VG=[1,120],$VH=[2,40],$VI=[1,116],$VJ=[1,137],$VK=[1,117],$VL=[1,161],$VM=[1,157],$VN=[1,158],$VO=[1,159],$VP=[1,128],$VQ=[1,160],$VR=[1,141],$VS=[1,126],$VT=[1,127],$VU=[1,145],$VV=[1,146],$VW=[1,147],$VX=[1,148],$VY=[1,149],$VZ=[1,150],$V_=[1,133],$V$=[1,134],$V01=[1,154],$V11=[1,135],$V21=[1,142],$V31=[1,129],$V41=[1,130],$V51=[1,131],$V61=[1,139],$V71=[1,156],$V81=[2,69],$V91=[1,180],$Va1=[1,165],$Vb1=[1,168],$Vc1=[1,169],$Vd1=[1,170],$Ve1=[1,171],$Vf1=[1,172],$Vg1=[1,173],$Vh1=[1,174],$Vi1=[1,175],$Vj1=[1,176],$Vk1=[1,177],$Vl1=[1,178],$Vm1=[1,179],$Vn1=[6,8,20,21,26,32,33,57,58,63,64,72,73,74,75,76,79,80,81,82,84,85,110,139],$Vo1=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Vp1=[2,259],$Vq1=[1,193],$Vr1=[1,194],$Vs1=[6,8,20,21,26,32,33,53,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,129,139],$Vt1=[6,8,20,21,26,32,33,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],$Vu1=[2,353],$Vv1=[2,58],$Vw1=[1,198],$Vx1=[1,199],$Vy1=[2,198],$Vz1=[6,8,20,21,26,32,33,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,129,139],$VA1=[2,195],$VB1=[1,202],$VC1=[6,8,20,21,26,27,30,32,33,48,50,53,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,123,125,129,133,134,135,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,182],$VD1=[1,221],$VE1=[1,224],$VF1=[1,225],$VG1=[1,226],$VH1=[1,227],$VI1=[1,228],$VJ1=[20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],$VK1=[1,235],$VL1=[8,32,110],$VM1=[1,243],$VN1=[1,237],$VO1=[1,238],$VP1=[1,239],$VQ1=[1,240],$VR1=[1,241],$VS1=[1,242],$VT1=[1,244],$VU1=[1,245],$VV1=[1,246],$VW1=[1,247],$VX1=[1,248],$VY1=[1,249],$VZ1=[1,250],$V_1=[1,251],$V$1=[1,252],$V02=[1,253],$V12=[1,254],$V22=[1,255],$V32=[1,256],$V42=[1,257],$V52=[1,258],$V62=[1,259],$V72=[8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],$V82=[1,269],$V92=[1,271],$Va2=[2,312],$Vb2=[1,275],$Vc2=[1,276],$Vd2=[1,278],$Ve2=[1,279],$Vf2=[1,280],$Vg2=[1,281],$Vh2=[1,285],$Vi2=[1,284],$Vj2=[1,286],$Vk2=[1,288],$Vl2=[1,290],$Vm2=[1,304],$Vn2=[1,305],$Vo2=[1,303],$Vp2=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,123,125,129,133,134,135,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Vq2=[2,341],$Vr2=[1,312],$Vs2=[1,311],$Vt2=[1,314],$Vu2=[1,317],$Vv2=[1,320],$Vw2=[1,323],$Vx2=[6,8,20,21,26,32,33,48,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,123,125,129,133,134,135,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,182],$Vy2=[50,66],$Vz2=[6,8,20,21,26,28,30,32,33,50,53,55,57,58,60,63,64,66,67,70,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$VA2=[1,349],$VB2=[1,358],$VC2=[1,359],$VD2=[55,66],$VE2=[1,381],$VF2=[50,55,66],$VG2=[8,20,21,23,26,28,30,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,123,125,131,139,143,144,145,156,172,173,174,180,182],$VH2=[1,415],$VI2=[1,419],$VJ2=[1,420],$VK2=[1,425],$VL2=[1,426],$VM2=[28,33,48,64,70,72,73,74,76,80,97,123,125,143,144,145,172,173,174,180,182],$VN2=[1,429],$VO2=[2,246],$VP2=[1,460],$VQ2=[1,475],$VR2=[1,493],$VS2=[6,8,20,21,26,27,30,32,33,48,50,53,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,123,125,129,133,134,135,139,148,149,153,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,182],$VT2=[6,8,20,21,26,32,33,53,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,129,139],$VU2=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169],$VV2=[6,8,20,21,26,30,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$VW2=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149,164,165,169],$VX2=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149,165,169],$VY2=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174],$VZ2=[6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178],$V_2=[1,510],$V$2=[32,66],$V03=[1,513],$V13=[32,55,66],$V23=[6,8,20,21,26,30,32,33,48,50,53,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$V33=[1,522],$V43=[1,524],$V53=[2,43],$V63=[8,109],$V73=[1,550],$V83=[1,597],$V93=[1,598],$Va3=[1,599],$Vb3=[55,66,67],$Vc3=[2,245],$Vd3=[1,601],$Ve3=[8,32],$Vf3=[6,8,20,21,26,32,33,48,50,53,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,123,125,129,133,134,135,139,148,149,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,182],$Vg3=[6,8,20,21,26,32,33,50,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],$Vh3=[55,60,66,67],$Vi3=[6,8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],$Vj3=[1,687],$Vk3=[1,694],$Vl3=[1,695],$Vm3=[1,728],$Vn3=[60,66],$Vo3=[32,118,121]; +var parser = {trace: function trace () { }, yy: {}, -symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"variable_declaration":19,"DEBUGGER":20,"use_directive":21,"USE":22,"name_reference":23,"no_closed_container_definition":24,"CONTAINER":25,"ALIAS":26,"IDENTIFIER":27,"closed_container_definition":28,"{":29,"declare_block":30,"}":31,"PROOF":32,"statement_block":33,"non_delimited_statement":34,"statement_closed":35,"lcs":36,"statement_no_closed":37,"statement_list":38,"statement_list_closed":39,"declare_list":40,"when_boundary":41,"FIRST":42,"LAST":43,"FRAME":44,"codeblock_closed":45,"WHEN":46,"(":47,"expression":48,")":49,"HINT":50,"data_object":51,"[":52,"data_array":53,"]":54,"function":55,"FUNCTION":56,"PRIVATE":57,"arguments":58,":":59,"return_type_list":60,"return_type":61,"FINAL":62,"SUBPROOF":63,"arguments_list":64,",":65,"DOTS_FILL":66,"argument":67,"basic_type":68,"REFERENCE":69,"type_array":70,"INT":71,"FE":72,"EXPR":73,"CONST":74,"COL":75,"WITNESS":76,"FIXED":77,"CHALLENGE":78,"T_STRING":79,"PROOF_VALUE":80,"SUBPROOF_VALUE":81,"AIR_VALUE":82,"PUBLIC":83,"PUBLIC_TABLE":84,"declare_item":85,"codeblock_no_closed":86,"===":87,"delayed_function_call":88,"constant_definition":89,"data_value":90,"function_call":91,"name_optional_index":92,"multiple_expression_list":93,"delayed_function_event":94,"defined_scopes":95,"AIR":96,"ON":97,"variable_assignment":98,"variable_multiple_assignment":99,"return_statement":100,"CONTINUE":101,"BREAK":102,"in_expression":103,"expression_list":104,"FOR":105,"for_init":106,"variable_assignment_list":107,"IN":108,"WHILE":109,"DO":110,"ONCE":111,"SWITCH":112,"case_body":113,"IF":114,"ELSE":115,"case_list":116,"DEFAULT":117,"case_value":118,"DOTS_RANGE":119,"CASE":120,"for_assignation":121,"INC":122,"name_id":123,"DEC":124,"variable_type_declaration":125,"variable_declaration_list":126,"variable_declaration_item":127,"=":128,"variable_declaration_array":129,"RETURN":130,"assign_operation":131,"+=":132,"-=":133,"*=":134,"left_variable_multiple_assignment_list":135,"left_variable_multiple_assignment":136,"sequence_definition":137,"INCLUDE":138,"flexible_string":139,"stage_definition":140,"STAGE":141,"NUMBER":142,"STRING":143,"TEMPLATE_STRING":144,"sequence_list":145,"sequence":146,"DOTS_ARITH_SEQ":147,"DOTS_GEOM_SEQ":148,"declaration_array":149,"col_declaration_item":150,"col_declaration_ident":151,".":152,"col_declaration_list":153,"AGGREGATE":154,"CONSTANT":155,"EQ":156,"NE":157,"LT":158,"GT":159,"LE":160,"GE":161,"IS":162,"AND":163,"?":164,"B_AND":165,"B_OR":166,"B_XOR":167,"OR":168,"SHL":169,"SHR":170,"!":171,"+":172,"-":173,"*":174,"%":175,"/":176,"\\\\":177,"POW":178,"POSITIONAL_PARAM":179,"casting":180,"'":181,"array_index":182,"name_reference_right":183,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"EOF",8:"CS",20:"DEBUGGER",22:"USE",25:"CONTAINER",26:"ALIAS",27:"IDENTIFIER",29:"{",31:"}",32:"PROOF",42:"FIRST",43:"LAST",44:"FRAME",46:"WHEN",47:"(",49:")",50:"HINT",52:"[",54:"]",56:"FUNCTION",57:"PRIVATE",59:":",62:"FINAL",63:"SUBPROOF",65:",",66:"DOTS_FILL",69:"REFERENCE",71:"INT",72:"FE",73:"EXPR",74:"CONST",75:"COL",76:"WITNESS",77:"FIXED",78:"CHALLENGE",79:"T_STRING",80:"PROOF_VALUE",81:"SUBPROOF_VALUE",82:"AIR_VALUE",83:"PUBLIC",84:"PUBLIC_TABLE",87:"===",96:"AIR",97:"ON",101:"CONTINUE",102:"BREAK",105:"FOR",108:"IN",109:"WHILE",110:"DO",111:"ONCE",112:"SWITCH",114:"IF",115:"ELSE",117:"DEFAULT",119:"DOTS_RANGE",120:"CASE",122:"INC",124:"DEC",128:"=",130:"RETURN",132:"+=",133:"-=",134:"*=",138:"INCLUDE",141:"STAGE",142:"NUMBER",143:"STRING",144:"TEMPLATE_STRING",147:"DOTS_ARITH_SEQ",148:"DOTS_GEOM_SEQ",152:".",154:"AGGREGATE",155:"CONSTANT",156:"EQ",157:"NE",158:"LT",159:"GT",160:"LE",161:"GE",162:"IS",163:"AND",164:"?",165:"B_AND",166:"B_OR",167:"B_XOR",168:"OR",169:"SHL",170:"SHR",171:"!",172:"+",173:"-",174:"*",175:"%",176:"/",177:"\\\\",178:"POW",179:"POSITIONAL_PARAM",181:"'"}, -productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[21,2],[24,2],[24,4],[28,5],[28,7],[10,4],[34,1],[34,2],[34,1],[34,2],[38,1],[38,2],[38,1],[39,2],[39,3],[39,3],[39,1],[39,2],[39,2],[39,1],[33,1],[33,0],[30,1],[30,2],[30,0],[36,2],[36,1],[41,1],[41,1],[41,1],[35,1],[35,5],[35,3],[35,4],[35,4],[35,3],[35,1],[35,1],[35,3],[55,2],[55,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[58,1],[58,3],[58,1],[58,0],[64,3],[64,1],[67,2],[67,2],[67,3],[67,3],[68,1],[68,1],[68,1],[68,2],[68,2],[68,2],[68,2],[68,2],[68,1],[68,1],[68,2],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[60,3],[60,1],[70,3],[70,2],[61,1],[61,2],[40,3],[40,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[37,1],[37,1],[37,1],[37,1],[37,3],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[90,1],[90,3],[90,3],[51,5],[51,3],[51,3],[51,1],[53,3],[53,1],[91,4],[94,1],[95,1],[95,1],[95,1],[88,7],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[103,1],[103,3],[45,9],[45,7],[45,5],[45,6],[45,6],[45,3],[45,5],[45,5],[45,7],[45,1],[113,3],[113,5],[118,3],[118,5],[118,1],[118,3],[116,5],[116,4],[121,1],[121,2],[121,2],[121,2],[121,2],[106,1],[106,1],[106,1],[106,1],[19,1],[19,2],[125,2],[125,2],[125,2],[125,2],[125,2],[125,4],[125,4],[125,4],[125,4],[125,4],[125,4],[125,8],[125,8],[125,8],[125,8],[125,8],[129,2],[129,3],[129,3],[129,4],[127,1],[127,2],[126,3],[126,1],[100,1],[100,2],[100,4],[131,1],[131,1],[131,1],[131,1],[135,3],[135,2],[135,1],[136,3],[136,5],[99,3],[99,5],[98,3],[98,3],[107,3],[107,1],[12,2],[140,4],[140,0],[139,1],[139,1],[137,3],[137,4],[137,5],[137,6],[145,3],[145,5],[145,5],[145,5],[145,9],[145,9],[145,4],[145,4],[145,6],[145,6],[145,1],[145,3],[146,3],[146,3],[146,5],[146,5],[146,7],[146,2],[146,3],[146,1],[93,0],[93,3],[93,5],[93,3],[93,1],[104,4],[104,3],[104,2],[104,1],[149,2],[149,3],[149,3],[149,4],[150,1],[150,2],[151,1],[151,1],[151,1],[151,3],[151,3],[153,3],[153,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[89,4],[89,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,5],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,3],[48,2],[48,2],[48,1],[48,2],[48,2],[48,2],[48,2],[48,1],[48,1],[48,3],[48,1],[48,1],[48,1],[180,4],[180,4],[180,4],[180,4],[180,4],[180,5],[180,5],[180,5],[180,5],[180,5],[123,2],[123,3],[123,5],[123,3],[123,2],[123,3],[123,5],[123,3],[123,1],[92,1],[92,2],[182,4],[182,3],[23,3],[23,3],[23,3],[23,1],[23,3],[23,1],[23,3],[183,3],[183,3],[183,1],[183,1]], +symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"variable_declaration":19,"DEBUGGER":20,"PRAGMA":21,"use_directive":22,"USE":23,"name_reference":24,"no_closed_container_definition":25,"CONTAINER":26,"ALIAS":27,"IDENTIFIER":28,"closed_container_definition":29,"{":30,"declare_block":31,"}":32,"PROOF":33,"statement_block":34,"non_delimited_statement":35,"statement_closed":36,"lcs":37,"statement_no_closed":38,"statement_list":39,"statement_list_closed":40,"declare_list":41,"when_boundary":42,"FIRST":43,"LAST":44,"FRAME":45,"codeblock_closed":46,"WHEN":47,"(":48,"expression":49,")":50,"HINT":51,"data_object":52,"[":53,"data_array":54,"]":55,"function":56,"FUNCTION":57,"PRIVATE":58,"arguments":59,":":60,"return_type_list":61,"return_type":62,"FINAL":63,"SUBPROOF":64,"arguments_list":65,",":66,"DOTS_FILL":67,"argument":68,"basic_type":69,"REFERENCE":70,"type_array":71,"INT":72,"FE":73,"EXPR":74,"CONST":75,"COL":76,"WITNESS":77,"FIXED":78,"CHALLENGE":79,"T_STRING":80,"PROOF_VALUE":81,"SUBPROOF_VALUE":82,"AIR_VALUE":83,"PUBLIC":84,"PUBLIC_TABLE":85,"declare_item":86,"codeblock_no_closed":87,"===":88,"delayed_function_call":89,"constant_definition":90,"data_value":91,"function_call":92,"name_optional_index":93,"multiple_expression_list":94,"delayed_function_event":95,"defined_scopes":96,"AIR":97,"ON":98,"variable_assignment":99,"variable_multiple_assignment":100,"return_statement":101,"CONTINUE":102,"BREAK":103,"in_expression":104,"expression_list":105,"FOR":106,"for_init":107,"variable_assignment_list":108,"IN":109,"WHILE":110,"DO":111,"ONCE":112,"SWITCH":113,"case_body":114,"IF":115,"ELSE":116,"case_list":117,"DEFAULT":118,"case_value":119,"DOTS_RANGE":120,"CASE":121,"for_assignation":122,"INC":123,"name_id":124,"DEC":125,"variable_type_declaration":126,"variable_declaration_list":127,"variable_declaration_item":128,"=":129,"variable_declaration_array":130,"RETURN":131,"assign_operation":132,"+=":133,"-=":134,"*=":135,"left_variable_multiple_assignment_list":136,"left_variable_multiple_assignment":137,"sequence_definition":138,"INCLUDE":139,"flexible_string":140,"stage_definition":141,"STAGE":142,"NUMBER":143,"STRING":144,"TEMPLATE_STRING":145,"sequence_list":146,"sequence":147,"DOTS_ARITH_SEQ":148,"DOTS_GEOM_SEQ":149,"declaration_array":150,"col_declaration_item":151,"col_declaration_ident":152,".":153,"col_declaration_list":154,"AGGREGATE":155,"CONSTANT":156,"EQ":157,"NE":158,"LT":159,"GT":160,"LE":161,"GE":162,"IS":163,"AND":164,"?":165,"B_AND":166,"B_OR":167,"B_XOR":168,"OR":169,"SHL":170,"SHR":171,"!":172,"+":173,"-":174,"*":175,"%":176,"/":177,"\\\\":178,"POW":179,"POSITIONAL_PARAM":180,"casting":181,"'":182,"array_index":183,"expression_index":184,"name_reference_right":185,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"EOF",8:"CS",20:"DEBUGGER",21:"PRAGMA",23:"USE",26:"CONTAINER",27:"ALIAS",28:"IDENTIFIER",30:"{",32:"}",33:"PROOF",43:"FIRST",44:"LAST",45:"FRAME",47:"WHEN",48:"(",50:")",51:"HINT",53:"[",55:"]",57:"FUNCTION",58:"PRIVATE",60:":",63:"FINAL",64:"SUBPROOF",66:",",67:"DOTS_FILL",70:"REFERENCE",72:"INT",73:"FE",74:"EXPR",75:"CONST",76:"COL",77:"WITNESS",78:"FIXED",79:"CHALLENGE",80:"T_STRING",81:"PROOF_VALUE",82:"SUBPROOF_VALUE",83:"AIR_VALUE",84:"PUBLIC",85:"PUBLIC_TABLE",88:"===",97:"AIR",98:"ON",102:"CONTINUE",103:"BREAK",106:"FOR",109:"IN",110:"WHILE",111:"DO",112:"ONCE",113:"SWITCH",115:"IF",116:"ELSE",118:"DEFAULT",120:"DOTS_RANGE",121:"CASE",123:"INC",125:"DEC",129:"=",131:"RETURN",133:"+=",134:"-=",135:"*=",139:"INCLUDE",142:"STAGE",143:"NUMBER",144:"STRING",145:"TEMPLATE_STRING",148:"DOTS_ARITH_SEQ",149:"DOTS_GEOM_SEQ",153:".",155:"AGGREGATE",156:"CONSTANT",157:"EQ",158:"NE",159:"LT",160:"GT",161:"LE",162:"GE",163:"IS",164:"AND",165:"?",166:"B_AND",167:"B_OR",168:"B_XOR",169:"OR",170:"SHL",171:"SHR",172:"!",173:"+",174:"-",175:"*",176:"%",177:"/",178:"\\\\",179:"POW",180:"POSITIONAL_PARAM",182:"'"}, +productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[22,2],[25,2],[25,4],[29,5],[29,7],[10,4],[35,1],[35,2],[35,1],[35,2],[39,1],[39,2],[39,1],[40,2],[40,3],[40,3],[40,1],[40,2],[40,2],[40,1],[34,1],[34,0],[31,1],[31,2],[31,0],[37,2],[37,1],[42,1],[42,1],[42,1],[36,1],[36,5],[36,3],[36,4],[36,4],[36,3],[36,1],[36,1],[36,3],[56,2],[56,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[59,1],[59,3],[59,1],[59,0],[65,3],[65,1],[68,2],[68,2],[68,3],[68,3],[69,1],[69,1],[69,1],[69,2],[69,2],[69,2],[69,2],[69,2],[69,1],[69,1],[69,2],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[61,3],[61,1],[71,3],[71,2],[62,1],[62,2],[41,3],[41,1],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[38,1],[38,1],[38,1],[38,1],[38,3],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[91,1],[91,3],[91,3],[52,5],[52,3],[52,3],[52,1],[54,3],[54,1],[92,4],[95,1],[96,1],[96,1],[96,1],[89,7],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[104,1],[104,3],[46,9],[46,7],[46,5],[46,6],[46,6],[46,3],[46,5],[46,5],[46,7],[46,1],[46,1],[114,3],[114,5],[119,3],[119,5],[119,1],[119,3],[117,5],[117,4],[122,1],[122,2],[122,2],[122,2],[122,2],[107,1],[107,1],[107,1],[107,1],[19,1],[19,2],[126,2],[126,2],[126,2],[126,2],[126,2],[126,4],[126,4],[126,4],[126,4],[126,4],[126,4],[126,8],[126,8],[126,8],[126,8],[126,8],[130,2],[130,3],[130,3],[130,4],[128,1],[128,2],[127,3],[127,1],[101,1],[101,2],[101,4],[132,1],[132,1],[132,1],[132,1],[136,3],[136,2],[136,1],[137,3],[137,5],[100,3],[100,5],[99,3],[99,3],[108,3],[108,1],[12,2],[141,4],[141,0],[140,1],[140,1],[138,3],[138,4],[138,5],[138,6],[146,3],[146,5],[146,5],[146,5],[146,9],[146,9],[146,4],[146,4],[146,6],[146,6],[146,1],[146,3],[147,3],[147,3],[147,5],[147,5],[147,7],[147,2],[147,3],[147,1],[94,0],[94,3],[94,5],[94,3],[94,1],[105,4],[105,3],[105,2],[105,1],[150,2],[150,3],[150,3],[150,4],[151,1],[151,2],[152,1],[152,1],[152,1],[152,3],[152,3],[154,3],[154,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[90,4],[90,5],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,5],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,2],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,2],[49,2],[49,1],[49,2],[49,2],[49,2],[49,2],[49,1],[49,1],[49,3],[49,1],[49,1],[49,1],[181,4],[181,4],[181,4],[181,4],[181,4],[181,5],[181,5],[181,5],[181,5],[181,5],[124,2],[124,3],[124,5],[124,3],[124,2],[124,3],[124,5],[124,3],[124,1],[93,1],[93,2],[184,1],[184,3],[184,2],[184,2],[183,4],[183,3],[24,3],[24,3],[24,3],[24,1],[24,3],[24,1],[24,3],[185,3],[185,3],[185,1],[185,1]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { /* this == yyval */ @@ -94,819 +92,822 @@ break; case 3: this.$ = [] break; -case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 28: case 30: case 54: case 55: case 65: case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 108: case 109: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 131: case 132: case 133: case 134: case 136: case 137: case 139: case 142: case 162: case 168: case 169: case 170: case 193: case 243: case 257: case 308: case 339: +case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 29: case 31: case 55: case 56: case 66: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 109: case 110: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 122: case 132: case 133: case 134: case 135: case 137: case 138: case 140: case 143: case 164: case 170: case 171: case 172: case 195: case 245: case 259: case 310: case 341: this.$ = $$[$0] break; -case 17: case 153: +case 17: case 154: this.$ = { type: 'debugger' } break; -case 18: - this.$ = { type: 'use', name: $$[$0].name } +case 18: case 155: + this.$ = { type: 'pragma', value: $$[$0] } break; case 19: - this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } + this.$ = { type: 'use', name: $$[$0].name } break; case 20: - this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } + this.$ = { type: 'container', name: $$[$0].name, alias: false, statements: false } break; case 21: - this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-2].name, alias: $$[$0], statements: false } break; case 22: - this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } + this.$ = { type: 'container', name: $$[$0-3].name, alias: false, statements: $$[$0-1].statements } break; case 23: + this.$ = { type: 'container', name: $$[$0-5].name, alias: $$[$0-3], statements: $$[$0-1].statements } +break; +case 24: this.$ = { type: 'proof', statements: $$[$0-1].statements } break; -case 24: case 38: case 40: case 167: +case 25: case 39: case 41: case 169: this.$ = $$[$0]; break; -case 25: case 41: +case 26: case 42: this.$ = $$[$0-1]; break; -case 27: case 122: case 123: case 143: case 154: case 317: +case 28: case 123: case 124: case 144: case 156: case 319: this.$ = $$[$0-1] break; -case 29: +case 30: this.$ = $$[$0-1]; this.$.statements.push($$[$0]); break; -case 31: +case 32: this.$ = { ...$$[$0-1], statements: [ ...$$[$0-1].statements, $$[$0] ] } break; -case 32: case 33: +case 33: case 34: this.$ = { ...$$[$0-2], statements: [ ...$$[$0-2].statements, $$[$0-1] ] } break; -case 34: case 99: case 214: +case 35: case 100: case 216: this.$ = { statements: [$$[$0]] } break; -case 35: case 36: +case 36: case 37: this.$ = { statements: [$$[$0-1]] } break; -case 45: +case 46: this.$ = { boundary: 'first' } break; -case 46: +case 47: this.$ = { boundary: 'last' } break; -case 47: +case 48: this.$ = { boundary: 'frame' } break; -case 48: +case 49: this.$ = { type: 'code', statements: $$[$0] }; break; -case 49: +case 50: this.$ = { type: 'when', statements: $$[$0-1], expression: $$[$0-2] } break; -case 50: +case 51: this.$ = { ...$$[$0-1], type: 'when', statements: $$[$0] } break; -case 51: +case 52: this.$ = { type: 'hint', name: $$[$0-3], data: $$[$0-1] } break; -case 52: +case 53: this.$ = { type: 'hint', name: $$[$0-3], data: $$[$0-1] } break; -case 53: +case 54: this.$ = { type: 'hint', name: $$[$0-2], data: $$[$0-1] } break; -case 56: +case 57: this.$ = { type: 'scope_definition', ...$$[$0-1] }; break; -case 57: +case 58: this.$ = {private: false, funcname: $$[$0]} break; -case 58: +case 59: this.$ = {private: true, funcname: $$[$0]} break; -case 59: +case 60: this.$ = { ...$$[$0-10], type: 'function_definition', final: false, ...$$[$0-8], returns: $$[$0-4], ...$$[$0-1] } break; -case 60: +case 61: this.$ = { ...$$[$0-8], type: 'function_definition', final: false, ...$$[$0-6], returns: $$[$0-3], ...$$[$0-1] } break; -case 61: +case 62: this.$ = { ...$$[$0-6], type: 'function_definition', final: false, ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 62: +case 63: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'air', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 63: +case 64: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'proof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 64: +case 65: this.$ = { ...$$[$0-6], type: 'function_definition', final: 'subproof', ...$$[$0-4], returns: false, ...$$[$0-1] } break; -case 66: +case 67: this.$ = $$[$0-2]; this.$.vargs = true break; -case 67: +case 68: this.$ = { args: [], varargs: false } break; -case 68: +case 69: this.$ = { args: [], varargs: false } break; -case 69: +case 70: this.$ = $$[$0-2]; this.$.args.push($$[$0]) break; -case 70: +case 71: this.$ = { args: [ $$[$0] ] } break; -case 71: +case 72: this.$ = { type: $$[$0-1].type, name: $$[$0], reference: false, dim: 0 } break; -case 72: +case 73: this.$ = { type: $$[$0-1].type, name: $$[$0], reference: true, dim: 0 } break; -case 73: +case 74: this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: false, dim: $$[$0].dim } break; -case 74: +case 75: this.$ = { type: $$[$0-2].type, name: $$[$0-1], reference: true, dim: $$[$0].dim } break; -case 75: +case 76: this.$ = { type: 'int' } break; -case 76: +case 77: this.$ = { type: 'fe' } break; -case 77: +case 78: this.$ = { type: 'expr' } break; -case 78: +case 79: this.$ = { type: 'int', const: true } break; -case 79: +case 80: this.$ = { type: 'fe', const: true } break; -case 80: +case 81: this.$ = { type: 'expr', const: true } break; -case 81: +case 82: this.$ = { type: 'witness' } break; -case 82: +case 83: this.$ = { type: 'fixed' } break; -case 83: +case 84: this.$ = { type: 'challenge' } break; -case 84: +case 85: this.$ = { type: 'string' } break; -case 85: +case 86: this.$ = { type: 'string', const: true } break; -case 86: +case 87: this.$ = { type: 'proof' } break; -case 87: +case 88: this.$ = { type: 'subproof' } break; -case 88: +case 89: this.$ = { type: 'air' } break; -case 89: +case 90: this.$ = { type: 'public' } break; -case 90: +case 91: this.$ = { type: 'publicTable' } break; -case 91: +case 92: this.$ = { type: 'function' } break; -case 92: +case 93: this.$ = {returns: [...$$[$0-2], $$[$0]]} break; -case 93: +case 94: this.$.returns = [$$[$0]] break; -case 94: +case 95: this.$ = {dim: $$[$0-2].dim + 1} break; -case 95: +case 96: this.$ = {dim: 1} break; -case 96: +case 97: this.$ = { type: $$[$0].type, dim: 0 } break; -case 97: +case 98: this.$ = { type: $$[$0-1].type, dim: $$[$0].dim } break; -case 98: case 213: +case 99: case 215: this.$ = $$[$0-2]; this.$.statements.push($$[$0]); break; -case 107: +case 108: this.$ = { type: 'code', statements: $$[$0] } break; -case 110: +case 111: this.$ = { type: 'expr', expr: $$[$0] } break; -case 111: +case 112: this.$ = { type: 'constraint', left: $$[$0-2], right: $$[$0] } break; -case 124: +case 125: this.$ = $$[$0-4]; this.$.data[$$[$0-2]] = $$[$0] break; -case 125: +case 126: this.$ = $$[$0-2]; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', name: $$[$0] }) break; -case 126: +case 127: this.$ = { type: 'object', data: {}}; this.$.data[$$[$0-2]] = $$[$0] break; -case 127: +case 128: this.$ = {data: {}}; this.$.data[$$[$0]] = ExpressionFactory.fromObject({type: 'reference', name: $$[$0] }) break; -case 128: +case 129: this.$ = $$[$0-2]; this.$.data.push($$[$0]) break; -case 129: +case 130: this.$ = { type: 'array', data: [ $$[$0] ] } break; -case 130: +case 131: this.$ = { type: 'call', function: $$[$0-3], args: $$[$0-1] } break; -case 135: +case 136: this.$ = { type: 'delayed_function_call', event: $$[$0-5], scope: $$[$0-4], function: $$[$0-3], args: $$[$0-1] } break; -case 138: +case 139: this.$ = {...$$[$0], ...$$[$01]} break; -case 140: +case 141: this.$ = { type: 'continue' } break; -case 141: +case 142: this.$ = { type: 'break' } break; -case 144: +case 145: this.$ = { type: 'for', init: $$[$0-6], condition: $$[$0-4], increment: $$[$0-2].statements, statements: $$[$0] } break; -case 145: +case 146: this.$ = { type: 'for_in', init: $$[$0-4], list: $$[$0-2], statements: $$[$0] } break; -case 146: +case 147: this.$ = { type: 'while', condition: $$[$0-2], statements: $$[$0] } break; -case 147: case 148: +case 148: case 149: this.$ = { type: 'do', condition: $$[$0-1], statements: $$[$0-4] } break; -case 149: +case 150: this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } break; -case 150: +case 151: this.$ = $$[$0-4] break; -case 151: +case 152: this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } break; -case 152: +case 153: this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} break; -case 155: +case 157: this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) break; -case 156: case 224: case 250: +case 158: case 226: case 252: this.$ = $$[$0-2]; this.$.values.push($$[$0]) break; -case 157: +case 159: this.$ = $$[$0-4]; this.$.values.push({ from: $$[$0-2], to: $$[$0] }) break; -case 158: +case 160: this.$ = { values: [$$[$0]] } break; -case 159: +case 161: this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } break; -case 160: +case 162: this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) break; -case 161: +case 163: this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} break; -case 163: +case 165: this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } break; -case 164: +case 166: this.$ = { ...$$[$0], type: 'variable_increment', pre: -1n, post: 0n } break; -case 165: +case 167: this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: 1n } break; -case 166: +case 168: this.$ = { ...$$[$0-1], type: 'variable_increment', pre: 0n, post: -1n } break; -case 171: +case 173: this.$ = {...$$[$0], const: false} break; -case 172: +case 174: this.$ = {...$$[$0], const: true } break; -case 173: +case 175: this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0].items } break; -case 174: +case 176: this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0].items } break; -case 175: +case 177: this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0].items } break; -case 176: +case 178: this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0].items } break; -case 177: +case 179: this.$ = { type: 'variable_declaration', vtype: 'function', items: $$[$0].items } break; -case 178: +case 180: this.$ = { type: 'variable_declaration', vtype: 'int', items: [$$[$0-2]], init: [$$[$0]] } break; -case 179: +case 181: this.$ = { type: 'variable_declaration', vtype: 'fe', items: [$$[$0-2]], init: [$$[$0]] } break; -case 180: +case 182: this.$ = { type: 'variable_declaration', vtype: 'expr', items: [$$[$0-2]], init: [$$[$0]] } break; -case 181: +case 183: this.$ = { type: 'variable_declaration', vtype: 'string', items: [$$[$0-2]], init: [$$[$0]] } break; -case 182: +case 184: this.$ = { type: 'variable_declaration', vtype: 'function', items: [$$[$0-2]], init: [$$[$0]] } break; -case 183: +case 185: this.$ = { type: 'variable_declaration', vtype: 'container', items: [$$[$0-2]], init: [$$[$0]] } break; -case 184: +case 186: this.$ = { type: 'variable_declaration', vtype: 'int', items: $$[$0-5].items, init: $$[$0-1] } break; -case 185: +case 187: this.$ = { type: 'variable_declaration', vtype: 'fe', items: $$[$0-5].items, init: $$[$0-1] } break; -case 186: +case 188: this.$ = { type: 'variable_declaration', vtype: 'expr', items: $$[$0-5].items, init: $$[$0-1] } break; -case 187: +case 189: this.$ = { type: 'variable_declaration', vtype: 'string', items: $$[$0-5].items, init: $$[$0-1] } break; -case 188: +case 190: this.$ = { type: 'variable_declaration', vtype: 'container', items: $$[$0-5].items, init: $$[$0-1] } break; -case 189: +case 191: this.$ = { dim: 1, lengths: [null]} break; -case 190: +case 192: this.$ = { dim: 1, lengths: [$$[$0-1]]} break; -case 191: +case 193: this.$ = $$[$0-2]; ++this.$.dim; this.$.lengths.push(null) break; -case 192: +case 194: this.$ = $$[$0-3]; ++this.$.dim; this.$.lengths.push($$[$0-1]) break; -case 194: case 341: +case 196: case 343: this.$ = { ...$$[$0-1], ...$$[$0] } break; -case 195: +case 197: this.$ = $$[$0-2]; this.$.items.push({...$$[$0], _d_:1}); break; -case 196: +case 198: this.$ = {items: [{...$$[$0], _d_:2}]} break; -case 197: +case 199: this.$ = { type: 'return', value: null } break; -case 198: +case 200: this.$ = { type: 'return', value: $$[$0] } break; -case 199: +case 201: this.$ = { type: 'return', values: $$[$0-1] } break; -case 200: +case 202: this.$ = { type: 'assign' } break; -case 201: +case 203: this.$ = { type: 'increment' } break; -case 202: +case 204: this.$ = { type: 'substract' } break; -case 203: +case 205: this.$ = { type: 'product' } break; -case 204: +case 206: this.$ = $$[$0-2]; this.$.names.push($$[$0-2]) break; -case 205: +case 207: this.$ = $$[$0-1]; this.$.names.push({ type: 'ignore' }) break; -case 206: +case 208: this.$ = { names: [$$[$0]] } break; -case 207: +case 209: this.$ = $$[$0-2] break; -case 208: +case 210: this.$ = $$[$0-4]; this.$.names.push({ type: 'ignore' }) break; -case 209: +case 211: this.$ = {type: 'assign', name: $$[$0-2], value: $$[$0] } break; -case 210: +case 212: this.$ = {type: 'assign', name: $$[$0-4], value: $$[$0-2] } break; -case 211: +case 213: this.$ = { type: 'assign', assign: $$[$0-1].type, name: $$[$0-2], value: $$[$0] } break; -case 212: +case 214: this.$ = { type: 'assign', name: $$[$0-2], value: $$[$0] } break; -case 215: +case 217: this.$ = { type: 'include', file: $$[$0] } break; -case 216: +case 218: this.$ = { stage: $$[$0-1] } break; -case 217: +case 219: this.$ = { stage: DEFAULT_STAGE } break; -case 218: +case 220: this.$ = { type: 'string', value: $$[$0] } break; -case 219: +case 221: this.$ = { type: 'string', template: true, value: $$[$0] } break; -case 220: +case 222: this.$ = {type: 'sequence', values: $$[$0-1].values} break; -case 221: +case 223: this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: $$[$0-2]}] } break; -case 222: +case 224: this.$ = {type: 'sequence', values: [{type: 'repeat_seq', value: $$[$0-3], times: $$[$0]}]} break; -case 223: +case 225: this.$ = {type: 'sequence', values: [{type: 'padding_seq', value: {type: 'repeat_seq', value: $$[$0-4], times: $$[$0-1]}}]} break; -case 225: +case 227: this.$ = $$[$0-4]; this.$.values.push({type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}) break; -case 226: +case 228: this.$ = $$[$0-4]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; -case 227: +case 229: this.$ = $$[$0-4]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-2], tn: $$[$0]}) break; -case 228: +case 230: this.$ = $$[$0-8]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; -case 229: +case 231: this.$ = $$[$0-8]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-6], times: $$[$0-4]}, tn: {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}}) break; -case 230: +case 232: this.$ = $$[$0-3]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; -case 231: +case 233: this.$ = $$[$0-3]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: $$[$0-1], tn: false}) break; -case 232: +case 234: this.$ = $$[$0-5]; this.$.values.push({type: 'arith_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, tn: false}) break; -case 233: +case 235: this.$ = $$[$0-5]; this.$.values.push({type: 'geom_seq', t1: this.$.values.pop(), t2: {type: 'repeat_seq', value: $$[$0-3], times: $$[$0-1]}, tn: false}) break; -case 234: +case 236: this.$ = { type: 'seq_list', values: [$$[$0]] } break; -case 235: +case 237: this.$ = { type: 'seq_list', values: [{type: 'repeat_seq', value: $$[$0-2], times: $$[$0]}] } break; -case 236: +case 238: this.$ = {type: 'repeat_seq', value: $$[$0-2], times: $$[$0]} break; -case 237: +case 239: this.$ = {type: 'range_seq', from: $$[$0-2], to: $$[$0]} break; -case 238: +case 240: this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0-2], times: $$[$0]} break; -case 239: +case 241: this.$ = {type: 'range_seq', from: $$[$0-4], to: $$[$0], times: $$[$0-2]} break; -case 240: +case 242: this.$ = {type: 'range_seq', from: $$[$0-6], to: $$[$0-2], times: $$[$0-4], toTimes: $$[$0]} break; -case 241: +case 243: this.$ = {type: 'padding_seq', value: $$[$0-1]} break; -case 242: - this.$ = {type: 'seq_list', values: [$$[$0-1]]} -break; case 244: - this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [] }); console.log('C', this.$) -break; -case 245: - this.$ = $$[$0-2]; console.log(this.$); this.$.pushItem(ExpressionFactory.fromObject($$[$0])); + this.$ = {type: 'seq_list', values: [$$[$0-1]]} break; case 246: - this.$ = $$[$0-4]; this.$.pushItem(ExpressionFactory.fromObject({ type: 'expression_list', values: $$[$0-1].values })); + this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [], __debug: 0 }); break; case 247: - this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: - [ExpressionFactory.fromObject({ type: 'expression_list', values: [$$[$0-1].values]})]}); console.log('A',this.$) + this.$ = $$[$0-2]; this.$.pushItem(ExpressionFactory.fromObject($$[$0])); break; case 248: - this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$$[$0]] }); console.log('B',this.$) + this.$ = $$[$0-4]; this.$.pushItem(ExpressionFactory.fromObject($$[$0-1])); break; case 249: - this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) + this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: + [ExpressionFactory.fromObject($$[$0-1])], __debug: 4}); +break; +case 250: + this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$$[$0]], __debug: 3 }); break; case 251: + this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) +break; +case 253: this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } break; -case 252: +case 254: this.$ = { type: 'expression_list', values: [$$[$0]] } break; -case 253: +case 255: this.$ = { dim: 1, lengths: [null] } break; -case 254: +case 256: this.$ = { dim: 1, lengths: [$$[$0-1]] } break; -case 255: +case 257: this.$ = { ...$$[$0-2], dim: $$[$0-2].dim + 1, lengths: [...$$[$0-2].lengths, null] } break; -case 256: +case 258: this.$ = { ...$$[$0-3], dim: $$[$0-3].dim + 1, lengths: [...$$[$0-3].lengths, $$[$0-1]] } break; -case 258: +case 260: this.$ = {...$$[$0-1], ...$$[$0]} break; -case 259: case 347: case 349: case 353: case 354: +case 261: case 353: case 355: case 359: case 360: this.$ = { name: $$[$0] } break; -case 260: +case 262: this.$ = { name: $$[$0], reference: true } break; -case 261: +case 263: this.$ = { name: $$[$0], template: true } break; -case 262: +case 264: this.$ = { name: 'air.'+$$[$0] } break; -case 263: +case 265: this.$ = { name: 'air.'+$$[$0], template: true } break; -case 264: +case 266: this.$ = { items: [ ...$$[$0-2].items, $$[$0] ] } break; -case 265: +case 267: this.$ = { items: [$$[$0]] } break; -case 266: +case 268: this.$ = { type: 'col_declaration', items: $$[$0].items, stage: $$[$0-1].stage }; break; -case 267: +case 269: this.$ = { type: 'col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; -case 268: +case 270: this.$ = { type: 'witness_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; -case 269: +case 271: this.$ = { type: 'fixed_col_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; -case 270: +case 272: this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, init: $$[$0] } break; -case 271: +case 273: this.$ = { type: 'fixed_col_declaration', items: [$$[$0-2]], stage: $$[$0-3].stage, sequence: $$[$0] } break; -case 272: +case 274: this.$ = { type: 'challenge_declaration', items: $$[$0].items, stage: $$[$0-1].stage } break; -case 273: +case 275: this.$ = { type: 'public_declaration', items: [$$[$0-2]], init: $$[$0] } break; -case 274: +case 276: this.$ = { type: 'public_declaration', items: $$[$0].items } break; -case 275: +case 277: this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-12], aggregateFunction: $$[$0-10], name: $$[$0-6], args: $$[$0-8], cols: $$[$0-4], rows: $$[$0-1]} break; -case 276: +case 278: this.$ = { type: 'public_table_declaration', aggregateType: $$[$0-10], aggregateFunction: $$[$0-8], name: $$[$0-6], args: [], cols: $$[$0-4], rows: $$[$0-1]} break; -case 277: +case 279: this.$ = { type: 'proof_value_declaration', items: $$[$0].items } break; -case 278: +case 280: this.$ = { type: 'subproof_value_declaration', aggregateType: $$[$0-2], items: $$[$0].items } break; -case 279: +case 281: this.$ = { type: 'subproof_definition', aggregate: true, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; -case 280: +case 282: this.$ = { type: 'subproof_definition', aggregate: false, name: $$[$0-6], rows: $$[$0-4], statements: $$[$0-1].statements } break; -case 281: +case 283: this.$ = { type: 'subproof_block', aggregate: false, name: $$[$0-3], statements: $$[$0-1].statements } break; -case 282: +case 284: this.$ = { type: 'constant_definition', name: $$[$0-2], value: $$[$0] } break; -case 283: +case 285: this.$ = { type: "constant_definition", name: $$[$0-3], sequence: $$[$0], ...$$[$0-2] } break; -case 284: +case 286: this.$ = $$[$0-2].insert('eq', ExpressionFactory.fromObject($$[$0])) break; -case 285: +case 287: this.$ = $$[$0-2].insert('ne', ExpressionFactory.fromObject($$[$0])) break; -case 286: +case 288: this.$ = $$[$0-2].insert('lt', ExpressionFactory.fromObject($$[$0])) break; -case 287: +case 289: this.$ = $$[$0-2].insert('gt', ExpressionFactory.fromObject($$[$0])) break; -case 288: +case 290: this.$ = $$[$0-2].insert('le', ExpressionFactory.fromObject($$[$0])) break; -case 289: +case 291: this.$ = $$[$0-2].insert('ge', ExpressionFactory.fromObject($$[$0])) break; -case 290: +case 292: this.$ = $$[$0-2].insert('in', ExpressionFactory.fromObject($$[$0])) break; -case 291: +case 293: this.$ = $$[$0-2].insert('is', ExpressionFactory.fromObject({type: 'istype', vtype: $$[$0].type, dim: $$[$0].dim})); break; -case 292: +case 294: this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; -case 293: +case 295: this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) break; -case 294: +case 296: this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) break; -case 295: +case 297: this.$ = $$[$0-2].insert('bor', ExpressionFactory.fromObject($$[$0])) break; -case 296: +case 298: this.$ = $$[$0-2].insert('bxor', ExpressionFactory.fromObject($$[$0])) break; -case 297: +case 299: this.$ = $$[$0-2].insert('or', ExpressionFactory.fromObject($$[$0])) break; -case 298: +case 300: this.$ = $$[$0-2].insert('shl', ExpressionFactory.fromObject($$[$0])) break; -case 299: +case 301: this.$ = $$[$0-2].insert('shr', ExpressionFactory.fromObject($$[$0])) break; -case 300: +case 302: this.$ = $$[$0].insert('not') break; -case 301: +case 303: this.$ = $$[$0-2].insert('add', ExpressionFactory.fromObject($$[$0])) break; -case 302: +case 304: this.$ = $$[$0-2].insert('sub', ExpressionFactory.fromObject($$[$0])) break; -case 303: +case 305: this.$ = $$[$0-2].insert('mul', ExpressionFactory.fromObject($$[$0])) break; -case 304: +case 306: this.$ = $$[$0-2].insert('mod', ExpressionFactory.fromObject($$[$0])) break; -case 305: +case 307: this.$ = $$[$0-2].insert('div', ExpressionFactory.fromObject($$[$0])) break; -case 306: +case 308: this.$ = $$[$0-2].insert('intdiv', ExpressionFactory.fromObject($$[$0])) break; -case 307: +case 309: this.$ = $$[$0-2].insert('pow', ExpressionFactory.fromObject($$[$0])) break; -case 309: +case 311: this.$ = $$[$0].insert('neg') break; -case 310: +case 312: this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0] }) break; -case 311: +case 313: this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0], inc: 'pre'}) break; -case 312: +case 314: this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0], dec: 'pre'}) break; -case 313: +case 315: this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0-1], inc: 'post'}) break; -case 314: +case 316: this.$ = ExpressionFactory.fromObject({ type: 'reference', ...$$[$0-1], dec: 'post'}) break; -case 315: +case 317: this.$ = ExpressionFactory.fromObject({ type: 'number', value: BigInt($$[$0])}) break; -case 316: +case 318: this.$ = ExpressionFactory.fromObject({...$$[$0], type: 'string'}) break; -case 318: case 320: +case 320: case 322: this.$ = ExpressionFactory.fromObject({...$$[$0]}) break; -case 319: +case 321: this.$ = ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'}) break; -case 321: +case 323: this.$ = { type: 'cast', cast: 'int', value: $$[$0-1]} break; -case 322: +case 324: this.$ = { type: 'cast', cast: 'fe', value: $$[$0-1] } break; -case 323: +case 325: this.$ = { type: 'cast', cast: 'expr', value: $$[$0-1] } break; -case 324: +case 326: this.$ = { type: 'cast', cast: 'col', value: $$[$0-1] } break; -case 325: +case 327: this.$ = { type: 'cast', cast: 'string', value: $$[$0-1] } break; -case 326: +case 328: this.$ = { ...$$[$0-3], type: 'cast', cast: 'int', value: $$[$0-1] } break; -case 327: +case 329: this.$ = { ...$$[$0-3], type: 'cast', cast: 'fe', value: $$[$0-1] } break; -case 328: +case 330: this.$ = { ...$$[$0-3], type: 'cast', cast: 'expr', value: $$[$0-1] } break; -case 329: +case 331: this.$ = { ...$$[$0-3], type: 'cast', cast: 'col', value: $$[$0-1] } break; -case 330: +case 332: this.$ = { ...$$[$0-3], type: 'cast', cast: 'string', value: $$[$0-1] } break; -case 331: +case 333: this.$ = { ...$$[$0-1], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: 1, current: $$[$0-1] }) } break; -case 332: +case 334: this.$ = { ...$$[$0-2], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: Number($$[$0]), current: $$[$0-2] }) } break; -case 333: +case 335: this.$ = { ...$$[$0-4], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: $$[$0-1], current: $$[$0-4] }) } break; -case 334: +case 336: this.$ = { ...$$[$0-2], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', current: $$[$0-2], value: ExpressionFactory.fromObject({position: $$[$0], type: 'positional_param'})}) } break; -case 335: +case 337: this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: 1, prior: true, current: $$[$0] }) } break; -case 336: +case 338: this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: Number($$[$0-2]), prior: true, current: $$[$0] }) } break; -case 337: +case 339: this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', value: $$[$0-3], prior: true, current: $$[$0] }) } break; -case 338: +case 340: this.$ = { ...$$[$0], rowOffset: ExpressionFactory.fromObject({type: 'row_offset', current: $$[$0], prior: true, value: ExpressionFactory.fromObject({position: $$[$0-2], type: 'positional_param'})}) } break; -case 340: +case 342: this.$ = { ...$$[$0], dim: 0 } break; -case 342: +case 348: this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } break; -case 343: +case 349: this.$ = { dim: 1, indexes: [$$[$0-1]]} break; -case 344: +case 350: this.$ = { name: 'air.' + $$[$0].name } break; -case 345: +case 351: this.$ = { name: 'subproof.' + $$[$0].name } break; -case 346: +case 352: this.$ = { name: 'proof.' + $$[$0].name } break; -case 348: case 350: +case 354: case 356: this.$ = { name: $$[$0-2] + '.' + $$[$0].name } break; -case 351: case 352: +case 357: case 358: this.$ = { name: $$[$0-2].name + '.' + $$[$0] } break; } }, -table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],25:$V1,32:[1,20],55:21,56:$V2,57:$V3,62:$V4,63:[1,19],71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,125:30,138:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),{27:[1,40],154:[1,39]},{29:[1,41]},{47:[1,42]},{32:[1,44],55:43,56:$Vh,57:$V3,63:[1,45]},{139:47,143:$Vi,144:$Vj},o($Vk,$Vl,{140:50,76:$Vm,77:$Vn,141:$Vo}),o($Vk,$Vl,{140:54,141:$Vo}),{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:55,153:56},{154:[1,62]},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:63},{154:[1,65]},o($Vt,[2,171]),{25:$V1,56:$Vu,71:$V5,72:$V6,73:$V7,79:$Vb,125:66},{23:71,27:[1,68],32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:69,127:70},{56:[1,76]},{23:71,27:$Vz,32:$Vv,52:[1,79],63:$Vw,69:$Vx,96:$Vy,126:77,127:78},{23:71,27:$Vz,32:$Vv,52:[1,83],63:$Vw,69:$Vx,96:$Vy,126:81,127:82},{23:71,27:$Vz,32:$Vv,52:[1,86],63:$Vw,69:$Vx,96:$Vy,126:84,127:85},{23:71,27:$Vz,32:$Vv,52:[1,89],63:$Vw,69:$Vx,96:$Vy,126:87,127:88},{23:71,27:$Vz,32:$Vv,52:$VA,63:$Vw,69:$Vx,96:$Vy,127:90},{27:[1,92]},{29:[1,94],47:[1,93]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:95,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:$V71,56:$V81,58:161,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{47:[1,179]},{55:180,56:$Vh,57:$V3},{55:181,56:$Vh,57:$V3},{27:[1,182]},o($Vm1,[2,215]),o($Vn1,[2,218]),o($Vn1,[2,219]),{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:184,153:183},o($Vk,$Vl,{140:185,141:$Vo}),o($Vk,$Vl,{140:186,141:$Vo}),{47:[1,187]},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:188},o([6,8,20,25,31,32,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,109,138],$Vo1,{149:190,52:$Vp1,128:[1,189]}),o($Vm1,[2,274],{65:$Vq1}),o($Vr1,[2,259]),o($Vr1,[2,260]),o($Vr1,[2,261]),{152:[1,193]},o($Vs1,[2,265]),{47:[1,194]},o($Vm1,[2,277],{65:$Vq1}),o($Vs1,$Vo1,{149:190,52:$Vp1}),{47:[1,195]},o($Vt,[2,172]),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:69,127:70},o([6,8,20,25,31,32,52,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,109,128,138],$Vt1,{47:$Vu1,152:$Vv1}),o($Vt,[2,177],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,198]}),o($Vy1,$Vz1,{129:199,52:$VA1}),{152:[1,201]},{152:[1,202]},{152:[1,203]},o($VB1,[2,349],{152:[1,204]}),{27:[1,205]},o($Vt,[2,173],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,206]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:207,127:208},o($VB1,$Vt1,{152:$Vv1}),o($Vt,[2,174],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,209]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:210,127:208},o($Vt,[2,175],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,211]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:212,127:208},o($Vt,[2,176],{65:$Vw1}),o($Vs1,$Vx1,{128:[1,213]}),{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:214,127:208},{128:[1,215]},{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,126:216,127:208},{47:[1,217]},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:218,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:227,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,228]},{31:[2,38]},{11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:[2,28],32:$Vv,35:230,37:229,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,31:[2,30],36:231},o($VI1,[2,34],{36:232,8:$VB}),o($VI1,[2,37],{8:$VJ1}),o($VK1,[2,107]),o($VK1,[2,108]),o($VK1,[2,109]),o($VK1,[2,110],{87:[1,234],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VK1,[2,112]),o($VK1,[2,113]),o($VK1,[2,114]),o($VK1,[2,115]),o($VK1,[2,116]),o($VK1,[2,117]),o($VK1,[2,118]),o($VK1,[2,119]),o($VK1,[2,120]),o($V62,[2,48]),{41:259,42:[1,260],43:[1,261],44:[1,262],47:[1,258]},{23:160,27:$Vz,29:[1,263],32:$Vv,47:$VI,48:265,52:[1,264],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,54]),o($V62,[2,55]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:266,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,44]),o($VK1,[2,136]),o($VK1,[2,137]),o($VK1,[2,138]),o($VK1,[2,139]),o($VK1,[2,140]),o($VK1,[2,141]),o($Vk,$Vl,{140:50,70:268,47:$V72,52:$V82,76:$Vm,77:$Vn,141:$Vo}),{23:160,27:$Vz,32:$Vv,47:$VI,48:270,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:271,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:272,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o([8,31,87,108,109,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178],$V92,{131:275,122:$Va2,124:$Vb2,128:$Vc2,132:$Vd2,133:$Ve2,134:$Vf2}),{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:280,142:$Vh2,179:$Vi2,181:$V61},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:285,142:$Vh2,179:$Vi2,181:$V61},o($Vn1,[2,315],{181:$Vj2}),o($Vn1,[2,316]),{23:160,27:$Vz,32:$Vv,47:$VI,48:287,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vn1,[2,318]),o($Vn1,[2,319],{181:$Vk2}),o($Vn1,[2,320]),{62:[1,290],94:289},{27:[1,291]},{23:292,27:$Vz,32:$Vv,52:$VA,63:$Vw,69:$Vx,96:$Vy,127:90},{23:293,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy},{47:[1,294]},{47:[1,295]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:296,35:298,36:299,37:297,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{32:$Vl2,63:$Vm2,95:300,96:$Vn2},{47:[1,304]},{47:[1,305]},o($V62,[2,153]),{128:[1,306]},o($VK1,[2,197],{139:135,91:137,180:139,92:153,23:160,123:221,48:307,27:$Vz,32:$Vv,47:$VI,52:[1,308],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($Vo2,$Vp2,{47:$Vq2,181:$Vr2}),{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:311,96:$Vy},{23:71,27:$Vz,32:$Vv,47:$Vs2,52:[1,314],63:$Vw,69:$Vx,70:313,96:$Vy,126:77,127:78},{23:71,27:$Vz,32:$Vv,47:$Vt2,52:[1,317],63:$Vw,69:$Vx,70:316,96:$Vy,126:81,127:82},{23:71,27:$Vz,32:$Vv,47:$Vu2,52:[1,320],63:$Vw,69:$Vx,70:319,96:$Vy,126:84,127:85},{23:71,27:$Vz,32:$Vv,47:$Vv2,52:[1,323],63:$Vw,69:$Vx,70:322,96:$Vy,126:87,127:88},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:325,135:324,142:$Vh2,179:$Vi2,181:$V61},o($Vw2,[2,340],{182:326,52:[1,327]}),{49:[1,328]},{49:[2,65],65:[1,329]},{49:[2,67]},o($Vx2,[2,70]),{27:[1,330],69:[1,331]},o($Vy2,[2,75]),o($Vy2,[2,76]),o($Vy2,[2,77]),{71:[1,332],72:[1,333],73:[1,334],79:[1,335]},{76:[1,336],77:[1,337]},o($Vy2,[2,83]),o($Vy2,[2,84]),o($Vy2,[2,86]),o($Vy2,[2,87]),o($Vy2,[2,88]),o($Vy2,[2,89]),o($Vy2,[2,90]),o($Vy2,[2,91]),{49:$V71,56:$V81,58:338,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{47:[1,339]},{47:[1,340]},{47:$Vu1},o($Vt,[2,266],{65:$Vq1}),o($Vs1,$Vo1,{149:190,52:$Vp1,128:[1,341]}),{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:342},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:344,153:343},{142:[1,345]},o($Vm1,[2,272],{65:$Vq1}),{23:160,27:$Vz,32:$Vv,47:$VI,48:346,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vs1,[2,258],{52:$Vz2}),{23:160,27:$Vz,32:$Vv,47:$VI,48:349,54:[1,348],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:350,151:64},{27:[1,351],144:[1,352]},{27:[1,353]},{27:[1,354]},{27:$VA2,144:$VB2,183:355},{23:71,27:$Vz,32:$Vv,63:$Vw,69:$Vx,96:$Vy,127:358},{23:160,27:$Vz,32:$Vv,47:$VI,48:359,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vy1,[2,194],{52:[1,360]}),{23:160,27:$Vz,32:$Vv,47:$VI,48:362,54:[1,361],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{27:$VA2,144:$VB2,183:363},{27:$VA2,144:$VB2,183:364},{27:$VA2,144:$VB2,183:365},{27:$VA2,144:$VB2,183:366},{47:[2,58]},{23:160,27:$Vz,32:$Vv,47:$VI,48:367,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,368],65:$Vw1},o($VC2,$Vx1),{23:160,27:$Vz,32:$Vv,47:$VI,48:369,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,370],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:371,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,372],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:373,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,374],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:375,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,376],65:$Vw1},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:377,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,378],65:$VD2},{23:160,27:$Vz,32:$Vv,47:$VI,48:380,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VE2,[2,252],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vn1,$V92,{122:$Va2,124:$Vb2}),{47:$Vs2,52:$V82,70:313},{47:$Vt2,52:$V82,70:316},{47:$Vu2,52:$V82,70:319},{47:$V72,52:$V82,70:268},{47:$Vv2,52:$V82,70:322},{31:[1,381]},o($V0,[2,23]),{8:$VB,31:[2,29],36:382},o($VI1,[2,31],{36:383,8:$VB}),o($VI1,[2,36],{8:$VJ1}),o($VI1,[2,35],{8:$VJ1}),o($V62,[2,43]),{23:160,27:$Vz,32:$Vv,47:$VI,48:384,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:385,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:386,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:387,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:388,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:389,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:390,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:391,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{56:$V81,61:392,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{23:160,27:$Vz,32:$Vv,47:$VI,48:394,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:395,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:396,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:397,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:398,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:399,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:400,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:401,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:402,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:403,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:404,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:405,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:406,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:407,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:408,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:409,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:410,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VF2,[2,45]),o($VF2,[2,46]),o($VF2,[2,47]),{27:$VG2,51:412},{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,53:414,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:415,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:[1,419],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{31:[1,420]},{23:160,27:$Vz,32:$Vv,47:$VI,48:421,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,422],52:$VJ2},{54:$VK2},o($Vn1,[2,300]),o($Vn1,[2,308]),o($Vn1,[2,309]),o($Vn1,[2,313]),o($Vn1,[2,314]),{23:160,27:$Vz,32:$Vv,47:$VI,48:425,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VL2,[2,200],{137:426,52:$VM2}),o($VL2,[2,201]),o($VL2,[2,202]),o($VL2,[2,203]),o($Vn1,[2,311]),o($Vo2,$Vp2,{181:$Vr2}),{181:$Vj2},{23:160,27:$Vz,32:$Vv,47:$VI,48:428,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{181:$Vk2},o($Vn1,[2,312]),{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:429,96:$Vy},{49:[1,430],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:431,96:$Vy},{32:$Vl2,63:$Vm2,95:432,96:$Vn2},o([32,63,96],[2,131]),{52:$Vp1,128:[1,433],149:434},o($VK1,[2,19],{129:199,26:[1,435],29:[1,436],52:$VA1,128:$Vz1}),o($VK1,[2,18]),{13:441,19:438,23:160,25:$V1,27:$Vz,32:$Vv,47:$Vg2,56:$Vu,63:$Vw,69:$Vx,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,79:$Vb,92:281,96:$Vy,98:439,106:437,123:440,125:30,142:$Vh2,179:$Vi2,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:442,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{109:[1,443]},{8:$VB,36:445,109:[1,444]},o([20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,115,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],[2,24],{36:446,8:$VB}),o($V62,[2,26]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:447,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VF2,[2,132]),o($VF2,[2,133]),o($VF2,[2,134]),{23:160,27:$Vz,32:$Vv,47:$VI,48:448,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:449,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,52:[1,451],63:$Vw,69:$Vx,91:450,92:452,96:$Vy},o($VK1,[2,198],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:453,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vo2,[2,331],{47:[1,455],142:[1,454],179:[1,456]}),o($Vx2,$VN2,{139:135,91:137,180:139,92:153,23:160,123:221,93:457,48:459,27:$Vz,32:$Vv,47:$VI,52:$VO2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($Vo2,[2,335]),{23:160,27:$Vz,32:$Vv,47:$VI,48:460,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,461],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:207,127:208},{23:160,27:$Vz,32:$Vv,47:$VI,48:462,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,463],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:210,127:208},{23:160,27:$Vz,32:$Vv,47:$VI,48:464,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,465],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:212,127:208},{23:160,27:$Vz,32:$Vv,47:$VI,48:466,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:[1,467],52:$VJ2},{23:71,27:$Vz,32:$Vv,54:$VK2,63:$Vw,69:$Vx,96:$Vy,126:214,127:208},{54:[1,468],65:[1,469]},o($VC2,[2,206]),o($Vw2,[2,341],{52:[1,470]}),{23:160,27:$Vz,32:$Vv,47:$VI,48:471,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{29:[1,473],59:[1,472]},{56:$V81,66:[1,474],67:475,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},o($Vx2,[2,71],{70:476,52:$V82}),o($Vx2,[2,72],{70:477,52:$V82}),o($Vy2,[2,78]),o($Vy2,[2,79]),o($Vy2,[2,80]),o($Vy2,[2,85]),o($Vy2,[2,81]),o($Vy2,[2,82]),{49:[1,478]},{49:$V71,56:$V81,58:479,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{49:$V71,56:$V81,58:480,64:162,66:$V91,67:164,68:165,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{23:160,27:$Vz,32:$Vv,47:$VI,48:481,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vt,[2,268],{65:$Vq1}),o($Vt,[2,269],{65:$Vq1}),o($Vs1,$Vo1,{149:190,52:$Vp1,128:[1,482]}),{49:[1,483]},o($Vm1,[2,273],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:485,54:[1,484],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vr1,[2,253]),{54:[1,486],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vs1,[2,264]),o($Vr1,[2,262]),o($Vr1,[2,263]),{65:[1,487]},{49:[1,488]},o($VB1,[2,348],{152:$VP2}),o($VQ2,[2,353]),o($VQ2,[2,354]),o([6,8,20,25,31,32,54,56,57,62,63,65,71,72,73,74,75,78,79,80,81,83,84,108,109,138],[2,195]),o($Vm1,[2,182],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:491,54:[1,490],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VR2,[2,189]),{54:[1,492],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VB1,[2,344],{152:$VP2}),o($VB1,[2,345],{152:$VP2}),o($VB1,[2,346],{152:$VP2}),o($VB1,[2,350],{152:$VP2}),o($Vm1,[2,178],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,493]},o($Vm1,[2,179],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,494]},o($Vm1,[2,180],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,495]},o($Vm1,[2,181],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,496]},o($Vm1,[2,183],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{128:[1,497]},{49:[1,498],65:$VD2},{29:[1,499]},{23:160,27:$Vz,32:$Vv,47:$VI,48:501,63:$Vw,66:[1,500],69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VE2,[2,251],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V0,[2,281]),o($VI1,[2,33],{8:$VJ1}),o($VI1,[2,32],{8:$VJ1}),o($VK1,[2,111],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,284],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,285],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,286],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,287],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,288],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VS2,[2,289],{169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o([6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,108,109,119,138,147,148,162,163,164,165,166,167,168],[2,290],{156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vn1,[2,291]),o($VT2,[2,96],{70:502,52:$V82}),o($VU2,[2,292],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{59:[1,503],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VU2,[2,294],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VU2,[2,295],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VU2,[2,296],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VV2,[2,297],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VU2,[2,298],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VV2,[2,299],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,165:$VV1,166:$VW1,167:$VX1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VW2,[2,301],{174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VW2,[2,302],{174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VX2,[2,303],{178:$V52}),o($VX2,[2,304],{178:$V52}),o($VX2,[2,305],{178:$V52}),o($VX2,[2,306],{178:$V52}),o($Vn1,[2,307]),{49:[1,504],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($V62,[2,50]),{8:$VB,36:445},{31:[1,505],65:$VY2},o($VZ2,[2,127],{59:[1,507]}),{54:[1,508],65:$V_2},o($VC2,[2,129]),o($V$2,[2,121],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{27:$VG2,51:510},{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,53:511,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:415,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,53]),o($V62,[2,56]),{49:[1,512],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:513,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,514]},o($V03,[2,95]),o([8,31,49,65,109],[2,211],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o([8,31,49,65,108,109],[2,212]),{23:160,27:$Vz,32:$Vv,47:$VI,48:517,52:$V13,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,145:515,146:516,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,519],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vo2,[2,336]),o($Vn1,[2,317],{181:$V23}),o($Vo2,[2,338]),{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:521,96:$Vy},{23:160,27:$Vz,32:$Vv,47:$VI,48:522,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{52:$Vz2,128:[1,523]},{27:[1,524]},{13:528,14:529,15:530,16:531,17:532,18:533,19:534,25:$V1,30:525,31:$V33,40:526,56:$Vu,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,85:527,125:30},{8:[1,535],108:[1,536]},o($V43,[2,167]),o($V43,[2,168]),o($V43,[2,169],{131:275,128:$Vc2,132:$Vd2,133:$Ve2,134:$Vf2}),o($V43,[2,170]),{49:[1,537],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{47:[1,538]},{47:[1,539]},o($V62,[2,27]),o($V62,[2,25]),o($V62,[2,149]),{49:[1,540],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{49:[1,541],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VK1,[2,209]),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:542,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{47:$Vq2},{54:[1,543],65:$VD2},o($Vo2,[2,332]),{23:160,27:$Vz,32:$Vv,47:$VI,48:544,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vo2,[2,334]),{49:[1,545],65:$V53},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:547,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vx2,[2,248],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{49:[1,548],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:549,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,550],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:551,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,552],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:553,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[1,554],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:555,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{128:[2,207]},o($VC2,[2,205],{23:160,92:281,123:557,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,66:[1,556],69:$Vx,96:$Vy,142:$Vh2,179:$Vi2,181:$V61}),{23:160,27:$Vz,32:$Vv,47:$VI,48:558,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,559],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{52:[1,560],56:$V81,61:561,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:562,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{49:[2,66]},o($Vx2,[2,69]),o($Vx2,[2,73],{52:$VJ2}),o($Vx2,[2,74],{52:$VJ2}),{29:[1,563]},{49:[1,564]},{49:[1,565]},o($Vm1,[2,267],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:566,52:$VM2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,137:567,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vk,[2,216]),o($Vr1,[2,255]),{54:[1,568],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vr1,[2,254]),{27:[1,569]},{27:$Vp,69:$Vq,96:$Vr,144:$Vs,150:61,151:64,153:570},{27:[1,571],144:[1,572]},o($VR2,[2,191]),{54:[1,573],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VR2,[2,190]),{52:[1,574]},{52:[1,575]},{52:[1,576]},{52:[1,577]},{52:[1,578]},{29:[1,579]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:580,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:581,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VE2,[2,250],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VT2,[2,97],{52:$VJ2}),{23:160,27:$Vz,32:$Vv,47:$VI,48:582,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:583,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,51]),{27:[1,584]},{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:585,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,52]),{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:586,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,587],65:$VY2},{54:[1,588],65:$V_2},o($Vn1,[2,324]),{49:[1,589],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($V03,[2,94]),{54:[1,590],65:$V63},o($VC2,[2,234],{59:$V73,66:$V83}),o($V93,$Va3,{59:[1,594],108:$VL1,119:$Vb3,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:517,52:$V13,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,145:596,146:516,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{181:$V23},{23:160,27:$Vz,32:$Vv,63:$Vw,69:$Vx,92:597,96:$Vy},{47:[1,598]},o($VK1,[2,282],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{52:$VM2,137:599},o($VK1,[2,20],{29:[1,600]}),{31:[1,601]},{8:$VB,31:[2,40],36:602},o($Vc3,[2,99]),o($Vc3,[2,100]),o($Vc3,[2,101]),o($Vc3,[2,102]),o($Vc3,[2,103]),o($Vc3,[2,104]),o($Vc3,[2,105]),o($Vc3,[2,106]),{23:160,27:$Vz,32:$Vv,47:$VI,48:603,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:605,52:[1,606],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,103:604,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:607,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:608,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:609,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{29:[1,611],113:610},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:612,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,613],65:$VD2},o($VK1,[2,199]),{49:[1,614],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,130]),{23:160,27:$Vz,32:$Vv,47:$VI,48:615,52:[1,616],63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,617],65:$VD2},o($Vn1,[2,321]),{49:[1,618],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,322]),{49:[1,619],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,323]),{49:[1,620],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vn1,[2,325]),{49:[1,621],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{54:[1,622]},o($VC2,[2,204]),{54:[1,623],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vd3,[2,343]),{56:$V81,60:624,61:625,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{29:[1,626]},{31:[1,627]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:628,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{29:[1,629]},{29:[1,630]},o($Vm1,[2,270],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vt,[2,271]),o($Vr1,[2,256]),{49:[1,632],65:[1,631]},o($Vm1,[2,278],{65:$Vq1}),o($VQ2,[2,351]),o($VQ2,[2,352]),o($VR2,[2,192]),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:633,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:634,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:635,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:636,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:637,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:638,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,639]},o($VE2,[2,249],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o([6,8,20,25,31,32,49,54,56,57,59,62,63,65,66,71,72,73,74,75,78,79,80,81,83,84,87,109,119,138,147,148],[2,293],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V62,[2,49]),o($VZ2,[2,125],{59:[1,640]}),o($VZ2,[2,126]),o($VC2,[2,128]),o($V$2,[2,122]),o($V$2,[2,123]),o($Vn1,[2,329]),o($Ve3,[2,220],{59:[1,642],66:[1,641]}),{23:160,27:$Vz,32:$Vv,47:$VI,48:644,52:$V13,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,146:643,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:645,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vf3,[2,241]),{23:160,27:$Vz,32:$Vv,47:$VI,48:646,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:647,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,648],65:$V63},o($Vo2,[2,337]),o($Vx2,$VN2,{139:135,91:137,180:139,92:153,23:160,123:221,48:459,93:649,27:$Vz,32:$Vv,47:$VI,52:$VO2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($VK1,[2,283]),{13:528,14:529,15:530,16:531,17:532,18:533,19:534,25:$V1,30:650,31:$V33,40:526,56:$Vu,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,85:527,125:30},o($V62,[2,21]),{8:$VJ1,13:528,14:529,15:530,16:531,17:532,18:533,19:534,25:$V1,31:[2,41],56:$Vu,71:$V5,72:$V6,73:$V7,74:$V8,75:$V9,78:$Va,79:$Vb,80:$Vc,81:$Vd,83:$Ve,84:$Vf,85:651,125:30},{8:[1,652],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{49:[1,653]},{49:[2,142],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:654,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,146]),{49:[1,655],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{49:[1,656],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($V62,[2,150]),{116:657,120:[1,658]},o([8,20,22,25,27,29,31,32,46,47,50,52,56,57,62,63,69,71,72,73,74,75,78,79,80,81,83,84,96,97,101,102,105,109,110,111,112,114,117,120,122,124,130,138,142,143,144,155,171,172,173,179,181],[2,151],{115:[1,659]}),o($VK1,[2,210]),o($Vo2,[2,333]),o($Vx2,[2,245],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:660,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vx2,[2,247]),o($Vn1,[2,326]),o($Vn1,[2,327]),o($Vn1,[2,328]),o($Vn1,[2,330]),{128:[2,208]},o($Vd3,[2,342]),{54:[1,661],65:[1,662]},o($VC2,[2,93]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:663,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vg3,[2,61]),{31:[1,664]},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:665,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:666,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:220,63:$Vw,66:$VC1,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,104:667,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{27:[1,668]},{54:[1,669],65:$VD2},{54:[1,670],65:$VD2},{54:[1,671],65:$VD2},{54:[1,672],65:$VD2},{54:[1,673],65:$VD2},{31:[1,674]},o($V0,[2,280]),{23:160,27:$Vz,29:$VH2,32:$Vv,47:$VI,48:416,52:$VI2,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,90:675,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Ve3,[2,221]),{23:160,27:$Vz,32:$Vv,47:$VI,48:676,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VC2,[2,224],{59:$V73,66:$V83}),o($V93,$Va3,{59:[1,677],108:$VL1,119:$Vb3,147:[1,678],148:[1,679],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vf3,[2,236],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,235],{108:$VL1,119:$Vh3,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V93,[2,237],{59:[1,681],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vf3,[2,242]),{49:[1,682],65:$V53},{31:[1,683]},o($Vc3,[2,98]),{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,98:686,107:684,121:685,122:$Vi3,123:689,124:$Vj3,142:$Vh2,179:$Vi2,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:690,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,691],65:$VD2},o($V62,[2,147]),o($V62,[2,148]),{31:[1,692],117:[1,693],120:[1,694]},{23:160,27:$Vz,32:$Vv,47:$VI,48:696,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,118:695,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:697,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,698],65:$VD2},{29:[1,699]},{56:$V81,61:700,68:393,71:$Va1,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,78:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1},{31:[1,701]},o($Vg3,[2,62]),{31:[1,702]},{31:[1,703]},{49:[1,704],65:$VD2},{52:[1,705]},o($Vt,[2,184]),o($Vt,[2,185]),o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($V0,[2,279]),o($VZ2,[2,124]),o($Ve3,[2,222],{66:[1,706],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:707,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VC2,[2,230],{139:135,91:137,180:139,92:153,23:160,123:221,48:708,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($VC2,[2,231],{139:135,91:137,180:139,92:153,23:160,123:221,48:709,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{23:160,27:$Vz,32:$Vv,47:$VI,48:710,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:711,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VK1,[2,135]),o($V62,[2,22]),{49:[1,712],65:[1,713]},o($Vx2,[2,214]),o($Vx2,[2,162]),{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:714,142:$Vh2,179:$Vi2,181:$V61},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,123:715,142:$Vh2,179:$Vi2,181:$V61},{122:[1,716],124:[1,717],128:$Vc2,131:275,132:$Vd2,133:$Ve2,134:$Vf2},o($V62,[2,145]),{49:[2,143]},o($V62,[2,154]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,35:99,36:100,37:98,38:718,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:696,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,118:719,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{59:[1,720],65:$Vk3},o($Vl3,[2,158],{108:$VL1,119:[1,722],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V62,[2,152]),o($Vx2,[2,246]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,31:$VG,32:$Vv,33:723,35:99,36:100,37:98,38:96,39:97,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($VC2,[2,92]),o($Vg3,[2,60]),o($Vg3,[2,63]),o($Vg3,[2,64]),{27:[1,724]},{23:160,27:$Vz,32:$Vv,47:$VI,48:725,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Ve3,[2,223]),o($VC2,[2,225],{108:$VL1,119:$Vh3,147:[1,726],148:[1,727],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,226],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,227],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($V93,[2,239],{59:[1,728],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vf3,[2,238],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,34:729,35:298,36:299,37:411,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$Vg2,63:$Vw,69:$Vx,92:281,96:$Vy,98:686,121:730,122:$Vi3,123:689,124:$Vj3,142:$Vh2,179:$Vi2,181:$V61},o($Vx2,[2,163]),o($Vx2,[2,164]),o($Vx2,[2,165]),o($Vx2,[2,166]),{31:[1,731]},{59:[1,732],65:$Vk3},{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,35:99,36:100,37:734,39:733,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:735,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:736,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{31:[1,737]},{52:[1,738]},{54:[1,739],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VC2,[2,232],{139:135,91:137,180:139,92:153,23:160,123:221,48:740,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),o($VC2,[2,233],{139:135,91:137,180:139,92:153,23:160,123:221,48:741,27:$Vz,32:$Vv,47:$VI,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,96:$Vy,122:$VZ,124:$V_,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{23:160,27:$Vz,32:$Vv,47:$VI,48:742,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($V62,[2,144]),o($Vx2,[2,213]),o($V62,[2,155]),{8:$VB,11:117,12:106,13:102,14:103,15:107,16:108,17:109,18:110,19:121,20:$VC,21:113,22:$VD,23:160,24:112,25:$VE,27:$Vz,28:118,29:$VF,32:$Vv,35:99,36:100,37:734,39:743,45:114,46:$VH,47:$VI,48:104,50:$VJ,52:$VK,55:21,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,86:101,88:105,89:111,91:137,92:153,96:$Vy,97:$VQ,98:122,99:123,100:124,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,123:131,124:$V_,125:30,130:$V$,136:151,138:$Vg,139:135,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vm3,[2,161],{55:21,125:30,86:101,13:102,14:103,48:104,88:105,12:106,15:107,16:108,17:109,18:110,89:111,24:112,21:113,45:114,11:117,28:118,19:121,98:122,99:123,100:124,123:131,139:135,91:137,180:139,136:151,92:153,23:160,35:230,37:744,20:$VC,22:$VD,25:$VE,27:$Vz,29:$VF,32:$Vv,46:$VH,47:$VI,50:$VJ,52:$VK,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,96:$Vy,97:$VQ,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,124:$V_,130:$V$,138:$Vg,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{8:$VB,36:231},o($Vl3,[2,156],{108:$VL1,119:[1,745],156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vl3,[2,159],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vg3,[2,59]),{23:160,27:$Vz,32:$Vv,47:$VI,48:746,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{52:[1,747]},{59:[1,748],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{59:[1,749],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vf3,[2,240],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($Vm3,[2,160],{55:21,125:30,86:101,13:102,14:103,48:104,88:105,12:106,15:107,16:108,17:109,18:110,89:111,24:112,21:113,45:114,11:117,28:118,19:121,98:122,99:123,100:124,123:131,139:135,91:137,180:139,136:151,92:153,23:160,35:230,37:744,20:$VC,22:$VD,25:$VE,27:$Vz,29:$VF,32:$Vv,46:$VH,47:$VI,50:$VJ,52:$VK,56:$V2,57:$V3,62:$V4,63:$Vw,69:$Vx,71:$VL,72:$VM,73:$VN,74:$V8,75:$VO,78:$Va,79:$VP,80:$Vc,81:$Vd,83:$Ve,84:$Vf,96:$Vy,97:$VQ,101:$VR,102:$VS,105:$VT,109:$VU,110:$VV,111:$VW,112:$VX,114:$VY,122:$VZ,124:$V_,130:$V$,138:$Vg,142:$V01,143:$Vi,144:$Vj,155:$V11,171:$V21,172:$V31,173:$V41,179:$V51,181:$V61}),{8:$VB,36:382},{23:160,27:$Vz,32:$Vv,47:$VI,48:750,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{54:[1,751],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},{23:160,27:$Vz,32:$Vv,47:$VI,48:752,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:753,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},{23:160,27:$Vz,32:$Vv,47:$VI,48:754,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vl3,[2,157],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{52:[1,755]},{54:[1,756],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($VC2,[2,228],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),o($VC2,[2,229],{108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52}),{23:160,27:$Vz,32:$Vv,47:$VI,48:757,63:$Vw,69:$Vx,71:$VD1,72:$VE1,73:$VF1,75:$VG1,79:$VH1,91:137,92:153,96:$Vy,122:$VZ,123:221,124:$V_,139:135,142:$V01,143:$Vi,144:$Vj,171:$V21,172:$V31,173:$V41,179:$V51,180:139,181:$V61},o($Vm1,[2,276]),{54:[1,758],108:$VL1,156:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,172:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52},o($Vm1,[2,275])], -defaultActions: {4:[2,1],96:[2,38],163:[2,67],182:[2,57],205:[2,58],468:[2,207],474:[2,66],622:[2,208],691:[2,143]}, +table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],21:[1,19],26:$V1,33:[1,21],56:22,57:$V2,58:$V3,63:$V4,64:[1,20],72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,126:31,139:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),o($V0,[2,18]),{28:[1,41],155:[1,40]},{30:[1,42]},{48:[1,43]},{33:[1,45],56:44,57:$Vh,58:$V3,64:[1,46]},{140:48,144:$Vi,145:$Vj},o($Vk,$Vl,{141:51,77:$Vm,78:$Vn,142:$Vo}),o($Vk,$Vl,{141:55,142:$Vo}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:56,154:57},{155:[1,63]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:64},{155:[1,66]},o($Vt,[2,173]),{26:$V1,57:$Vu,72:$V5,73:$V6,74:$V7,80:$Vb,126:67},{24:72,28:[1,69],33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},{57:[1,77]},{24:72,28:$Vz,33:$Vv,53:[1,80],64:$Vw,70:$Vx,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,53:[1,84],64:$Vw,70:$Vx,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,53:[1,87],64:$Vw,70:$Vx,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,53:[1,90],64:$Vw,70:$Vx,97:$Vy,127:88,128:89},{24:72,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{28:[1,93]},{30:[1,95],48:[1,94]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:96,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:$V81,57:$V91,59:163,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,181]},{56:182,57:$Vh,58:$V3},{56:183,57:$Vh,58:$V3},{28:[1,184]},o($Vn1,[2,217]),o($Vo1,[2,220]),o($Vo1,[2,221]),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:186,154:185},o($Vk,$Vl,{141:187,142:$Vo}),o($Vk,$Vl,{141:188,142:$Vo}),{48:[1,189]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:190},o([6,8,20,21,26,32,33,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,139],$Vp1,{150:192,53:$Vq1,129:[1,191]}),o($Vn1,[2,276],{66:$Vr1}),o($Vs1,[2,261]),o($Vs1,[2,262]),o($Vs1,[2,263]),{153:[1,195]},o($Vt1,[2,267]),{48:[1,196]},o($Vn1,[2,279],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1}),{48:[1,197]},o($Vt,[2,174]),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},o([6,8,20,21,26,32,33,53,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,129,139],$Vu1,{48:$Vv1,153:$Vw1}),o($Vt,[2,179],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,200]}),o($Vz1,$VA1,{130:201,53:$VB1}),{153:[1,203]},{153:[1,204]},{153:[1,205]},o($VC1,[2,355],{153:[1,206]}),{28:[1,207]},o($Vt,[2,175],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,208]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},o($VC1,$Vu1,{153:$Vw1}),o($Vt,[2,176],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,211]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},o($Vt,[2,177],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,213]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},o($Vt,[2,178],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,215]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{129:[1,217]},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:218,128:210},{48:[1,219]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:220,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:229,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,230]},{32:[2,39]},{11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:[2,29],33:$Vv,36:232,38:231,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,32:[2,31],37:233},o($VJ1,[2,35],{37:234,8:$VB}),o($VJ1,[2,38],{8:$VK1}),o($VL1,[2,108]),o($VL1,[2,109]),o($VL1,[2,110]),o($VL1,[2,111],{88:[1,236],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VL1,[2,113]),o($VL1,[2,114]),o($VL1,[2,115]),o($VL1,[2,116]),o($VL1,[2,117]),o($VL1,[2,118]),o($VL1,[2,119]),o($VL1,[2,120]),o($VL1,[2,121]),o($V72,[2,49]),{42:261,43:[1,262],44:[1,263],45:[1,264],48:[1,260]},{24:162,28:$Vz,30:[1,265],33:$Vv,48:$VJ,49:267,53:[1,266],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,55]),o($V72,[2,56]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:268,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,45]),o($VL1,[2,137]),o($VL1,[2,138]),o($VL1,[2,139]),o($VL1,[2,140]),o($VL1,[2,141]),o($VL1,[2,142]),o($Vk,$Vl,{141:51,71:270,48:$V82,53:$V92,77:$Vm,78:$Vn,142:$Vo}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:272,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:273,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:274,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o([8,32,88,109,110,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Va2,{132:277,123:$Vb2,125:$Vc2,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:282,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:287,143:$Vi2,180:$Vj2,182:$V71},o($Vo1,[2,317],{182:$Vk2}),o($Vo1,[2,318]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:289,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo1,[2,320]),o($Vo1,[2,321],{182:$Vl2}),o($Vo1,[2,322]),{63:[1,292],95:291},{28:[1,293]},{24:294,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{24:295,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy},{48:[1,296]},{48:[1,297]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:298,36:300,37:301,38:299,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{33:$Vm2,64:$Vn2,96:302,97:$Vo2},{48:[1,306]},{48:[1,307]},o($V72,[2,154]),o($V72,[2,155]),{129:[1,308]},o($VL1,[2,199],{140:136,92:138,181:140,93:155,24:162,124:223,49:309,28:$Vz,33:$Vv,48:$VJ,53:[1,310],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,$Vq2,{48:$Vr2,182:$Vs2}),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:313,97:$Vy},{24:72,28:$Vz,33:$Vv,48:$Vt2,53:[1,316],64:$Vw,70:$Vx,71:315,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,48:$Vu2,53:[1,319],64:$Vw,70:$Vx,71:318,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,48:$Vv2,53:[1,322],64:$Vw,70:$Vx,71:321,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,48:$Vw2,53:[1,325],64:$Vw,70:$Vx,71:324,97:$Vy,127:88,128:89},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:327,136:326,143:$Vi2,180:$Vj2,182:$V71},o($Vx2,[2,342],{183:328,53:[1,329]}),{50:[1,330]},{50:[2,66],66:[1,331]},{50:[2,68]},o($Vy2,[2,71]),{28:[1,332],70:[1,333]},o($Vz2,[2,76]),o($Vz2,[2,77]),o($Vz2,[2,78]),{72:[1,334],73:[1,335],74:[1,336],80:[1,337]},{77:[1,338],78:[1,339]},o($Vz2,[2,84]),o($Vz2,[2,85]),o($Vz2,[2,87]),o($Vz2,[2,88]),o($Vz2,[2,89]),o($Vz2,[2,90]),o($Vz2,[2,91]),o($Vz2,[2,92]),{50:$V81,57:$V91,59:340,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,341]},{48:[1,342]},{48:$Vv1},o($Vt,[2,268],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,343]}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:344},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:346,154:345},{143:[1,347]},o($Vn1,[2,274],{66:$Vr1}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:348,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt1,[2,260],{53:$VA2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:351,55:[1,350],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:352,152:65},{28:[1,353],145:[1,354]},{28:[1,355]},{28:[1,356]},{28:$VB2,145:$VC2,185:357},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,128:360},{24:162,28:$Vz,33:$Vv,48:$VJ,49:361,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vz1,[2,196],{53:[1,362]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:364,55:[1,363],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$VB2,145:$VC2,185:365},{28:$VB2,145:$VC2,185:366},{28:$VB2,145:$VC2,185:367},{28:$VB2,145:$VC2,185:368},{48:[2,59]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:369,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,370],66:$Vx1},o($VD2,$Vy1),{24:162,28:$Vz,33:$Vv,48:$VJ,49:371,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,372],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:373,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,374],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:375,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,376],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:377,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,378],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:379,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,380],66:$VE2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:382,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,254],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,$Va2,{123:$Vb2,125:$Vc2}),{48:$Vt2,53:$V92,71:315},{48:$Vu2,53:$V92,71:318},{48:$Vv2,53:$V92,71:321},{48:$V82,53:$V92,71:270},{48:$Vw2,53:$V92,71:324},{32:[1,383]},o($V0,[2,24]),{8:$VB,32:[2,30],37:384},o($VJ1,[2,32],{37:385,8:$VB}),o($VJ1,[2,37],{8:$VK1}),o($VJ1,[2,36],{8:$VK1}),o($V72,[2,44]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:386,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:387,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:388,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:389,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:390,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:391,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:392,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:393,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{57:$V91,62:394,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:396,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:397,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:398,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:399,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:400,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:401,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:402,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:403,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:404,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:405,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:406,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:407,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:408,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:409,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:410,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:411,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:412,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,46]),o($VG2,[2,47]),o($VG2,[2,48]),{28:$VH2,52:414},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:416,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:[1,421],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{32:[1,422]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:423,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,424],53:$VK2},{55:$VL2},o($Vo1,[2,302]),o($Vo1,[2,310]),o($Vo1,[2,311]),o($Vo1,[2,315]),o($Vo1,[2,316]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:427,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VM2,[2,202],{138:428,53:$VN2}),o($VM2,[2,203]),o($VM2,[2,204]),o($VM2,[2,205]),o($Vo1,[2,313]),o($Vp2,$Vq2,{182:$Vs2}),{182:$Vk2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:430,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$Vl2},o($Vo1,[2,314]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:431,97:$Vy},{50:[1,432],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:433,97:$Vy},{33:$Vm2,64:$Vn2,96:434,97:$Vo2},o([33,64,97],[2,132]),{53:$Vq1,129:[1,435],150:436},o($VL1,[2,20],{130:201,27:[1,437],30:[1,438],53:$VB1,129:$VA1}),o($VL1,[2,19]),{13:443,19:440,24:162,26:$V1,28:$Vz,33:$Vv,48:$Vh2,57:$Vu,64:$Vw,70:$Vx,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,80:$Vb,93:283,97:$Vy,99:441,107:439,124:442,126:31,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:444,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{110:[1,445]},{8:$VB,37:447,110:[1,446]},o([20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,25],{37:448,8:$VB}),o($V72,[2,27]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:449,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,133]),o($VG2,[2,134]),o($VG2,[2,135]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:450,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:451,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,53:[1,453],64:$Vw,70:$Vx,92:452,93:454,97:$Vy},o($VL1,[2,200],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:455,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,333],{48:[1,457],143:[1,456],180:[1,458]}),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,94:459,49:461,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,[2,337]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:462,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,463],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:464,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,465],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:466,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,467],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:468,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,469],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{55:[1,470],66:[1,471]},o($VD2,[2,208]),o($Vx2,[2,343],{53:[1,472]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,60:$VQ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:473},{30:[1,477],60:[1,476]},{57:$V91,67:[1,478],68:479,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},o($Vy2,[2,72],{71:480,53:$V92}),o($Vy2,[2,73],{71:481,53:$V92}),o($Vz2,[2,79]),o($Vz2,[2,80]),o($Vz2,[2,81]),o($Vz2,[2,86]),o($Vz2,[2,82]),o($Vz2,[2,83]),{50:[1,482]},{50:$V81,57:$V91,59:483,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{50:$V81,57:$V91,59:484,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:485,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt,[2,270],{66:$Vr1}),o($Vt,[2,271],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,486]}),{50:[1,487]},o($Vn1,[2,275],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:489,55:[1,488],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vs1,[2,255]),{55:[1,490],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vt1,[2,266]),o($Vs1,[2,264]),o($Vs1,[2,265]),{66:[1,491]},{50:[1,492]},o($VC1,[2,354],{153:$VR2}),o($VS2,[2,359]),o($VS2,[2,360]),o([6,8,20,21,26,32,33,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],[2,197]),o($Vn1,[2,184],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:495,55:[1,494],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VT2,[2,191]),{55:[1,496],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VC1,[2,350],{153:$VR2}),o($VC1,[2,351],{153:$VR2}),o($VC1,[2,352],{153:$VR2}),o($VC1,[2,356],{153:$VR2}),o($Vn1,[2,180],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,497]},o($Vn1,[2,181],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,498]},o($Vn1,[2,182],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,499]},o($Vn1,[2,183],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,500]},o($Vn1,[2,185],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,501]},{50:[1,502],66:$VE2},{30:[1,503]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:505,64:$Vw,67:[1,504],70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,253],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V0,[2,283]),o($VJ1,[2,34],{8:$VK1}),o($VJ1,[2,33],{8:$VK1}),o($VL1,[2,112],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,286],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,287],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,288],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,289],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,290],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,291],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,163,164,165,166,167,168,169],[2,292],{157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,[2,293]),o($VV2,[2,97],{71:506,53:$V92}),o($VW2,[2,294],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{60:[1,507],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VW2,[2,296],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,297],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,298],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,299],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,300],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,301],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,303],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,304],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VZ2,[2,305],{179:$V62}),o($VZ2,[2,306],{179:$V62}),o($VZ2,[2,307],{179:$V62}),o($VZ2,[2,308],{179:$V62}),o($Vo1,[2,309]),{50:[1,508],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,51]),{8:$VB,37:447},{32:[1,509],66:$V_2},o($V$2,[2,128],{60:[1,511]}),{55:[1,512],66:$V03},o($VD2,[2,130]),o($V13,[2,122],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{28:$VH2,52:514},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:515,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,54]),o($V72,[2,57]),{50:[1,516],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:517,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,518]},o($V23,[2,96]),o([8,32,50,66,110],[2,213],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([8,32,50,66,109,110],[2,214]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:519,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,523],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vp2,[2,338]),o($Vo1,[2,319],{182:$V43}),o($Vp2,[2,340]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:525,97:$Vy},{24:162,28:$Vz,33:$Vv,48:$VJ,49:526,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:$VA2,129:[1,527]},{28:[1,528]},{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:529,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},{8:[1,539],109:[1,540]},o($V63,[2,169]),o($V63,[2,170]),o($V63,[2,171],{132:277,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),o($V63,[2,172]),{50:[1,541],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{48:[1,542]},{48:[1,543]},o($V72,[2,28]),o($V72,[2,26]),o($V72,[2,150]),{50:[1,544],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,545],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VL1,[2,211]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:546,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:$Vr2},{55:[1,547],66:$VE2},o($Vp2,[2,334]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:548,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,336]),{50:[1,549],66:$V73},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:551,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,250],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{50:[1,552],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:553,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,554],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:555,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,556],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:557,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,558],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:559,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{129:[2,209]},o($VD2,[2,207],{24:162,93:283,124:561,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,67:[1,560],70:$Vx,97:$Vy,143:$Vi2,180:$Vj2,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,60:$VQ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:562},{55:[1,563]},{55:[2,344],60:[1,564],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:565,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,566],57:$V91,62:567,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:568,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[2,67]},o($Vy2,[2,70]),o($Vy2,[2,74],{53:$VK2}),o($Vy2,[2,75],{53:$VK2}),{30:[1,569]},{50:[1,570]},{50:[1,571]},o($Vn1,[2,269],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:572,53:$VN2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,138:573,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vk,[2,218]),o($Vs1,[2,257]),{55:[1,574],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vs1,[2,256]),{28:[1,575]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:576},{28:[1,577],145:[1,578]},o($VT2,[2,193]),{55:[1,579],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VT2,[2,192]),{53:[1,580]},{53:[1,581]},{53:[1,582]},{53:[1,583]},{53:[1,584]},{30:[1,585]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:586,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:587,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,252],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VV2,[2,98],{53:$VK2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:588,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:589,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,52]),{28:[1,590]},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:591,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,53]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:592,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,593],66:$V_2},{55:[1,594],66:$V03},o($Vo1,[2,326]),{50:[1,595],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V23,[2,95]),{55:[1,596],66:$V83},o($VD2,[2,236],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,600],109:$VM1,120:$Vd3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:602,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$V43},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:603,97:$Vy},{48:[1,604]},o($VL1,[2,284],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:$VN2,138:605},o($VL1,[2,21],{30:[1,606]}),{32:[1,607]},{8:$VB,32:[2,41],37:608},o($Ve3,[2,100]),o($Ve3,[2,101]),o($Ve3,[2,102]),o($Ve3,[2,103]),o($Ve3,[2,104]),o($Ve3,[2,105]),o($Ve3,[2,106]),o($Ve3,[2,107]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:609,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:611,53:[1,612],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,104:610,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:613,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:614,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:615,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,617],114:616},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:618,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,619],66:$VE2},o($VL1,[2,201]),{50:[1,620],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,131]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:621,53:[1,622],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,623],66:$VE2},o($Vo1,[2,323]),{50:[1,624],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,324]),{50:[1,625],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,325]),{50:[1,626],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,327]),{50:[1,627],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,628]},o($VD2,[2,206]),{55:[1,629]},o($Vf3,[2,349]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:630,55:[2,346],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[2,347],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{57:$V91,61:631,62:632,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{30:[1,633]},{32:[1,634]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:635,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,636]},{30:[1,637]},o($Vn1,[2,272],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vt,[2,273]),o($Vs1,[2,258]),{50:[1,639],66:[1,638]},o($Vn1,[2,280],{66:$Vr1}),o($VS2,[2,357]),o($VS2,[2,358]),o($VT2,[2,194]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:640,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:641,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:642,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:643,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:644,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:645,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,646]},o($VF2,[2,251],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149],[2,295],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,50]),o($V$2,[2,126],{60:[1,647]}),o($V$2,[2,127]),o($VD2,[2,129]),o($V13,[2,123]),o($V13,[2,124]),o($Vo1,[2,331]),o($Vg3,[2,222],{60:[1,649],67:[1,648]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:651,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,147:650,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:652,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vh3,[2,243]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:653,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:654,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,655],66:$V83},o($Vp2,[2,339]),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,49:461,94:656,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VL1,[2,285]),{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:657,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},o($V72,[2,22]),{8:$VK1,13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,32:[2,42],57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:658,126:31},{8:[1,659],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,660]},{50:[2,143],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:661,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,147]),{50:[1,662],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,663],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,151]),{117:664,121:[1,665]},o([8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,152],{116:[1,666]}),o($VL1,[2,212]),o($Vp2,[2,335]),o($Vy2,[2,247],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:667,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,249]),o($Vo1,[2,328]),o($Vo1,[2,329]),o($Vo1,[2,330]),o($Vo1,[2,332]),{129:[2,210]},o($Vf3,[2,348]),{55:[2,345],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,668],66:[1,669]},o($VD2,[2,94]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:670,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vi3,[2,62]),{32:[1,671]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:672,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:673,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:674,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:[1,675]},{55:[1,676],66:$VE2},{55:[1,677],66:$VE2},{55:[1,678],66:$VE2},{55:[1,679],66:$VE2},{55:[1,680],66:$VE2},{32:[1,681]},o($V0,[2,282]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:682,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,223]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:683,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,226],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,684],109:$VM1,120:$Vd3,148:[1,685],149:[1,686],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,238],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,237],{109:$VM1,120:$Vj3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,239],{60:[1,688],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,244]),{50:[1,689],66:$V73},{32:[1,690]},o($Ve3,[2,99]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,108:691,122:692,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:697,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,698],66:$VE2},o($V72,[2,148]),o($V72,[2,149]),{32:[1,699],118:[1,700],121:[1,701]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:702,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:704,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,705],66:$VE2},{30:[1,706]},{57:$V91,62:707,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{32:[1,708]},o($Vi3,[2,63]),{32:[1,709]},{32:[1,710]},{50:[1,711],66:$VE2},{53:[1,712]},o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($Vt,[2,189]),o($Vt,[2,190]),o($V0,[2,281]),o($V$2,[2,125]),o($Vg3,[2,224],{67:[1,713],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:714,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,232],{140:136,92:138,181:140,93:155,24:162,124:223,49:715,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,233],{140:136,92:138,181:140,93:155,24:162,124:223,49:716,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:717,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:718,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VL1,[2,136]),o($V72,[2,23]),{50:[1,719],66:[1,720]},o($Vy2,[2,216]),o($Vy2,[2,164]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:721,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:722,143:$Vi2,180:$Vj2,182:$V71},{123:[1,723],125:[1,724],129:$Vd2,132:277,133:$Ve2,134:$Vf2,135:$Vg2},o($V72,[2,146]),{50:[2,144]},o($V72,[2,156]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:99,39:725,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:726,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{60:[1,727],66:$Vm3},o($Vn3,[2,160],{109:$VM1,120:[1,729],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,153]),o($Vy2,[2,248]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:730,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,93]),o($Vi3,[2,61]),o($Vi3,[2,64]),o($Vi3,[2,65]),{28:[1,731]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:732,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,225]),o($VD2,[2,227],{109:$VM1,120:$Vj3,148:[1,733],149:[1,734],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,228],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,229],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,241],{60:[1,735],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,240],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:736,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,122:737,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},o($Vy2,[2,165]),o($Vy2,[2,166]),o($Vy2,[2,167]),o($Vy2,[2,168]),{32:[1,738]},{60:[1,739],66:$Vm3},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:740,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:742,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:743,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,744]},{53:[1,745]},{55:[1,746],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,234],{140:136,92:138,181:140,93:155,24:162,124:223,49:747,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,235],{140:136,92:138,181:140,93:155,24:162,124:223,49:748,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:749,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,145]),o($Vy2,[2,215]),o($V72,[2,157]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:750,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo3,[2,163],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:233},o($Vn3,[2,158],{109:$VM1,120:[1,752],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vn3,[2,161],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vi3,[2,60]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:753,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,754]},{60:[1,755],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{60:[1,756],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vh3,[2,242],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo3,[2,162],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:384},{24:162,28:$Vz,33:$Vv,48:$VJ,49:757,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,758],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:759,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:760,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:761,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn3,[2,159],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:[1,762]},{55:[1,763],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,230],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,231],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:764,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn1,[2,278]),{55:[1,765],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vn1,[2,277])], +defaultActions: {4:[2,1],97:[2,39],165:[2,68],184:[2,58],207:[2,59],470:[2,209],478:[2,67],628:[2,210],698:[2,144]}, parseError: function parseError (str, hash) { if (hash.recoverable) { this.trace(str); @@ -1416,214 +1417,216 @@ case 1: /* console.log("MULTILINE COMMENT: "+yy_.yytext); */ break; case 2: /* console.log("SINGLE LINE COMMENT: "+yy_.yytext); */ break; -case 3: return 75; +case 3: yy_.yytext = yy_.yytext.replace(/^#pragma\s+/, ''); return 21; break; case 4: return 76; break; case 5: return 77; break; -case 6: return 25; +case 6: return 78; break; -case 7: return 'DECLARE'; +case 7: return 26; break; -case 8: return 22; +case 8: return 'DECLARE'; break; -case 9: return 26; +case 9: return 23; break; -case 10: return 138; +case 10: return 27; break; -case 11: return 108; +case 11: return 139; break; -case 12: return 162; +case 12: return 109; break; -case 13: return 84; +case 13: return 163; break; -case 14: return 83; +case 14: return 85; break; -case 15: return 155 +case 15: return 84; break; -case 16: return 74 +case 16: return 156 break; -case 17: return 80 +case 17: return 75 break; case 18: return 81 break; -case 19: return 63 +case 19: return 82 break; -case 20: return 96 +case 20: return 64 break; -case 21: return 32 +case 21: return 97 break; -case 22: return 71 +case 22: return 33 break; case 23: return 72 break; case 24: return 73 break; -case 25: return 79 +case 25: return 74 break; -case 26: return 78 +case 26: return 80 break; -case 27: return 105 +case 27: return 79 break; -case 28: return 109 +case 28: return 106 break; case 29: return 110 break; -case 30: return 102 +case 30: return 111 break; -case 31: return 101 +case 31: return 103 break; -case 32: return 114 +case 32: return 102 break; -case 33: return 'ELSEIF' +case 33: return 115 break; -case 34: return 115 +case 34: return 'ELSEIF' break; -case 35: return 112 +case 35: return 116 break; -case 36: return 120 +case 36: return 113 break; -case 37: return 117 +case 37: return 121 break; -case 38: return 46 +case 38: return 118 break; -case 39: return 154 +case 39: return 47 break; -case 40: return 141 +case 40: return 155 break; -case 41: return 111 +case 41: return 142 break; -case 42: return 97 +case 42: return 112 break; -case 43: return 57 +case 43: return 98 break; -case 44: return 62 +case 44: return 58 break; -case 45: return 56 +case 45: return 63 break; -case 46: return 130 +case 46: return 57 break; -case 47: return 42 +case 47: return 131 break; case 48: return 43 break; case 49: return 44 break; -case 50: return 20 +case 50: return 45 break; -case 51: return 147 +case 51: return 20 break; case 52: return 148 break; -case 53: return 66 +case 53: return 149 break; -case 54: return 119 +case 54: return 67 break; -case 55: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 142; +case 55: return 120 break; -case 56: yy_.yytext = yy_.yytext.slice(1,-1); return 143; +case 56: yy_.yytext = yy_.yytext.replace(/\_/g, ""); return 143; break; case 57: yy_.yytext = yy_.yytext.slice(1,-1); return 144; break; -case 58: return 27; +case 58: yy_.yytext = yy_.yytext.slice(1,-1); return 145; break; -case 59: yy_.yytext = yy_.yytext.slice(1); return 69; +case 59: return 28; break; -case 60: yy_.yytext = yy_.yytext.slice(1); return 50; +case 60: yy_.yytext = yy_.yytext.slice(1); return 70; break; -case 61: yy_.yytext = yy_.yytext.slice(1); return 179; +case 61: yy_.yytext = yy_.yytext.slice(1); return 51; break; -case 62: return 178; +case 62: yy_.yytext = yy_.yytext.slice(1); return 180; break; -case 63: return 122; +case 63: return 179; break; -case 64: return 124; +case 64: return 123; break; -case 65: return 132; +case 65: return 125; break; case 66: return 133; break; case 67: return 134; break; -case 68: return 172; +case 68: return 135; break; case 69: return 173; break; case 70: return 174; break; -case 71: return "'"; +case 71: return 175; break; -case 72: return "?"; +case 72: return "'"; break; -case 73: return "%"; +case 73: return "?"; break; -case 74: return "\\\\"; +case 74: return "%"; break; -case 75: return "/"; +case 75: return "\\\\"; break; -case 76: return 8; +case 76: return "/"; break; -case 77: return 65; +case 77: return 8; break; -case 78: return 152; +case 78: return 66; break; -case 79: return 163; +case 79: return 153; break; -case 80: return 168; +case 80: return 164; break; -case 81: return 165; +case 81: return 169; break; case 82: return 166; break; case 83: return 167; break; -case 84: return 169; +case 84: return 168; break; case 85: return 170; break; -case 86: return 160; +case 86: return 171; break; case 87: return 161; break; -case 88: return 158; +case 88: return 162; break; case 89: return 159; break; -case 90: return 87; +case 90: return 160; +break; +case 91: return 88; break; -case 91: return 157; +case 92: return 158; break; -case 92: return 156; +case 93: return 157; break; -case 93: return 128; +case 94: return 129; break; -case 94: return 47; +case 95: return 48; break; -case 95: return 49; +case 96: return 50; break; -case 96: return 52; +case 97: return 53; break; -case 97: return 54; +case 98: return 55; break; -case 98: return 29; +case 99: return 30; break; -case 99: return 31; +case 100: return 32; break; -case 100: return '::'; +case 101: return '::'; break; -case 101: return 59; +case 102: return 60; break; -case 102: return 171; +case 103: return 172; break; -case 103: return 6; +case 104: return 6; break; -case 104: console.log("INVALID: " + yy_.yytext); return 'INVALID' +case 105: console.log("INVALID: " + yy_.yytext); return 'INVALID' break; } }, -rules: [/^(?:\s+)/,/^(?:\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)/,/^(?:\/\/.*)/,/^(?:col\b)/,/^(?:witness\b)/,/^(?:fixed\b)/,/^(?:container\b)/,/^(?:declare\b)/,/^(?:use\b)/,/^(?:alias\b)/,/^(?:include\b)/,/^(?:in\b)/,/^(?:is\b)/,/^(?:publictable\b)/,/^(?:public\b)/,/^(?:constant\b)/,/^(?:const\b)/,/^(?:proofval\b)/,/^(?:subproofval\b)/,/^(?:subproof\b)/,/^(?:air\b)/,/^(?:proof\b)/,/^(?:int\b)/,/^(?:fe\b)/,/^(?:expr\b)/,/^(?:string\b)/,/^(?:challenge\b)/,/^(?:for\b)/,/^(?:while\b)/,/^(?:do\b)/,/^(?:break\b)/,/^(?:continue\b)/,/^(?:if\b)/,/^(?:elseif\b)/,/^(?:else\b)/,/^(?:switch\b)/,/^(?:case\b)/,/^(?:default\b)/,/^(?:when\b)/,/^(?:aggregate\b)/,/^(?:stage\b)/,/^(?:once\b)/,/^(?:on\b)/,/^(?:private\b)/,/^(?:final\b)/,/^(?:function\b)/,/^(?:return\b)/,/^(?:first\b)/,/^(?:last\b)/,/^(?:frame\b)/,/^(?:debugger\b)/,/^(?:\.\.\+\.\.)/,/^(?:\.\.\*\.\.)/,/^(?:\.\.\.)/,/^(?:\.\.)/,/^(?:(0x[0-9A-Fa-f][0-9A-Fa-f_]*)|([0-9][0-9_]*))/,/^(?:"[^"]+")/,/^(?:`[^`]+`)/,/^(?:[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:&[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:@[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:\$[0-9][0-9]*)/,/^(?:\*\*)/,/^(?:\+\+)/,/^(?:--)/,/^(?:\+=)/,/^(?:-=)/,/^(?:\*=)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:')/,/^(?:\?)/,/^(?:%)/,/^(?:\\\\)/,/^(?:\/)/,/^(?:;)/,/^(?:,)/,/^(?:\.)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:&)/,/^(?:\|)/,/^(?:\^)/,/^(?:<<)/,/^(?:>>)/,/^(?:<=)/,/^(?:>=)/,/^(?:<)/,/^(?:>)/,/^(?:===)/,/^(?:!=)/,/^(?:==)/,/^(?:=)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:::)/,/^(?::)/,/^(?:!)/,/^(?:$)/,/^(?:.)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],"inclusive":true}} +rules: [/^(?:\s+)/,/^(?:\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)/,/^(?:\/\/.*)/,/^(?:#pragma\s+[^\r\n]*)/,/^(?:col\b)/,/^(?:witness\b)/,/^(?:fixed\b)/,/^(?:container\b)/,/^(?:declare\b)/,/^(?:use\b)/,/^(?:alias\b)/,/^(?:include\b)/,/^(?:in\b)/,/^(?:is\b)/,/^(?:publictable\b)/,/^(?:public\b)/,/^(?:constant\b)/,/^(?:const\b)/,/^(?:proofval\b)/,/^(?:subproofval\b)/,/^(?:subproof\b)/,/^(?:air\b)/,/^(?:proof\b)/,/^(?:int\b)/,/^(?:fe\b)/,/^(?:expr\b)/,/^(?:string\b)/,/^(?:challenge\b)/,/^(?:for\b)/,/^(?:while\b)/,/^(?:do\b)/,/^(?:break\b)/,/^(?:continue\b)/,/^(?:if\b)/,/^(?:elseif\b)/,/^(?:else\b)/,/^(?:switch\b)/,/^(?:case\b)/,/^(?:default\b)/,/^(?:when\b)/,/^(?:aggregate\b)/,/^(?:stage\b)/,/^(?:once\b)/,/^(?:on\b)/,/^(?:private\b)/,/^(?:final\b)/,/^(?:function\b)/,/^(?:return\b)/,/^(?:first\b)/,/^(?:last\b)/,/^(?:frame\b)/,/^(?:debugger\b)/,/^(?:\.\.\+\.\.)/,/^(?:\.\.\*\.\.)/,/^(?:\.\.\.)/,/^(?:\.\.)/,/^(?:(0x[0-9A-Fa-f][0-9A-Fa-f_]*)|([0-9][0-9_]*))/,/^(?:"[^"]+")/,/^(?:`[^`]+`)/,/^(?:[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:&[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:@[a-zA-Z_][a-zA-Z$_0-9]*)/,/^(?:\$[0-9][0-9]*)/,/^(?:\*\*)/,/^(?:\+\+)/,/^(?:--)/,/^(?:\+=)/,/^(?:-=)/,/^(?:\*=)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:')/,/^(?:\?)/,/^(?:%)/,/^(?:\\\\)/,/^(?:\/)/,/^(?:;)/,/^(?:,)/,/^(?:\.)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:&)/,/^(?:\|)/,/^(?:\^)/,/^(?:<<)/,/^(?:>>)/,/^(?:<=)/,/^(?:>=)/,/^(?:<)/,/^(?:>)/,/^(?:===)/,/^(?:!=)/,/^(?:==)/,/^(?:=)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:::)/,/^(?::)/,/^(?:!)/,/^(?:$)/,/^(?:.)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105],"inclusive":true}} }); return lexer; })(); diff --git a/src/assign.js b/src/assign.js index 7fef667..320261d 100644 --- a/src/assign.js +++ b/src/assign.js @@ -2,14 +2,15 @@ const Expression = require("./expression.js"); const Context = require('./context.js'); const {assert, assertLog} = require('./assert.js'); const NonRuntimeEvaluableItem = require('./expression_items/non_runtime_evaluable_item.js'); +const Debug = require('./debug.js'); module.exports = class Assign { constructor () { } assign (name, indexes, value) { - console.log(value); + if (Debug.active) console.log(value); value = this.getValue(value); - console.log(value); + if (Debug.active) console.log(value); assert(value !== null); return this.#assign(name, indexes, value); } @@ -34,7 +35,7 @@ module.exports = class Assign { return Context.references.set(name, indexes, value);*/ } assignType(type, name, indexes, value) { - console.log(type); + if (Debug.active) console.log(type); switch (type) { case 'int': return this.assignTypeInt(name, indexes, value, type); case 'expr': return this.assignTypeExpr(name, indexes, value, type); @@ -83,9 +84,9 @@ module.exports = class Assign { } value = value.instance(true); if (Context.sourceRef === 'std_sum.pil:195') { - console.log('XXX'); + if (Debug.active) console.log('XXX'); } - console.log(`ASSIGN ${Context.sourceRef} ${value}`); + if (Debug.active) console.log(`ASSIGN ${Context.sourceRef} ${value}`); Context.references.set(name, indexes, value); } } diff --git a/src/debug.js b/src/debug.js new file mode 100644 index 0000000..a015e2f --- /dev/null +++ b/src/debug.js @@ -0,0 +1,7 @@ +const {assert} = require('./assert.js'); + +class Debug { + static active = false; +} + +module.exports = Debug; \ No newline at end of file diff --git a/src/definition_items/expression_variable.js b/src/definition_items/expression_variable.js index afde773..ee33b06 100644 --- a/src/definition_items/expression_variable.js +++ b/src/definition_items/expression_variable.js @@ -1,24 +1,27 @@ const Variable = require("./variable.js"); -const ExpressionClass = require('../expression.js'); +const ExpressionClass = require('../expression_class.js'); +const Debug = require('../debug.js'); const ValueItem = require('../expression_items/value_item.js'); const util = require('util'); const {assert, assertLog} = require('../assert.js'); module.exports = class ExpressionVariable extends Variable { constructor (id, properties = {}) { super(id, properties); - this.value = new ExpressionClass(); + this.value = new (ExpressionClass.get()); } setValue(value) { - console.log('================================================================'); - console.log(util.inspect(value, false, 10, true)); - console.log('================================================================'); + if (Debug.active) { + console.log('================================================================'); + console.log(util.inspect(value, false, 10, true)); + console.log('================================================================'); + } // super.setValue(value); - if (value instanceof ExpressionClass) { + if (typeof value.instance === 'function') { assert(value.stack.length > 0); this.value = value.instance(); return; } - console.log(value); + if (Debug.active) console.log(value); this.value = value.clone(); /* if (value instanceof ExpressionClass || value instanceof ValueItem) { diff --git a/src/definition_items/int_variable.js b/src/definition_items/int_variable.js index 5b570e6..49bf708 100644 --- a/src/definition_items/int_variable.js +++ b/src/definition_items/int_variable.js @@ -1,6 +1,7 @@ const {assert, assertLog} = require('../assert.js'); const Variable = require("./variable.js"); const ExpressionItem = require('../expression_items/int_value.js'); +const Debug = require('../debug.js'); class IntVariable extends Variable { constructor (value = 0n) { @@ -14,7 +15,7 @@ class IntVariable extends Variable { super(value); } setValue(value) { - console.log(value); + if (Debug.active) console.log(value); if (typeof value.asInt === 'function') { value = value.asInt(); } diff --git a/src/definition_items/witness_col.js b/src/definition_items/witness_col.js index d43c0f2..a98c899 100644 --- a/src/definition_items/witness_col.js +++ b/src/definition_items/witness_col.js @@ -1,15 +1,16 @@ const ProofStageItem = require("./proof_stage_item.js"); const {assert, assertLog} = require('../assert.js'); const WitnessColItem = require('../expression_items/witness_col.js') +const Debug = require('../debug.js'); module.exports = class WitnessCol extends ProofStageItem { constructor (id, stage = 1) { assert(typeof id !== 'undefined'); super(id, stage); - console.log('CONSTRUCTOR_WITNESS', id, this.id); + if (Debug.active) console.log('CONSTRUCTOR_WITNESS', id, this.id); } clone() { let cloned = new WitnessCol(this.id, this.stage); - console.log('CLONE_WITNESS:', this, cloned); + if (Debug.active) console.log('CLONE_WITNESS:', this, cloned); return cloned; } get value () { diff --git a/src/expression.js b/src/expression.js index 56a2322..51ebd81 100644 --- a/src/expression.js +++ b/src/expression.js @@ -16,7 +16,8 @@ const NATIVE_OPS = ['add', 'sub', 'mul', 'neg']; const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; const Exceptions = require('./exceptions.js'); const ExpressionPacker = require('./expression_packer.js'); - +const ExpressionClass = require('./expression_class.js'); +const Debug = require('./debug.js'); // TODO: StackPos as class function assertExpressionItem(value, info) { @@ -67,17 +68,17 @@ class Expression extends ExpressionItem { const count = e.stack.length; for (let index = 0; index < count; ++index) { let stackPos = e.stack[index]; - console.log(stackPos); - e.dumpStackPos(stackPos); + // if (Debug.active) console.log(stackPos); + // if (Debug.active) e.dumpStackPos(stackPos); let clonedStackPos = this.cloneStackPos(stackPos); - e.dumpStackPos(stackPos); - this.dumpStackPos(clonedStackPos); + // if (Debug.active) e.dumpStackPos(stackPos); + // if (Debug.active) this.dumpStackPos(clonedStackPos); this.stack.push(clonedStackPos); } return count; } cloneStackPos(stackPos) { - console.log(stackPos); + if (Debug.active) console.log(stackPos); return { op: stackPos.op, operands: stackPos.operands.map(operand => assertExpressionItem(operand.clone()))}; } @@ -220,8 +221,8 @@ class Expression extends ExpressionItem { return (ope.type === OP_RUNTIME); }*/ insertOne (op, b = false) { - console.log(`\x1B[44m======================== INSERT ONE (${op}) =================================\x1B[0m`); - console.log(util.inspect(b, false, null, true)); + if (Debug.active) console.log(`\x1B[44m======================== INSERT ONE (${op}) =================================\x1B[0m`); + if (Debug.active) console.log(util.inspect(b, false, null, true)); assert(b === false || b instanceof Expression); const aIsEmpty = this.stack.length === 0; const bIsEmpty = b === false || b.stack.length === 0; @@ -264,17 +265,17 @@ class Expression extends ExpressionItem { } insert (op, bs) { - console.log(`\x1B[41m======================== INSERT (${op}) =================================\x1B[0m`); - this.dump(); - console.log(util.inspect(bs, false, null, true)); + if (Debug.active) console.log(`\x1B[41m======================== INSERT (${op}) =================================\x1B[0m`); + if (Debug.active) this.dump(); + if (Debug.active) console.log(util.inspect(bs, false, null, true)); if (!Array.isArray(bs)) { const res = this.insertOne(op, bs); - res.dump(); + if (Debug.active) res.dump(); return res; } if (bs.length === 1) { const res = this.insertOne(op, bs[0]); - res.dump(); + if (Debug.active) res.dump(); return res; } // verify that all bs are expressions @@ -321,15 +322,17 @@ class Expression extends ExpressionItem { return this; } evaluateAloneReference() { - this.dump(); + if (Debug.active) this.dump(); assert(this.isAlone()); let operand = this.getAloneOperand(); if (operand instanceof ExpressionItems.RuntimeItem || operand instanceof ExpressionItems.ReferenceItem) { - console.log(operand); + if (Debug.active) console.log(operand); const res = operand.eval(); - console.log(res); - console.log(operand.toString()); - console.log(this.toString()); + if (Debug.active) { + console.log(res); + console.log(operand.toString()); + console.log(this.toString()); + } return res; /* const res = this.evaluateRuntime(operand, true); console.log(operand); @@ -447,23 +450,25 @@ class Expression extends ExpressionItem { if (!this.isReference() || this.stack[0].operands[0].rowOffset) return false; let ref = this.getReference(); - console.log(ref); + if (Debug.active) console.log(ref); EXIT_HERE; } // stackResults[pos][0] contains result of this stack position, // in stackResults[pos][1] contains a results array of this stack position operands instance(options) { - console.log(Context.sourceRef); - this.dump("#############"); + if (Debug.active) { + console.log(Context.sourceRef); + this.dump("#############"); + } let cloned = this.clone(); options = {...options, instance: true} let stackResults = options.stackResults ?? cloned.evaluateOperands(options); // cloned.extendExpressions(options); cloned.evaluateFullStack(stackResults, options); - cloned.dump('PRE-SIMPLIFY'); + if (Debug.active) cloned.dump('PRE-SIMPLIFY'); cloned.simplify(); - cloned.dump('POST-SIMPLIFY'); + if (Debug.active) cloned.dump('POST-SIMPLIFY'); // console.log(stackResults); // cloned.dumpStackResults(stackResults, ''); return cloned; @@ -495,11 +500,13 @@ class Expression extends ExpressionItem { } evaluateFullStack(stackResults, options) { const evaluateId = Date.now(); - this.dump(`evaluateFullStack #${evaluateId} BEGIN`); - console.log("\n", this.stackResultsToString(stackResults)); + if (Debug.active) { + this.dump(`evaluateFullStack #${evaluateId} BEGIN`); + console.log("\n", this.stackResultsToString(stackResults)); + } // console.log(util.inspect(stackResults, false, null, true)); this.evaluateStackPos(stackResults, this.stack.length - 1, {...options, evaluateId}); - this.dump(`evaluateFullStack #${evaluateId} END`); + if (Debug.active) this.dump(`evaluateFullStack #${evaluateId} END`); } evaluateStackPos(stackResults, stackIndex, options = {}) { const st = this.stack[stackIndex]; @@ -508,7 +515,7 @@ class Expression extends ExpressionItem { // if stackResult is evaluated return value; if (results[0] !== null) { - console.log(`evaluateStackPos ${_debugLabel}`, results[0]); + if (Debug.active) console.log(`evaluateStackPos ${_debugLabel}`, results[0]); return results[0]; } @@ -521,17 +528,17 @@ class Expression extends ExpressionItem { assertLog(operand instanceof ExpressionItem, [st.op, st.operands.length, operand]); const resultAvailable = (values[operandIndex] ?? null) != null; if (resultAvailable) { - console.log(`evaluateStackPos ${_operandDebugLabel} ${values[operandIndex]}`) + if (Debug.active) console.log(`evaluateStackPos ${_operandDebugLabel} ${values[operandIndex]}`) continue; } if (operand instanceof ExpressionItems.StackItem) { values[operandIndex] = this.evaluateStackPos(stackResults, stackIndex - operand.getOffset()); - console.log(`evaluateStackPos STACK ${_operandDebugLabel} ${values[operandIndex]} ${stackIndex - operand.getOffset()}`, stackResults); + if (Debug.active) console.log(`evaluateStackPos STACK ${_operandDebugLabel} ${values[operandIndex]} ${stackIndex - operand.getOffset()}`, stackResults); } else { // console.log(operand); values[operandIndex] = operand.eval(options); - console.log(`evaluateStackPos NO-STACK ${_operandDebugLabel} ${values[operandIndex]}`, operand); + if (Debug.active) console.log(`evaluateStackPos NO-STACK ${_operandDebugLabel} ${values[operandIndex]}`, operand); } /* if (options.instance && values[operandIndex] && values[operandIndex] instanceof ExpressionItems.NonRuntimeEvaluableItem === false && values[operandIndex] instanceof ExpressionItems) @@ -554,13 +561,15 @@ class Expression extends ExpressionItem { value = ExpressionItems.NonRuntimeEvaluableItem.get(); } else { value = this.applyOperation(st.op, values); - console.log(`evaluateStackPos/applyOperation ${_debugLabel} `); - console.log(util.inspect(values, false, null, true)); - console.log(util.inspect(value, false, null, true)); + if (Debug.active) { + console.log(`evaluateStackPos/applyOperation ${_debugLabel} `); + console.log(util.inspect(values, false, null, true)); + console.log(util.inspect(value, false, null, true)); + } if (options.instance) { st.op = false; st.operands = [value]; - console.log('ST.OPERANDS=[', value); + if (Debug.active) console.log('ST.OPERANDS=[', value); } } return (results[0] = value); @@ -585,7 +594,7 @@ class Expression extends ExpressionItem { * @param {string[]|false} values - array of ExpressionItems * */ applyOperation(operation, values) { - console.log([operation, ...values]); + if (Debug.active) console.log([operation, ...values]); const operationInfo = ExpressionOperationsInfo.get(operation); if (operationInfo === false) { @@ -667,7 +676,7 @@ class Expression extends ExpressionItem { return 'as'+type+'Item'; } applyOperatorMethod (method, values) { - console.log(`########### (${values[0].constructor.name}) METHOD ${method} ###########`); + if (Debug.active) console.log(`########### (${values[0].constructor.name}) METHOD ${method} ###########`); if (typeof values[0][method] === 'function') { // instance call, first value (operand) is "this", arguments rest of values (operands) return [true, values[0][method](...values.slice(1))]; @@ -678,7 +687,7 @@ class Expression extends ExpressionItem { return [false, false]; } evaluateValue(value, options) { - console.log(value); + if (Debug.active) console.log(value); if (typeof value === 'undefined') { return options ? options.default ?? 0n : 0n; } @@ -728,8 +737,10 @@ class Expression extends ExpressionItem { debugger; value = this.evalAsValue(options); } - console.log(value); - console.log(this.dump()); + if (Debug.active) { + console.log(value); + console.log(this.dump()); + } const res = value.asIntDefault(false); if (res === false) { console.log(value); @@ -745,8 +756,10 @@ class Expression extends ExpressionItem { return res.isAlone() ? res.cloneAloneOperand() : res; } getArrayResult(results, indexes, options) { - console.log(results); - console.log(indexes); + if (Debug.active) { + console.log(results); + console.log(indexes); + } // TODO return results; // this method take one of results using indexes @@ -783,7 +796,7 @@ class Expression extends ExpressionItem { const result = operand.eval(options); operandResults.push(result); if (options.instance && result !== null) { - this.dump(`AAAA.IN stpos:${stpos}`); + if (Debug.active) this.dump(`AAAA.IN stpos:${stpos}`); if (result instanceof Expression) { // insert expression below current position this.insertStack(result, stpos); @@ -796,15 +809,17 @@ class Expression extends ExpressionItem { // at this moment position was increased because some elements // are added on below positions. stpos += result.stack.length; - this.dump('AAAA.OUT1'); + if (Debug.active) this.dump('AAAA.OUT1'); } else { st.operands[operandIndex] = assertExpressionItem(result); - this.dump('AAAA.OUT2'); + if (Debug.active) this.dump('AAAA.OUT2'); } } } } - console.log("\n", this.stackResultsToString(stackResults)); + if (Debug.active) { + console.log("\n", this.stackResultsToString(stackResults)); + } return stackResults; } _calculate(st, pos, stackResults) { @@ -921,13 +936,13 @@ class Expression extends ExpressionItem { let loop = 0; while (this.stack.length > 0) { let updated = false; - this.dump('PRE-SIMPLIFY-OPERATION'); + if (Debug.active) this.dump('PRE-SIMPLIFY-OPERATION'); for (const st of this.stack) { updated = this.simplifyOperation(st) || updated; } - this.dump('POST-SIMPLIFY-OPERATION'); + if (Debug.active) this.dump('POST-SIMPLIFY-OPERATION'); this.compactStack(); - this.dump('POST-COMPACT'); + if (Debug.active) this.dump('POST-COMPACT'); if (!updated) break; } } @@ -1002,10 +1017,8 @@ class Expression extends ExpressionItem { } if (st.op === 'sub' && secondValue !== false && secondValue < 0n) { - console.log(st); st.op = 'add'; st.operands[1] = new ExpressionItems.IntValue(-secondValue); - console.log(st); return true; } @@ -1034,7 +1047,7 @@ class Expression extends ExpressionItem { let translationTable = []; let newStackIndex = 0; let stackLen = this.stack.length; - this.dump('PRE-COMPACTSTACK'); + // if (Debug.active) this.dump('PRE-COMPACTSTACK'); for (let istack = 0; istack < stackLen; ++istack) { const st = this.stack[istack]; if (st.op === false) { @@ -1055,13 +1068,13 @@ class Expression extends ExpressionItem { if ((st.operands[iope] instanceof ExpressionItems.StackItem) === false) continue; const absolutePos = st.operands[iope].getAbsolutePos(istack); const translation = translationTable[absolutePos]; - console.log({istack, absolutePos, iope, translation}); + if (Debug.active) console.log({istack, absolutePos, iope, translation}); assert(absolutePos < istack); if (translation.purge && this.stack[absolutePos].op === false) { // if purge and referenced position was alone, it is copied (duplicated) - this.dump('XXXX'); + if (Debug.active) this.dump('XXXX'); this.stack[istack].operands[iope] = assertExpressionItem(this.stack[absolutePos].operands[0].clone()); - this.dump('YYYY'); + if (Debug.active) this.dump('YYYY'); } else { // newStackIndex - 1 is new really istack after clear simplified stack positions // calculate relative position (offset) @@ -1079,7 +1092,7 @@ class Expression extends ExpressionItem { this.stack = [this.stack[stackLen - 1]]; return true; } - console.log(translationTable); + if (Debug.active) console.log(translationTable); // DEBUG: // translationTable.forEach((value, index) => console.log(`#${index} => ${value}`)); @@ -1198,7 +1211,7 @@ class Expression extends ExpressionItem { } pack(container, options) { const packer = new ExpressionPacker(container, this); - this.dump('PRE-PACK'); + if (Debug.active) this.dump('PRE-PACK'); return packer.pack(options); } /* packAlone(container, options) { @@ -1349,4 +1362,5 @@ class Expression extends ExpressionItem { } ExpressionItem.registerClass('Expression', Expression); +ExpressionClass.set(Expression); module.exports = Expression; \ No newline at end of file diff --git a/src/expression_class.js b/src/expression_class.js new file mode 100644 index 0000000..b30feda --- /dev/null +++ b/src/expression_class.js @@ -0,0 +1,18 @@ +const {assert} = require('./assert.js'); + +class ExpressionClass { + static cls = false; + static set(cls) { + this.cls = cls; + } + static get() { + assert(this.cls !== false, 'ExpressionClass no initialized'); + return this.cls; + } + static isInstance(obj) { + assert(this.cls !== false, 'ExpressionClass no initialized'); + return obj instanceof this.cls; + } +} + +module.exports = ExpressionClass; \ No newline at end of file diff --git a/src/expression_factory.js b/src/expression_factory.js index 7342cbc..e0682df 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -6,12 +6,25 @@ const {ReferenceItem, IntValue, StringValue, StringTemplate, const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); const RowOffset = require('./expression_items/row_offset.js'); +const Context = require('./context.js'); +const Debug = require('./debug.js'); module.exports = class ExpressionFactory { // pre function to delete property op only used by routing - static router = new Router(this, 'type', {defaultPrefix: 'from', pre: (method, obj) => delete obj.type}); + static router = new Router(this, 'type', {defaultPrefix: '_from', pre: (method, obj) => delete obj.type}); static fromObject(obj) { + try { + return this._fromObject(obj); + } catch (e) { + // console.log(e); + if (e.message.startsWith(Context.processor.sourceRef + ':') === false) { + e.message = Context.processor.sourceRef + ': ' + e.message; + } + throw e; // new Error(); + } + } + static _fromObject(obj, options = {}) { if (obj instanceof Expression) { // console.log('#########', Object.keys(obj).includes('type')); return obj; @@ -19,13 +32,20 @@ module.exports = class ExpressionFactory { // console.log(obj); assertLog(typeof obj === 'object', obj); assertLog(typeof obj.op === 'undefined', obj); - obj = {...obj}; + if (Array.isArray(obj)) { + obj = [...obj]; + } else { + obj = {...obj}; + } assert(obj.type !== 'object' && obj.type !== 'objects'); if (obj.dim === 0) delete obj.dim; // console.log(obj); const type = obj.type; + if (typeof type === 'undefined') { + console.log(obj); + } let item = ExpressionFactory.router.go(obj); let unknownProperties = []; @@ -49,25 +69,39 @@ module.exports = class ExpressionFactory { expr._set(item); return expr; } - static fromObjects(objs) { + static _fromObjects(objs, options = {}) { let expressions = []; for (const obj of objs) { - expressions.push(ExpressionFactory.fromObject(obj)); + // if (Array.isArray(obj) && options.elist) { + if (Array.isArray(obj)) { + // TODO: review, better values + expressions.push(ExpressionFactory._fromExpressionList(obj)); + // expressions.push(new ExpressionList(this._fromObjects(obj, {elist: true}))); + continue; + } + if (obj instanceof Expression || obj instanceof ExpressionList) { + expressions.push(obj); + continue; + } + expressions.push(ExpressionFactory._fromObject(obj, options)); } return expressions; } - static fromExpressionList(obj) { - const elist = new ExpressionList(this.fromObjects(obj.values)); + static _fromExpressionList(obj) { + if (Debug.active) console.log(obj.values); + if (Debug.active) console.log(obj.__debug); + const elist = new ExpressionList(this._fromObjects(obj.values, {elist: true})); + if (Debug.active) console.log(elist); delete obj.values; return elist; } - static fromAppend(obj) { + static _fromAppend(obj) { console.log('TODO !!! '); - let res = this.fromObject(obj.value); + let res = this._fromObject(obj.value); delete obj.value; return res; } - static fromReference(obj) { + static _fromReference(obj) { // if (obj.rowOffset) { // console.log('ROWOFFSET.FROMREFERENCE'); // console.log(obj.rowOffset); @@ -83,12 +117,12 @@ module.exports = class ExpressionFactory { delete obj.inc; return res; } - static fromNumber(obj) { + static _fromNumber(obj) { let res = new IntValue(obj.value); delete obj.value; return res; } - static fromString(obj) { + static _fromString(obj) { let res; if (obj.template) { res = new StringTemplate(obj.value); @@ -101,7 +135,7 @@ module.exports = class ExpressionFactory { delete obj.value; return res; } - static fromCall(obj) { + static _fromCall(obj) { // console.log(`##### CALL ${obj.function.name} ${obj.debug}`); // console.log(util.inspect(obj, false, 10, true)); let res = new FunctionCall(obj.function.name, obj.args ?? [], obj.indexes ?? [], { @@ -113,7 +147,7 @@ module.exports = class ExpressionFactory { delete obj.args; return res; } - static fromCast(obj) { + static _fromCast(obj) { let res = new FunctionCall('cast', [obj.cast, obj.value], []); delete obj.name; delete obj.cast; @@ -121,7 +155,7 @@ module.exports = class ExpressionFactory { // console.log(res); return res; } - static fromRowOffset(obj) { + static _fromRowOffset(obj) { if (obj.current && obj.current.rowOffset) { // TODO: ERROR more than rowOffset for same element. EXIT_HERE; diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index fdb9003..a91d59b 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -54,6 +54,7 @@ */ const Exceptions = require('../exceptions.js'); +const Debug = require('../debug.js'); class ExpressionItem { static _classToManager = {}; @@ -67,7 +68,7 @@ class ExpressionItem { ExpressionItem[name] = cls; } setLabel (label) { - console.log(['SETLABEL', label]); + if (Debug.active) console.log(['SETLABEL', label]); this.label = label; } get dim () { @@ -115,11 +116,11 @@ class ExpressionItem { return this.rowOffset.getStrings(); } static setManager(cls, manager) { - console.log(['SET_MANAGER', cls.name]); + if (Debug.active) console.log(['SET_MANAGER', cls.name]); ExpressionItem._classToManager[cls.name] = manager; } getManager() { - console.log(['GET_MANAGER', this.constructor.name]); + if (Debug.active) console.log(['GET_MANAGER', this.constructor.name]); return ExpressionItem._classToManager[this.constructor.name]; } _asDefault(method, defaultValue = false) { @@ -136,7 +137,9 @@ class ExpressionItem { return this._rowOffset; } set rowOffset(value) { - if (!value.isZero()) console.log(['ROWOFFSET.SET', value]); + if (Debug.active) { + if (!value.isZero()) console.log(['ROWOFFSET.SET', value]); + } this._rowOffset = value; } clone() { @@ -159,14 +162,14 @@ class ExpressionItem { if (!this.rowOffset || !this.rowOffset.isPriorRows()) { return false; } - console.log(['ROWOFFSET.EVALPRIOR', this.rowOffset.value]); + if (Debug.active) console.log(['ROWOFFSET.EVALPRIOR', this.rowOffset.value]); return this.rowOffset.value; } evalNext(options) { if (!this.rowOffset || !this.rowOffset.isNextRows()) { return false; } - console.log(['ROWOFFSET.EVALNEXT', this.rowOffset.value]); + if (Debug.active) console.log(['ROWOFFSET.EVALNEXT', this.rowOffset.value]); return this.rowOffset.value; } eval(options) { @@ -180,6 +183,9 @@ class ExpressionItem { evalAsItem(options) { return this.clone(); } + instance(options) { + return this.clone(); + } } module.exports = ExpressionItem; \ No newline at end of file diff --git a/src/expression_items/expression_list.js b/src/expression_items/expression_list.js index a3e340b..1c96d73 100644 --- a/src/expression_items/expression_list.js +++ b/src/expression_items/expression_list.js @@ -40,6 +40,10 @@ class ExpressionList extends ExpressionItem { } return item.getItem(indexes.slice(1)); } + instance(options) { + let _items = this.items.map(x => x.instance(options)); + return new ExpressionList(_items, this.debug); + } } module.exports = ExpressionList; \ No newline at end of file diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 902ab7a..ed9dddb 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -2,20 +2,26 @@ const util = require('util'); const RuntimeItem = require("./runtime_item.js"); const ExpressionList = require("./expression_list.js"); const Context = require('../context.js'); -module.exports = class FunctionCall extends RuntimeItem { +const Debug = require('../debug.js'); +const ExpressionClass = require('../expression_class.js'); +module.exports = class FunctionCall extends RuntimeItem { constructor (name, args = [], indexes = [], debug = {}) { super(debug); this.name = name; if (args instanceof ExpressionList) { - console.log(util.inspect(args, false, 10, true)); + if (Debug.active) console.log(util.inspect(args, false, 10, true)); args = args.items; } - console.log([`#FCALL#${name} ${Context.sourceTag} ${args.length}`, args]); + if (Debug.active) console.log([`#FCALL#${name} ${Context.sourceTag} ${args.length}`, args]); // this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); this.args = args.map(x => x.clone()); this.indexes = indexes.map(x => (typeof x.clone === 'function') ? x.clone() : x); - console.log(`############## ARGS(${name},${this.args.length}) ######################`); - console.log(util.inspect(args, false, 10, true)); + if (Debug.active) { + console.log(`############## ARGS(${name},${this.args.length}) ######################`); + console.log(util.inspect(args, false, 10, true)); + this.dumpArgs(this.args, 'FCALL'); + } + } setFunction(funcdef) { this.funcdef = funcdef; @@ -32,12 +38,22 @@ module.exports = class FunctionCall extends RuntimeItem { super.cloneUpdate(source); this.funcdef = source.funcdef; } + dumpArgs (args, label = '') { + args.forEach((x, index) => { + const _label = `${label}[${index}]`; + if (ExpressionClass.isInstance(x)) x.dump(_label); + else if (x instanceof ExpressionList) this.dumpArgs(x.items, _label); + else console.log(_label, x); + }); + } evalInside(options = {}) { - console.log([`#F CALL.EVAL #${this.name} ${Context.sourceTag}`, this.args]); - if (Context.sourceTag === 'basic_functions.pil:12') debugger; + if (Debug.active) { + console.log([`#FCALL.EVAL #${this.name} ${Context.sourceTag}`, this.args]); + this.dumpArgs(this.args, `CALL ${this.name}`); + } const definition = Context.references.get(this.name, options); const res = Context.processor.executeFunctionCall(this.name, this); - console.log(this.name, res); + if (Debug.active) console.log(this.name, res); return res; } } diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index a65e4b4..467412d 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -2,6 +2,7 @@ const RuntimeItem = require("./runtime_item.js"); const Context = require('../context.js'); const RowOffset = require('./row_offset.js'); const ExpressionItem = require('./expression_item.js'); +const Debug = require('../debug.js'); module.exports = class ReferenceItem extends RuntimeItem { constructor (name, indexes = [], rowOffset) { super(); @@ -28,20 +29,24 @@ module.exports = class ReferenceItem extends RuntimeItem { return cloned; } evalInside(options = {}) { - console.log(['EVALINSIDE '+this.name, options]); - console.log(this.rowOffset); - console.log(this); - if (this.rowOffset.value) { - console.log('ROWOFFSET.EVALINSIDE'); + if (Debug.active) { + console.log(['EVALINSIDE '+this.name, options]); + console.log(this.rowOffset); + console.log(this); + if (this.rowOffset.value) { + console.log('ROWOFFSET.EVALINSIDE'); + } } const item = Context.references.getItem(this.name, this.indexes); if (this.rowOffset && !this.rowOffset.isZero()) { item.rowOffset = this.rowOffset.clone(); } // TODO: next - console.log(`REFERENCE ${this.name} [${this.indexes.join('][')}]`) - console.log(item); - console.log(item.eval()); + if (Debug.active) { + console.log(`REFERENCE ${this.name} [${this.indexes.join('][')}]`) + console.log(item); + console.log(item.eval()); + } return item.eval(); } } diff --git a/src/expression_items/witness_col.js b/src/expression_items/witness_col.js index d50f757..3c8cb63 100644 --- a/src/expression_items/witness_col.js +++ b/src/expression_items/witness_col.js @@ -1,11 +1,12 @@ const ProofItem = require("./proof_item.js"); const {assert, assertLog} = require('../assert.js'); const Context = require('../context.js'); +const Debug = require('../debug.js'); module.exports = class WitnessCol extends ProofItem { constructor (id) { assertLog(typeof id !== 'undefined', id); super(id); - console.log('CONSTRUCTOR_WITNESS', id, this.id); + if (Debug.active) console.log('CONSTRUCTOR_WITNESS', id, this.id); } getTag() { return 'witness'; diff --git a/src/expression_operations_info.js b/src/expression_operations_info.js index ebe89fb..e41c149 100644 --- a/src/expression_operations_info.js +++ b/src/expression_operations_info.js @@ -6,7 +6,7 @@ module.exports = class ExpressionOperationsInfo { pow: { type: 'arith', label: '**', precedence: 98, args: 2, commutative: false }, neg: { type: 'arith', label: '-', precedence: 102, args: 1, commutative: false }, div: { type: 'arith', label: '/', precedence: 94, args: 2, commutative: false }, - mod: { type: 'arith', label: '%', precedence: 92, args: 1, commutative: false }, + mod: { type: 'arith', label: '%', precedence: 92, args: 2, commutative: false }, gt: { type: 'cmp', label: '>', precedence: 76, args: 2, commutative: false }, ge: { type: 'cmp', label: '>=', precedence: 72, args: 2, commutative: false }, lt: { type: 'cmp', label: '<', precedence: 78, args: 2, commutative: false }, diff --git a/src/function.js b/src/function.js index a410804..c49c05a 100644 --- a/src/function.js +++ b/src/function.js @@ -6,6 +6,7 @@ const Expression = require("./expression.js"); const ExpressionItems = require("./expression_items.js"); const List = require("./list.js"); const Context = require('./context.js'); +const Debug = require('./debug.js'); module.exports = class Function { constructor (id, data = {}) { this.id = id; @@ -45,9 +46,9 @@ module.exports = class Function { evalArguments(args) { let eargs = []; for (const arg of args) { - eargs.push(arg.evalAsItem()); + eargs.push(arg.instance()); } - console.log('ARGUMENTS '+eargs.map(x => x.toString()).join(',')); + if (Debug.active) console.log('ARGUMENTS '+eargs.map(x => x.toString()).join(',')); return eargs; } // mapArgument was called before enter on function visibility scope because @@ -55,6 +56,10 @@ module.exports = class Function { mapArguments(s) { const eargs = this.evalArguments(s.args); const scall = this.callToString(eargs); + if (Debug.active) { + console.log(`FUNCTION.mapArguments ${this.name}`); + console.log(util.inspect(eargs, false, null, true)); + } this.checkArgumentsTypes(eargs); return {eargs, scall}; } @@ -120,8 +125,8 @@ module.exports = class Function { if (argDim) { s.args[iarg].eval(); const ref = s.args[iarg].getReference(); - console.log(ref); - console.log(ref.name); + if (Debug.active) console.log(ref); + if (Debug.active) console.log(ref.name); const def = Context.references.getDefinition(ref.name); const dup = def.array.applyIndexes(def, ref.__indexes ?? []); @@ -132,7 +137,7 @@ module.exports = class Function { Context.processor.declareReference(name, type, dup.array ? dup.array.lengths: [], {}); } else { - console.log([name, iarg, s.args.length]); + if (Debug.active) console.log([name, iarg, s.args.length]); const value = s.args[iarg].eval(); // TODO: review? no referece? Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); @@ -140,7 +145,7 @@ module.exports = class Function { } else { // console.log(`MAP-${arg.type}`); // TODO: type conversion, mapping in other class - console.log(s.args[iarg]); + if (Debug.active) console.log(s.args[iarg]); if (s.args[iarg] instanceof ExpressionItems.ExpressionList) { // check (argDim === 1 && arg.type === 'expr') const list = new List(this, s.args[iarg], false); @@ -149,33 +154,33 @@ module.exports = class Function { let index = 0; for (const value of list.values) { extraInfo = index; - console.log(value); + if (Debug.active) console.log(value); Context.references.set(name, [index++], value instanceof Expression ? value.instance() : value); } } else if (argDim) { - console.log(s.args[iarg].eval()); + if (Debug.active) console.log(s.args[iarg].eval()); const ref = s.args[iarg].getReference(); const def = Context.references.getDefinition(ref.name); const dup = def.array.applyIndexes(def, ref.__indexes ?? []); Context.processor.declareReference(name, type, dup.array.lengths, {}); Context.processor.assign.assign(name, dup.array.lengths, s.args[iarg]); } else if (!(s.args[iarg] instanceof Expression)) { - console.log(arg); - console.log([this.name, iarg, s.args[iarg], s.args.length]); + if (Debug.active) console.log(arg); + if (Debug.active) console.log([this.name, iarg, s.args[iarg], s.args.length]); EXIT_HERE; } else { // const value = s.args[iarg].instance().getAloneOperand(); // const value = s.args[iarg].getAloneOperand(); // const value = s.args[iarg].getReference(); - console.log(util.inspect(s.args[iarg], false, 10, true)); + if (Debug.active) console.log(util.inspect(s.args[iarg], false, 10, true)); const value = s.args[iarg].evaluateAloneReference(); - console.log(util.inspect(s.args[iarg].eval(), false, 10, true)); - console.log(util.inspect(s.args[iarg].instance(), false, 10, true)); + if (Debug.active) console.log(util.inspect(s.args[iarg].eval(), false, 10, true)); + if (Debug.active) console.log(util.inspect(s.args[iarg].instance(), false, 10, true)); const dim = value.array ? value.array.dim : 0; if (dim !== argDim) { throw new Error(`Invalid array on ${Context.sourceRef} ${dim} != ${argDim}`); } - console.log(util.inspect(value, false, 10, true)); + if (Debug.active) console.log(util.inspect(value, false, 10, true)); Context.processor.declareReference(name, type, value.array ? value.array.lengths: [], {}, value); } } @@ -196,9 +201,9 @@ module.exports = class Function { } setArgument(name, value) { const arg = this.args[name]; - console.log(name); - console.log(arg); - console.log(value); + if (Debug.active) console.log(name); + if (Debug.active) console.log(arg); + if (Debug.active) console.log(value); // REVIEW: use arg.type, but perphaps we need to do a casting if (name === 'cols') { debugger; @@ -209,7 +214,7 @@ module.exports = class Function { } else if (Array.isArray(value)) { lengths = [value.length]; } - console.log('KKK2KKK', name, lengths, value.constructor.name, value.toString()); + if (Debug.active) console.log('KKK2KKK', name, lengths, value.constructor.name, value.toString()); Context.references.declare(name, arg.type, lengths, {}, value); // TODO: arrays. @@ -289,7 +294,7 @@ module.exports = class Function { } exec(callInfo, mapInfo) { this.declareAndInitializeArguments(mapInfo.eargs); - console.log(Context.constructor.name); + if (Debug.active) console.log(Context.constructor.name); let res = Context.processor.execute(this.statements, `FUNCTION ${this.name}`); if (res instanceof ReturnCmd) { Context.processor.traceLog('[TRACE-BROKE-RETURN]', '38;5;75;48;5;16'); diff --git a/src/indexable.js b/src/indexable.js index 81eb7a5..8b080ec 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -2,6 +2,7 @@ const LabelRanges = require("./label_ranges.js"); const {cloneDeep} = require('lodash'); const {assert, assertLog} = require('./assert.js'); const ExpressionItem = require('./expression_items/expression_item.js'); +const Debug = require('./debug.js'); module.exports = class Indexable { constructor (type, definitionClass, expressionItemClass, options) { this.expressionItemClass = expressionItemClass ?? false; @@ -34,7 +35,7 @@ module.exports = class Indexable { return cloned; } clear(label = '') { - console.log(`CLEARING ${label} (${this.type})`); + if (Debug.active) console.log(`CLEARING ${label} (${this.type})`); this.values = []; this.labelRanges = new LabelRanges(); } @@ -48,7 +49,7 @@ module.exports = class Indexable { return null; } reserve(count, label, multiarray, data) { - if (this.type === 'subproofvalue') { + if (this.type === 'subproofvalue' && Debug.active) { console.log(['SUBPROOFVALUE-R', data]); } const id = this.values.length; @@ -121,8 +122,8 @@ module.exports = class Indexable { } set(id, value) { const item = this.get(id); - console.log(item); - console.log(value.constructor.name); + if (Debug.active) console.log(item); + if (Debug.active) console.log(value.constructor.name); // if (value && typeof value.toString === 'function') console.log(value.toString()); // else console.log(value); assertLog(item && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); @@ -198,7 +199,7 @@ module.exports = class Indexable { let pvalues = []; for (const _property of properties) { const definition = this.get(index); - console.log(definition); + if (Debug.active) console.log(definition); value = _property === 'id' ? definition.id ?? index : definition[_property]; if (isArray) { pvalues.push(value); diff --git a/src/multi_array.js b/src/multi_array.js index 6f6b19b..f83d382 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -1,4 +1,5 @@ const {assert, assertLog} = require('./assert.js'); +const Debug = require('./debug.js'); class MultiArray { static ErrorIndexOutOfRange = class extends Error { } @@ -90,9 +91,9 @@ class MultiArray { return (indexes.length === this.dim); } locatorIndexesApply(locatorId, indexes) { - console.log([locatorId, indexes, this.dim, this.lengths]); + if (Debug.active) console.log([locatorId, indexes, this.dim, this.lengths]); const [offset, dims] = this.getIndexesOffset(indexes); - console.log([offset, dims]); + if (Debug.active) console.log([offset, dims]); if ((this.dim - dims) > 0) { throw new Error(`ERROR ON ARRAY ${offset} ${dims} ${this.dim}`); } diff --git a/src/pil_parser.jison b/src/pil_parser.jison index bf3b210..9b01288 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -8,6 +8,7 @@ \s+ { /* skip whitespace */ } \/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ { /* console.log("MULTILINE COMMENT: "+yytext); */ } \/\/.* { /* console.log("SINGLE LINE COMMENT: "+yytext); */ } +\#pragma\s+[^\r\n]* { yytext = yytext.replace(/^#pragma\s+/, ''); return 'PRAGMA'; } col { return 'COL'; } witness { return 'WITNESS'; } @@ -256,6 +257,9 @@ top_level_block | DEBUGGER { $$ = { type: 'debugger' }} + + | PRAGMA + { $$ = { type: 'pragma', value: $1 }} ; use_directive @@ -740,6 +744,10 @@ codeblock_closed | DEBUGGER { $$ = { type: 'debugger' }} + + | PRAGMA + { $$ = { type: 'pragma', value: $1 }} + ; case_body @@ -1072,20 +1080,22 @@ sequence multiple_expression_list : %empty %prec EMPTY - { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [] }); console.log('C', $$) } + { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [], __debug: 0 }); } | multiple_expression_list ',' expression %prec ',' - { $$ = $1; console.log($$); $$.pushItem(ExpressionFactory.fromObject($3)); } + { $$ = $1; $$.pushItem(ExpressionFactory.fromObject($3)); } | multiple_expression_list ',' '[' expression_list ']' %prec ',' - { $$ = $1; $$.pushItem(ExpressionFactory.fromObject({ type: 'expression_list', values: $4.values })); } + { $$ = $1; $$.pushItem(ExpressionFactory.fromObject($4)); } +// { $$ = $1; $$.pushItem(ExpressionFactory.fromObject({ type: 'expression_list', values: $4.values, __debug: 1 })); } | '[' expression_list ']' %prec NO_EMPTY { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: - [ExpressionFactory.fromObject({ type: 'expression_list', values: [$2.values]})]}); console.log('A',$$) } + [ExpressionFactory.fromObject($2)], __debug: 4}); } +// [ExpressionFactory.fromObject({ type: 'expression_list', values: [$2.values], __debug: 2})], __debug: 4}); console.log('A',$$) } | expression - { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$1] }); console.log('B',$$) } + { $$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$1], __debug: 3 }); } ; expression_list @@ -1416,11 +1426,18 @@ name_optional_index { $$ = { ...$1, ...$2 } } ; +expression_index + : expression + | expression ':' expression + | expression ':' + | ':' expression + ; + array_index - : array_index '[' expression ']' + : array_index '[' expression_index ']' { $$ = { dim: $1.dim + 1, indexes: [...$1.indexes, $3] } } - | '[' expression ']' + | '[' expression_index ']' { $$ = { dim: 1, indexes: [$2]} } ; diff --git a/src/processor.js b/src/processor.js index 2eeb35e..087fa8b 100644 --- a/src/processor.js +++ b/src/processor.js @@ -36,6 +36,7 @@ const fs = require('fs'); const { log2, getKs, getRoots } = require("./utils.js"); const Hints = require('./hints.js'); const util = require('util'); +const Debug = require('./debug.js'); module.exports = class Processor { constructor (Fr, parent) { @@ -138,7 +139,7 @@ module.exports = class Processor { if (this.context.config.debug.builtInLoad) { console.log(`Loading builtin ${filename}.....`); } - console.log(filename); + if (Debug.active) console.log(filename); const builtInCls = require(__dirname + '/builtin/'+ filename); const builtInObj = new builtInCls(this); this.builtIn[builtInObj.name] = builtInObj; @@ -243,9 +244,11 @@ module.exports = class Processor { } traceLog(text, color = '') { if (!this.trace) return; - console.log([Expression.constructor.name]); - if (color) console.log(`\x1B[${color}m${text}\x1B[0m`); - else console.log(text); + if (Debug.active) { + console.log([Expression.constructor.name]); + if (color) console.log(`\x1B[${color}m${text}\x1B[0m`); + else console.log(text); + } } execute(statements, label = '') { const __executeCounter = this.executeCounter++; @@ -275,10 +278,10 @@ module.exports = class Processor { this.error(st, `Invalid statement (without type)`); } const method = ('exec_'+st.type).replace(/[-_][a-z]/g, (group) => group.slice(-1).toUpperCase()); - console.log(`## DEBUG ## ${this.executeCounter}.${this.executeStatementCounter} ${method} ${st.debug}` ); + if (Debug.active) console.log(`## DEBUG ## ${this.executeCounter}.${this.executeStatementCounter} ${method} ${st.debug}` ); if (!(method in this)) { console.log('==== ERROR ===='); - this.error(st, `Invalid statement type: ${st.type}`); + this.error(st, `Invalid statement type: ${st.type}`); } let res; try { @@ -293,6 +296,14 @@ module.exports = class Processor { } return res; } + execPragma(st) { + const params = st.value.split(/\s+/); + console.log(params); + if (params[0] === 'debug') { + if (params[1] === 'on') Debug.active = true; + else if (params[1] === 'off') Debug.active = false; + } + } execProof(st) { this.scope.pushInstanceType('proof'); this.execute(st.statements); @@ -300,11 +311,16 @@ module.exports = class Processor { } executeFunctionCall(name, callinfo) { const func = this.builtIn[name] ?? this.references.get(name); - console.log(`CALL ${name}`); - console.log(callinfo); + if (Debug.active) { + console.log(`CALL ${name}`); + console.log(callinfo); + } if (func) { const mapInfo = func.mapArguments(callinfo); + // console.log(mapInfo); + // console.log(func.constructor.name); + // callinfo.dumpArgs(mapInfo.eargs, 'CALLINFO'); this.callstack.push(mapInfo.scall ?? name); ++this.functionDeep; this.scope.push(); @@ -314,16 +330,16 @@ module.exports = class Processor { this.scope.pop(); --this.functionDeep; this.callstack.pop(); - console.log(`END CALL ${name}`, res); + if (Debug.active) console.log(`END CALL ${name}`, res); return typeof res === 'undefined' ? new ExpressionItems.IntValue() : res; } this.error({}, `Undefined function ${name}`); } execCall(st) { const name = st.function.name; - console.log(`CALL (EXEC) ${name}`); + if (Debug.active) console.log(`CALL (EXEC) ${name}`); const res = this.executeFunctionCall(name, st); - console.log(`END CALL (EXEC) ${name}`); + if (Debug.active) console.log(`END CALL (EXEC) ${name}`); return res; } execAssign(st) { @@ -336,31 +352,31 @@ module.exports = class Processor { if (st.value instanceof ExpressionItems.ExpressionList) { const sequence = new Sequence(this, st.value, ExpressionItems.IntValue.castTo(this.references.get('N'))); sequence.extend(); - console.log(sequence.size); - console.log(sequence.toString()); + if (Debug.active) console.log(sequence.size); + if (Debug.active) console.log(sequence.toString()); EXIT_HERE; } - console.log(st.value); - st.value.dump('@@@@@@@@@@@@@@@@@@'); + if (Debug.active) console.log(st.value); + if (Debug.active) st.value.dump('@@@@@@@@@@@@@@@@@@'); const expr2 = st.value.instance(); - expr2.dump('@^^@------/'); + if (Debug.active) expr2.dump('@^^@------/'); if (st.name.reference) { assert(indexes.length === 0); const assignedValue = st.value.instance(); - console.log(assignedValue); + if (Debug.active) console.log(assignedValue); this.assign.assignReference(names, assignedValue); return; } - console.log(st.value); + if (Debug.active) console.log(st.value); this.assign.assign(names, indexes, st.value); - console.log(`ASSIGN ${st.name.name} = ${st.value.toString()} \x1B[0;90m[${Context.sourceTag}]\x1B[0m`); + if (Debug.active) console.log(`ASSIGN ${st.name.name} = ${st.value.toString()} \x1B[0;90m[${Context.sourceTag}]\x1B[0m`); // this.references.set(st.name.name, [], this.expressions.eval(st.value)); } execHint(s) { const name = s.name; - console.log(util.inspect(s.data, false, null, true)); + if (Debug.active) console.log(util.inspect(s.data, false, null, true)); const res = this.processHintData(s.data); - console.log(util.inspect(res, false, null, true)); + if (Debug.active) console.log(util.inspect(res, false, null, true)); this.hints.define(name, res); } processHintData(hdata) { @@ -384,7 +400,7 @@ module.exports = class Processor { } return result; } - console.log(hdata); + if (Debug.active) console.log(hdata); EXIT_HERE; } execIf(s) { @@ -396,7 +412,7 @@ module.exports = class Processor { if (cond.type === 'else' && icond !== (s.conditions.length-1)) { throw new Error('else only could be on last position'); } - console.log(cond); + if (Debug.active) console.log(cond); if (typeof cond.expression !== 'undefined' && cond.expression.evalAsBool() !== true) { continue; @@ -443,7 +459,7 @@ module.exports = class Processor { return result; } execFor(s) { - console.log('EXEC-FOR'); + if (Debug.active) console.log('EXEC-FOR'); let result; this.scope.push(); this.execute(s.init, `FOR ${this.sourceRef} INIT`); @@ -451,21 +467,21 @@ module.exports = class Processor { // while (this.expressions.e2bool(s.condition)) { while (true) { const loopCond = s.condition.eval().asBool(); - console.log('FOR.CONDITION', loopCond, s.condition.toString(), s.condition); + if (Debug.active) console.log('FOR.CONDITION', loopCond, s.condition.toString(), s.condition); if (!loopCond) break; // if only one statement, scope will not create. // if more than one statement, means a scope_definition => scope creation result = this.execute(s.statements, `FOR ${this.sourceRef} I:${index}`); ++index; if (result instanceof BreakCmd) break; - console.log('INCREMENT', s.increment); + if (Debug.active) console.log('INCREMENT', s.increment); this.execute(s.increment); } this.scope.pop(); return result; } execForIn(s) { - console.log(s); + if (Debug.active) console.log(s); if (s.list && s.list instanceof ExpressionItems.ExpressionList) { return this.execForInList(s); } @@ -527,8 +543,8 @@ module.exports = class Processor { } execForInExpression(s) { // s.list.expr.dump(); - console.log(s); - console.log(s.list); + if (Debug.active) console.log(s); + if (Debug.active) console.log(s.list); let it = new Iterator(s.list); this.scope.push(); this.execute(s.init,`FOR-IN-EXPRESSION ${this.sourceRef} INIT`); @@ -557,7 +573,7 @@ module.exports = class Processor { const [name, indexes, legth] = slist.getRuntimeReference(); } execBreak(s) { - return new BreakCmd(); + return new BreakCmd();console.log } execContinue(s) { return new ContinueCmd(); @@ -572,15 +588,16 @@ module.exports = class Processor { } } execFunctionDefinition(s) { - console.log('FUNCTION '+s.funcname); + if (Debug.active) console.log('FUNCTION '+s.funcname); let func = new Function(this, s); this.references.declare(func.name, 'function'); this.references.set(func.name, [], func); } getExprNumber(expr, s, title) { - console.log(s); - expr.dump(); - // expr.expr.dump(); + if (Debug.active) { + console.log(s); + expr.dump(); + } const se = ExpressionItems.IntValue.castTo(expr.eval()); if (typeof se !== 'bigint') { // if (se.op !== 'number') { @@ -767,12 +784,12 @@ module.exports = class Processor { this.callDelayedFunctions('proof', 'final'); } callDelayedFunctions(scope, event) { - console.log(this.delayedCalls); + if (Debug.active) console.log(this.delayedCalls); if (typeof this.delayedCalls[scope] === 'undefined' || typeof this.delayedCalls[scope][event] === 'undefined') { return false; } for (const fname in this.delayedCalls[scope][event]) { - console.log(`CALL DELAYED(${scope},${event}) FUNCTION ${fname}`); + if (Debug.active) console.log(`CALL DELAYED(${scope},${event}) FUNCTION ${fname}`); this.execCall({ op: 'call', function: {name: fname}, args: [] }); } } @@ -921,7 +938,7 @@ module.exports = class Processor { s.executed = true; return this.execute(s.statements,`CODE ${this.sourceRef}`); } - console.log(`Ignore once section because it has already executed ${s.debug}`); + if (Debug.active) console.log(`Ignore once section because it has already executed ${s.debug}`); } execConstraint(s) { const scopeType = this.scope.getInstanceType(); @@ -951,12 +968,12 @@ module.exports = class Processor { const value = this.references.get(name, []); // REVIEW: could be an expression (if expression x+1+1 = x+2) const intValue = value.getValue(); - console.log(`INCREMENT ${s.name} = ${intValue} + ${s.pre + s.post} = ${intValue + s.pre + s.post}`); + if (Debug.active) console.log(`INCREMENT ${s.name} = ${intValue} + ${s.pre + s.post} = ${intValue + s.pre + s.post}`); // console.log(s.pre, s.post, value.getValue()); this.references.set(name, [], intValue + s.pre + s.post); } execVariableDeclaration(s) { - console.log('VARIABLE DECLARATION '+Context.sourceRef+' init:'+s.init); + if (Debug.active) console.log('VARIABLE DECLARATION '+Context.sourceRef+' init:'+s.init); const init = typeof s.init !== 'undefined'; // console.log(s); const count = s.items.length; @@ -972,7 +989,7 @@ module.exports = class Processor { const scope = s.scope ?? false; let initValue = null; if (init) { - console.log(name, s.vtype, Context.sourceRef); + if (Debug.active) console.log(name, s.vtype, Context.sourceRef); switch (s.vtype) { case 'expr': initValue = s.init[index].eval(); @@ -984,12 +1001,12 @@ module.exports = class Processor { initValue = new ExpressionItems.StringValue(this.expressions.e2value(s.init[index])); break; } - console.log(name, s.vtype, initValue.toString ? initValue.toString() : initValue); + if (Debug.active) console.log(name, s.vtype, initValue.toString ? initValue.toString() : initValue); } this.references.declare(name, s.vtype, lengths, { scope, sourceRef, const: s.const ?? false }, initValue); if (initValue !== null) { const initValueText = typeof initValue.toString === 'function' ? initValue.toString() : initValue; - console.log(`ASSIGN(DECL) ${name} = ${initValueText} \x1B[0;90m[${Context.sourceTag}]\x1B[0m`); + if (Debug.active) console.log(`ASSIGN(DECL) ${name} = ${initValueText} \x1B[0;90m[${Context.sourceTag}]\x1B[0m`); // this.references.set(name, [], initValue); } } @@ -1052,7 +1069,7 @@ module.exports = class Processor { // replace on string each tag for its value const evaluatedTemplate = stringTags.map((s, index) => tags[index].pre + s).join('')+lastS; - console.log(`TEMPLATE "${template}" ==> "${evaluatedTemplate}"`); + if (Debug.active) console.log(`TEMPLATE "${template}" ==> "${evaluatedTemplate}"`); return evaluatedTemplate; } evaluateExpression(e){ @@ -1067,8 +1084,10 @@ module.exports = class Processor { throw new Error('Return is called out of function scope'); } const res = s.value.instance(); - console.log(res); - console.log(res.eval()); + if (Debug.active) { + console.log(res); + console.log(res.eval()); + } this.traceLog(`[RETURN.END ${sourceRef}] ${this.scope.deep}`); return new ReturnCmd(res); } diff --git a/src/reference.js b/src/reference.js index 1333220..50bd324 100644 --- a/src/reference.js +++ b/src/reference.js @@ -2,7 +2,7 @@ const {assert, assertLog} = require('./assert.js'); const MultiArray = require("./multi_array.js"); const ArrayOf = require('./expression_items/array_of.js'); const Context = require('./context.js'); - +const Debug = require('./debug.js'); /** * @property {MultiArray} array */ @@ -21,7 +21,7 @@ class Reference { this.initialized = false; for (const property in properties) { assert(typeof this[property] === 'undefined'); - if (property === 'const') console.log(['CONST ********', properties[property]]); + if (Debug.active) if (property === 'const') console.log(['CONST ********', properties[property]]); this[property] = properties[property]; } } @@ -45,11 +45,11 @@ class Reference { return (indexes.length === 0 || !this.array) ? this.initialized : this.array.isInitialized(indexes); } getId(indexes = []) { - console.log(`getId ${this.name} ${Array.isArray(indexes) ? '[' + indexes.join(',') + ']':indexes} ${this.array ? this.array.toDebugString():''}`); + if (Debug.active) console.log(`getId ${this.name} ${Array.isArray(indexes) ? '[' + indexes.join(',') + ']':indexes} ${this.array ? this.array.toDebugString():''}`); return (indexes.length === 0 || !this.array) ? this.locator : this.array.getLocator(this.locator, indexes); } set (value, indexes = [], options = {}) { - console.stdebug(`set(${this.name}, [${indexes.join(',')}]`); + if (Debug.active) console.stdebug(`set(${this.name}, [${indexes.join(',')}]`); assert(value !== null); // to detect obsolete legacy uses if (!this.array || this.array.isFullIndexed(indexes)) { return this.setOneItem(value, indexes, options); @@ -58,7 +58,7 @@ class Reference { // At this point, it's a array initilization } setArrayLevel(level, indexes, value, options = {}) { - console.log(`setArrayLevel(${this.name} ${level}, [${indexes.join(',')}]`); + if (Debug.active) console.log(`setArrayLevel(${this.name} ${level}, [${indexes.join(',')}]`); const len = this.array.lengths[level]; for (let index = 0; index < len; ++index) { let _indexes = [...indexes]; @@ -114,6 +114,10 @@ class Reference { let locator = this.locator; let label = options.label; + if (Debug.active) { + console.log(indexes); + console.log(this); + } // indexes evaluation let evaluatedIndexes = []; if (Array.isArray(indexes) && indexes.length > 0) { @@ -132,6 +136,7 @@ class Reference { res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator)); } } else if (evaluatedIndexes.length > 0) { + console.log(evaluatedIndexes); console.log(this); throw new Error('try to access to index on non-array value'); } diff --git a/src/references.js b/src/references.js index 6596e91..8c8c98c 100644 --- a/src/references.js +++ b/src/references.js @@ -6,6 +6,7 @@ const Reference = require('./reference.js'); const Containers = require('./containers.js'); const Context = require('./context.js'); const Exceptions = require('./exceptions.js'); +const Debug = require('./debug.js'); module.exports = class References { constructor () { @@ -19,15 +20,15 @@ module.exports = class References { let instance = null; const instances = [...(options.instances ?? []), ...Object.values(this.types).map(x => x.instance)]; for (const _instance of instances) { - console.log(_instance); + if (Debug.active) console.log(_instance); if (_instance.expressionItemClass === item.constructor) { instance = _instance; break; } } - console.log(instance, item.id); + if (Debug.active) console.log(instance, item.id); const res = instance.get ? instance.get(item.id): false; - console.log(res); + if (Debug.active) console.log(res); return res; } /* getDefinition(name, indexes) { @@ -227,8 +228,10 @@ module.exports = class References { } if (initValue !== null) { - if (initValue && typeof initValue.toString === 'function') console.log(initValue.toString()); - else console.log(initValue); + if (Debug.active) { + if (initValue && typeof initValue.toString === 'function') console.log(initValue.toString()); + else console.log(initValue); + } reference.init(initValue); } return id; @@ -244,7 +247,7 @@ module.exports = class References { } get (name, indexes = []) { - console.log('GET', name, indexes); + if (Debug.active) console.log('GET', name, indexes); // getReference produce an exception if name not found return this.getReference(name).get(indexes); @@ -264,7 +267,7 @@ module.exports = class References { assert(typeof name === 'string' || (Array.isArray(name) && name.length > 0)); - console.log(indexes); + if (Debug.active) console.log(indexes); indexes = indexes ?? []; options = options ?? {}; @@ -378,7 +381,7 @@ module.exports = class References { tvalue.array = info.array; } if (options.preDelta) { - console.log(typeof tvalue.value); + if (Debug.active) console.log(typeof tvalue.value); assert(typeof tvalue.value === 'number' || typeof tvalue.value === 'bigint'); tvalue.value += options.preDelta; instance.set(info.locator + info.offset, tvalue.value); @@ -427,7 +430,7 @@ module.exports = class References { return reference; } isVisible(def) { - console.log('ISVISIBLE', (def.constructor ?? {name: '_'}).name, def); + if (Debug.active) console.log('ISVISIBLE', (def.constructor ?? {name: '_'}).name, def); return !def.scopeId || !this.hasScope(def.type) || ['constant', 'function', 'witness', 'fixed'].includes(def.type) || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } @@ -460,12 +463,12 @@ module.exports = class References { } } - console.log(names); + if (Debug.active) console.log(names); if (!names) { names = Context.current.getNames(name); } - console.log(names); + if (Debug.active) console.log(names); // console.log(`getReference(${name}) on ${this.context.sourceRef} = [${names.join(', ')}]`); let reference = false; @@ -556,7 +559,7 @@ module.exports = class References { this.references[name] = reference; } set (name, indexes, value) { - console.log('SET', name, indexes, value); + if (Debug.active) console.log('SET', name, indexes, value); assert(value !== null); // to detect obsolete legacy uses // getReference produce an exception if name not found diff --git a/src/sequence.js b/src/sequence.js index b02af37..fc5d03a 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -2,6 +2,7 @@ const {assert, assertLog} = require("./assert.js"); const Router = require("./router.js"); const Expression = require("./expression.js"); const Values = require('./values.js'); +const Debug = require('./debug.js'); const MAX_ELEMS_GEOMETRIC_SEQUENCE = 300; class SequencePadding { @@ -36,7 +37,7 @@ module.exports = class Sequence { } clone() { let cloned = new Sequence(this.parent, this.expression, this.maxSize); - console.log(['CLONED', this.maxSize, cloned.maxSize]); + if (Debug.active) console.log(['CLONED', this.maxSize, cloned.maxSize]); this.#values.mutable = false; cloned.#values = this.#values.clone(); return cloned; @@ -65,16 +66,18 @@ module.exports = class Sequence { this.paddingSize = 0; const size = this._sizeOf(e); assert(size >= this.paddingCycleSize, `size(${size}) < paddingCycleSize(${this.paddingCycleSize})`); - console.log(['SIZE(MAXSIZE)', this.maxSize]); - console.log(['SIZE(paddingCycleSize)', this.paddingCycleSize]); - console.log(['SIZE(paddingSize)', this.paddingSize]); + if (Debug.active) { + console.log(['SIZE(MAXSIZE)', this.maxSize]); + console.log(['SIZE(paddingCycleSize)', this.paddingCycleSize]); + console.log(['SIZE(paddingSize)', this.paddingSize]); + } if (this.paddingCycleSize) { this.paddingSize = this.maxSize - (size - this.paddingCycleSize); this.size = size - this.paddingCycleSize + this.paddingSize; } else { this.size = size; } - console.log(['SIZE', this.size]); + if (Debug.active) console.log(['SIZE', this.size]); return this.size; } _sizeOf(e) { @@ -93,7 +96,7 @@ module.exports = class Sequence { } _sizeOfRepeatSeq(e) { const times = this.toNumber(this.parent.getExprNumber(e.times)); - console.log(['times', times]); + if (Debug.active) console.log(['times', times]); return times * this._sizeOf(e.value); } setPaddingSize(size) { @@ -112,7 +115,7 @@ module.exports = class Sequence { getRangeSeqInfo(e) { const fromTimes = e.times ? this.toNumber(this.e2num(e.times)): 1; const toTimes = e.toTimes ? this.toNumber(this.e2num(e.toTimes)): fromTimes; - console.log(['fromTimes', fromTimes, 'toTimes', toTimes]); + if (Debug.active) console.log(['fromTimes', fromTimes, 'toTimes', toTimes]); if (fromTimes !== toTimes) { throw new Error(`In range sequence, from(${fromTimes}) and to(${toTimes}) must be same`); } @@ -122,7 +125,7 @@ module.exports = class Sequence { const t1Times = e.t1.times ? this.toNumber(this.e2num(e.t1.times)): 1; const t2Times = e.t2.times ? this.toNumber(this.e2num(e.t2.times)): 1; const tnTimes = e.tn.times === false ? false : (e.tn.times ? this.toNumber(this.e2num(e.t2.times)): 1); - console.log(['t1Times', t1Times, 't2Times', t2Times, 'tnTimes', tnTimes]); + if (Debug.active) console.log(['t1Times', t1Times, 't2Times', t2Times, 'tnTimes', tnTimes]); if (t1Times !== t2Times && (tnTimes === false || tnTimes === t2Times)) { throw new Error(`In term sequence, t1(${t1Times}), t2(${t2Times})`+ (tnTimes === false ? '':` and tn(${tbTimes}`)+'must be same'); @@ -314,16 +317,18 @@ module.exports = class Sequence { return this.extendPos - initialExtendPos; } extend() { - console.log(this.size); + if (Debug.active) console.log(this.size); // this.values = new Array(this.size); this.extendPos = 0; this._extend(this.expression); this.#values.mutable = false; } verify() { - console.log(this.toString()); - console.log([this.extendPos, this.size]); - console.log(['SIZE', this.size]); + if (Debug.active) { + console.log(this.toString()); + console.log([this.extendPos, this.size]); + console.log(['SIZE', this.size]); + } assert(this.valueCounter === this.size); for (let index = 0; index < size; ++index) { assert(this.values[index] === 'bigint', `type of index ${index} not bigint (${typeof this.values[index]}) ${value}`); @@ -405,7 +410,7 @@ module.exports = class Sequence { return this.#values.toString(); } toNumber(value) { - console.log(value); + if (Debug.active) console.log(value); let nvalue = Number(value); if (nvalue === NaN || isNaN(nvalue)) { throw new Error(`Invalid number ${value}`); diff --git a/test/pil2/zkevm-etrog/binary.pil b/test/pil2/zkevm-etrog/binary.pil index 4baaf42..a7860ee 100644 --- a/test/pil2/zkevm-etrog/binary.pil +++ b/test/pil2/zkevm-etrog/binary.pil @@ -1,38 +1,55 @@ // PIL State Machine that compute 256 bits operations: -// -// ADD (OP:0) -// SUB (OP:1) -// LT (OP:2) -// SLT (OP:3) -// EQ (OP:4) -// AND (OP:5) -// OR (OP:6) -// XOR (OP:7) -// LT4 (OP:8) + +// ope │ opcode │ cin │ carry │ last │ ROWS │ NOTES +// ─────┼────────┼─────┼───────┼──────┼───────┼─────────────────────────────────── +// ADD │ 0 │ 0 │ X │ │ 2**17 │ could use cIn to ADC +// SUB │ 1 │ 0 │ X │ │ 2**17 │ +// LT │ 2 │ 0 │ X │ X │ 2**18 │ +// SLT │ 3 │ 0 │ X │ X │ 2**18 │ +// EQ │ 4 │ 0 │ X │ X │ 2**18 │ +// AND │ 5 │ 0 │ X │ X │ 2**17 │ use carry to detect any bit one +// OR │ 6 │ 0 │ │ │ 2**16 │ +// XOR │ 7 │ 0 │ │ │ 2**16 │ +// LT4 │ 8 │ 0 │ X │ X │ 2**18 │ TOTAL = 2**20 + 2**19 => 2**21 +// ┄┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ + + +// bytes/clk │ clk │ cols │ area │ opens │ NOTES +// ───────────┼─────┼────────────────┼──────┼───────┼─────────────────────────────────── +// 2 │ 16 │ 8 + 4*2 = 16 │ 256 │ 17 │ +// 4 │ 8 │ 8 + 4*4 = 24 │ 192 │ 9 │ +// 8 │ 4 │ 8 + 4*8 = 40 │ 160 │ 5 │ +// 16 │ 2 │ 8 + 4*16 = 76 │ 152 │ 3 │ +// 32 │ 1 │ 8 + 4*32 = 136 │ 136 │ 2 │ const int BINARY_ID = 1; subproof aggregate Binary(2**21, 2**23, 2**25) { - col fixed RESET = [1,0:7]...; + col fixed CLK0 = [1,0:3]...; + const expr RESET = CLK0; - col witness freeInA[4], freeInB[4], freeInC[4]; // 4 x 1 Byte (2 inputs, 1 output) - col witness a, b, c; // rebuild registers for lookup. 8 clocks x 32 bits = 256 bits - col witness op; // operation code - col witness carry[5]; // 4 chunks carries [cin:0,cout:1],[cin:1,cout:2],[cin:2,cout:3],[cin:3,cout:4] + col witness freeInA[8], freeInB[8], freeInC[8]; // 8 x 1 Byte (2 inputs, 1 output) + col witness opcode; // operation code + col witness carry[9]; // 9 chunks carries [cin:0,cout:1],[cin:1,cout:2],...,[cin:6,cout:7] col witness result; // selector of result binary operation - (1 - RESET) * result = 0; + // CLK0 1,0,0...0,0|1,0,0...0,0|1,0,.... + // result 0,0,0...0,1|0,0,0...0,1|0,0,.... + // 'result 1,0,0...0,0|1,0,0...0,0|1,0,.... + (1 - CLK0) * 'result = 0; result * (1 - result) = 0; - (opcode' - opcode) * (1 - RESET') === 0; + ('opcode - opcode) * (1 - CLK0) === 0; + + const expr cIn = carry[0]; + const expr cOut = carry[8]; - cIn' === cOut * ( 1 - RESET' ); + (1 - CLK0) * ('cOut - cIn) === 0; for (int index = 0; index < length(carry); index += 1) { carry[index] * (1 - carry[index]) === 0; } - // pol commit lCout,lOpcode; // LT4 (opcode = 8) // @@ -93,30 +110,22 @@ subproof aggregate Binary(2**21, 2**23, 2**25) { // · last cout = 0 => means LT4 = 0 (if the last chunk of a isn't lower than the last of b then we are done). // · last cout = 1 => means last a chunk is less than b, in this path result only deepends of ge4 value. - const expr LT4_PROPAGATE = /* NO 0-2,3 */ Global.CLK32[4] + Global.CLK32[5] + Global.CLK32[6] + /* NO 7 */ + Global.CLK32[8] + Global.CLK32[9] - + Global.CLK32[10] + /* NO 11 */ + Global.CLK32[12] + Global.CLK32[13] + Global.CLK32[14] + Global.CLK32[15] - /* NO 16-18,19 */ + Global.CLK32[20] + Global.CLK32[21] + Global.CLK32[22] + /* NO 23 */ + Global.CLK32[24] + Global.CLK32[25] - + Global.CLK32[26] + /* NO 27 */ + Global.CLK32[28] + Global.CLK32[29] + Global.CLK32[30] + Global.CLK32[31]; - - previousAreLt4' === (Global.CLK32[3] + Global.CLK32[19]) * cOut + previousAreLt4 * (LT4_PROPAGATE + (Global.CLK32[7] + Global.CLK32[11] + Global.CLK32[23] + Global.CLK32[27]) * cOut); - - lCout' === cOut + usePreviousAreLt4 * (previousAreLt4 - cOut); - lOpcode' === opcode; + previousAreLt4' === (CLK0 + previousAreLt4) * cOut; // P_FLAGS = cOut + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 // In even byte clocks, useCarry = usePreviousAreLt4 = 0 and cOut = cMiddle, therefore P_FLAGS = cMiddle + 8 * reset4 - lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[0], freeInB[0], carry[0], freeInC[0], carry[1] + 8 * reset4]); - lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[1], freeInB[1], carry[1], freeInC[1], carry[2] + 8 * reset4]); - lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[2], freeInB[2], carry[2], freeInC[2], carry[3] + 8 * reset4]); - lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[result', opcode, freeInA[3], freeInB[3], carry[3], freeInC[3], carry[4] + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4]); + for (int index = 0; index < 7; ++index) { + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[index], freeInB[index], carry[index], freeInC[index], carry[index + 1]]); + } + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[result, opcode, freeInA[7], freeInB[7], carry[7], freeInC[7], carry[8] + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4]); useCarry * usePreviousAreLt4 === 0; - a === freeInA[0] + 2**8 * freeInA[1] + 2**16 * freeInA[2] + 2**24 * freeInA[3]; - b === freeInB[0] + 2**8 * freeInB[1] + 2**16 * freeInB[2] + 2**24 * freeInB[3]; + // a === freeInA[0] + 2**8 * freeInA[1] + 2**16 * freeInA[2] + 2**24 * freeInA[3]; + // b === freeInB[0] + 2**8 * freeInB[1] + 2**16 * freeInB[2] + 2**24 * freeInB[3]; // TODO: verify on each 8 clocks - c === useCarry * cOut + usePreviousAreLt4 * previousAreLt + (1 - useCarry - usePreviousAreLt4) * (freeInC[0] + 2**8 * freeInC[1] + 2**16 * freeInC[2] + 2**24 * freeInC[3]); + // c === useCarry * cOut + usePreviousAreLt4 * previousAreLt + (1 - useCarry - usePreviousAreLt4) * (freeInC[0] + 2**8 * freeInC[1] + 2**16 * freeInC[2] + 2**24 * freeInC[3]); // In the last byte, when useCarry or usePreviousAreLt4 are 1, the value of c[0] needs to change // to result (0 or 1). In the first clock, freeInC must be changed to match with the lookup @@ -126,5 +135,15 @@ subproof aggregate Binary(2**21, 2**23, 2**25) { // In the last byte, only FACTOR[7] is active, and freeInC only affects to c[7]'. - pol c7Temp = c[7] * (1 - RESET) + freeInC[0] * FACTOR[7] + 256 * freeInC[1] * FACTOR[7]; - c[7]' = (1 - useCarry - usePreviousAreLt4) * c7Temp; + // on last clock freeInA[7] = HSB and 3'freeInA[0] = LSB + expr a,b,c; + for (int clk = 0; clk < 4; clk += 1 ) { + for (int index = 0; index < 8; index += ) { + a = a * 256 + clk'freeInA[7-index]; + b = b * 256 + clk'freeInB[7-index]; + c = c * 256 + clk'freeInC[7-index]; + } + } + const expr opCarryOut = usePreviousAreLt * (previousAreLt4 - cOut) + cOut; + multiset_proves(BINARY_ID, result,[opcode, a, b, (useCarry + usePreviousAreLt) * (opCarryOut - c) + c, cIn, opCarryOut]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/binary_lib.pil b/test/pil2/zkevm-etrog/binary_lib.pil new file mode 100644 index 0000000..5b0b3f1 --- /dev/null +++ b/test/pil2/zkevm-etrog/binary_lib.pil @@ -0,0 +1,118 @@ +// PIL State Machine that compute 256 bits operations: +// +// ADD (OP:0) +// SUB (OP:1) +// LT (OP:2) +// SLT (OP:3) +// EQ (OP:4) +// AND (OP:5) +// OR (OP:6) +// XOR (OP:7) +// LT4 (OP:8) +// ADC (OP:9) + +const int BINARY_ID = 1; + +instance Binary(id: ID, rows: 2**23, bytes: 32); +instance Binary(id, rows, bytes); + +subproof aggregate Binary(id = BINARY_ID, rows = 2**23, bytesPerRow = 4, bits = 256) { + N = rows; + + assert(isPowOfTwo(rows)); + assert(bytes % 2 == 0); + assert(bits % 8 == 0); + assert(bits % (8 * bytesPerRow) == 0); + + const int ONE_ROW = bits == (8 * bytesPerRow); + const int BYTES_PER_ROW = bits/(8 * bytesPerRow); + + + col witness freeInA[bytesPerRow], freeInB[bytesPerRow], freeInC[bytesPerRow]; + col witness op; + col witness carry[bytesPerRow]; + col witness result; + + if (!ONE_ROW) { + col fixed RESET = [1,0:(BYTES_PER_ROW-1)]...; + + // RESET 1,0,0...0,0|1,0,0...0,0|1,0,.... + // result 0,0,0...0,1|0,0,0...0,1|0,0,.... + // 'result 1,0,0...0,0|1,0,0...0,0|1,0,.... + (1 - RESET) * 'result = 0; + + (opcode - 'opcode) * (1 - RESET) === 0; + cIn' === cOut * (1 - RESET' + reset4 * CLK_64_BITS); + } + result * (1 - result) = 0; + + for (int index = 0; index < length(carry); index += 1) { + carry[index] * (1 - carry[index]) === 0; + } + + col witness previousAreLt4; + col witness usePreviousAreLt4; + col witness reset4; + col witness useCarry; + + previousAreLt4 * (1 - previousAreLt4) === 0; + usePreviousAreLt4 * (1 - usePreviousAreLt4) === 0; + reset4 * (1 - reset4) === 0; + useCarry * (1 - useCarry) === 0; + cOut * (1 - cOut) === 0; + + // RESET = Global.CLK32[0] + Global.CLK32[16]; + + + // LT4_PROPAGATE (polynomial made up of constant, binary and disjoint polynomials, therefore it's a constant and binary polynomial) + // + // Each 4 clocks this sm has processed 8 bytes = 64 bits, last clock isn't relevant last clock cOut is ignored because: + // · last cout = 0 => means LT4 = 0 (if the last chunk of a isn't lower than the last of b then we are done). + // · last cout = 1 => means last a chunk is less than b, in this path result only deepends of ge4 value. + + const expr LT4_PROPAGATE = /* NO 0-2,3 */ Global.CLK32[4] + Global.CLK32[5] + Global.CLK32[6] + /* NO 7 */ + Global.CLK32[8] + Global.CLK32[9] + + Global.CLK32[10] + /* NO 11 */ + Global.CLK32[12] + Global.CLK32[13] + Global.CLK32[14] + Global.CLK32[15] + /* NO 16-18,19 */ + Global.CLK32[20] + Global.CLK32[21] + Global.CLK32[22] + /* NO 23 */ + Global.CLK32[24] + Global.CLK32[25] + + Global.CLK32[26] + /* NO 27 */ + Global.CLK32[28] + Global.CLK32[29] + Global.CLK32[30] + Global.CLK32[31]; + + previousAreLt4' === (Global.CLK32[3] + Global.CLK32[19]) * cOut + previousAreLt4 * (LT4_PROPAGATE + (Global.CLK32[7] + Global.CLK32[11] + Global.CLK32[23] + Global.CLK32[27]) * cOut); + + lCout' === cOut + usePreviousAreLt4 * (previousAreLt4 - cOut); + lOpcode' === opcode; + + // P_FLAGS = cOut + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 + // In even byte clocks, useCarry = usePreviousAreLt4 = 0 and cOut = cMiddle, therefore P_FLAGS = cMiddle + 8 * reset4 + + const int LAST_INDEX = bytesPerRow - 1; + for (int index = 0; index < LAST_INDEX; index += 1) { + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[index], freeInB[index], carry[index], freeInC[index], carry[index + 1] + 8 * reset4]); + } + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[result', opcode, freeInA[LAST_INDEX], freeInB[LAST_INDEX], carry[LAST_INDEX], freeInC[LAST_INDEX], carry[LAST_INDEX+1] + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4]); + + useCarry * usePreviousAreLt4 === 0; + + expr a,b,c; + for (int clk = 0; clk < 4; clk += 1 ) { + for (int index = 0; index < 4; index += ) { + a += freeInA[] + } + } + // + // a === freeInA[0] + 2**8 * freeInA[1] + 2**16 * freeInA[2] + 2**24 * freeInA[3]; + // b === freeInB[0] + 2**8 * freeInB[1] + 2**16 * freeInB[2] + 2**24 * freeInB[3]; + + // TODO: verify on each 8 clocks + // c === useCarry * cOut + usePreviousAreLt4 * previousAreLt + (1 - useCarry - usePreviousAreLt4) * (freeInC[0] + 2**8 * freeInC[1] + 2**16 * freeInC[2] + 2**24 * freeInC[3]); + + // In the last byte, when useCarry or usePreviousAreLt4 are 1, the value of c[0] needs to change + // to result (0 or 1). In the first clock, freeInC must be changed to match with the lookup + // because lookup is a static table (has a 0 for comparators), but useCarry or + // usePreviousAreLt4 are dynamic. Otherwise, useCarry and usePreviousAreLt4 are enabled only in the last byte + // (verified lookup only enabled when P_LAST = 1). + + // In the last byte, only FACTOR[7] is active, and freeInC only affects to c[7]'. + + pol c7Temp = c[7] * (1 - RESET) + freeInC[0] * FACTOR[7] + 256 * freeInC[1] * FACTOR[7]; + c[7]' = (1 - useCarry - usePreviousAreLt4) * c7Temp; +} + diff --git a/test/pil2/zkevm-etrog/binary_one_row.pil b/test/pil2/zkevm-etrog/binary_one_row.pil new file mode 100644 index 0000000..22b5835 --- /dev/null +++ b/test/pil2/zkevm-etrog/binary_one_row.pil @@ -0,0 +1,155 @@ +// PIL State Machine that compute 256 bits operations: + +// ope │ opcode │ cin │ carry │ last │ ROWS │ NOTES +// ─────┼────────┼─────┼───────┼──────┼───────┼─────────────────────────────────── +// ADD │ 0 │ 0 │ X │ │ 2**17 │ could use cIn to ADC +// SUB │ 1 │ 0 │ X │ │ 2**17 │ +// LT │ 2 │ 0 │ X │ X │ 2**18 │ +// SLT │ 3 │ 0 │ X │ X │ 2**18 │ +// EQ │ 4 │ 0 │ X │ X │ 2**18 │ +// AND │ 5 │ 0 │ X │ X │ 2**17 │ use carry to detect any bit one +// OR │ 6 │ 0 │ │ │ 2**16 │ +// XOR │ 7 │ 0 │ │ │ 2**16 │ +// LT4 │ 8 │ 0 │ X │ X │ 2**18 │ TOTAL = 2**20 + 2**19 => 2**21 +// ┄┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ + + +// ope │ opcode │ cin │ carry │ last │ ROWS │ NOTES +// ─────┼────────┼─────┼───────┼──────┼───────┼─────────────────────────────────── +// ADD │ 0 │ 0 │ X │ │ 2**17 │ could use cIn to ADC +// SUB │ 1 │ 0 │ X │ │ 2**17 │ +// OR │ 6 │ 0 │ │ │ 2**16 │ +// XOR │ 7 │ 0 │ │ │ 2**16 │ +// LT │ 2 │ 0 │ X │ X │ 2**18 │ +// SLT │ 3 │ 0 │ X │ X │ 2**18 │ +// EQ │ 4 │ 0 │ X │ X │ 2**18 │ +// AND │ 5 │ 0 │ X │ X │ 2**17 │ use carry to detect any bit one +// LT4 │ 8 │ 0 │ X │ X │ 2**18 │ TOTAL = 2**20 + 2**19 => 2**21 +// ┄┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ + + +// bytes/clk │ clk │ cols │ area │ lookups │ opens │ NOTES +// ───────────┼─────┼────────────────┼──────┼─────────┼───────┼─────────────────────────────────── +// 2 │ 16 │ 8 + 4*2 = 16 │ 256 │ 2 │ 17 │ +// 4 │ 8 │ 8 + 4*4 = 24 │ 192 │ 4 │ 9 │ +// 8 │ 4 │ 8 + 4*8 = 40 │ 160 │ 8 │ 5 │ +// 16 │ 2 │ 8 + 4*16 = 76 │ 152 │ 16 │ 3 │ +// 32 │ 1 │ 8 + 4*32 = 136 │ 136 │ 32 │ 2 │ + +const int BINARY_ID = 1; + +subproof aggregate Binary(2**21, 2**23, 2**25) { + + col witness freeInA[32], freeInB[32], freeInC[32]; // 8 x 1 Byte (2 inputs, 1 output) + col witness opcode; // operation code + col witness carry[33]; // 9 chunks carries [cin:0,cout:1],[cin:1,cout:2],...,[cin:6,cout:7] + col witness result; // selector of result binary operation + + // CLK0 1,0,0...0,0|1,0,0...0,0|1,0,.... + // result 0,0,0...0,1|0,0,0...0,1|0,0,.... + // 'result 1,0,0...0,0|1,0,0...0,0|1,0,.... + result * (1 - result) = 0; + + const expr cIn = carry[0]; + const expr cOut = carry[32]; + + for (int index = 0; index < length(carry); index += 1) { + carry[index] * (1 - carry[index]) === 0; + } + + // LT4 (opcode = 8) + // + // This instruction operates over 4 chunks of 64 bits, so we divide the 256-bit values "a" and "b" in 4 chunks of 64 bits. It verifies + // that the 4 "a" chunks are LESS THAN the 4 "b" chunks, one-to-one. + // + // Examples: + // (0x0FFF...FFFF, 0x0FFF...FFFF, 0x0FFF...FFFF, 0x0FFF...FFFF) LT4 (0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF) = 1 + // (0x0FFF...FFFF, 0x0FFF...FFFF, 0xFFFF...FFFF, 0x0FFF...FFFF) LT4 (0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF, 0xFFFF...FFFF) = 0 + // ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ + // + // previousAreLt4: [binary value] flag (*) to indicate whether the first three chunks are lower than or not. + // It is 1 if all of the first three chunks of a are lower than those of b, and 0 otherwise. + // Before the first comparation is 0, and is set with the result of the first comparation. After that, the value is propagated. + // In particular, on the comparisons of the second and third chunks, the result of the comparison (cOut) is multiplied by its value, + // to force it being zero if some of the previous comparison are zero. It works similar to the AND operator. + // Mathematically, this is: + // first chunk --> previousAreLt4 = cOut + // second chunk --> previousAreLt4 = previousAreLt4 * cOut + // third chunk --> previousAreLt4 = previousAreLt4 * cOut + // fourth chunk --> no affects to previousAreLt4 + // + // usePreviousAreLt4: [binary value] flag (**) to use the value of previousAreLt4. It is only active if: + // (a) we are at the last byte, (b) we are in the LT4 operation and (c) it happens that cOut = 1. + // In the last clock, we have: + // · If cOut = 1, then lastChunk(a) < lastChunk(b). Then a LT4 b if the previous chunks are also lower. + // · If cOut = 0, then lastChunk(a) >= lastChunk(b). Then, it doesn't matter the previous chunks; the result of a LT4 b is cOut = 0. + // + // reset4: [binary value] flag (**) to indicate that cIn is reset each 4 clocks in the LT4 operation. + // + // NOTE: (*) Flag is validated by lookup values. + // + // NOTE: (**) To validate the flags usePreviousAreLt4, reset4, useCarry and cOut, check that the composition: + // cout + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 + // is in P_FLAGS. + // After the last optimization, these flags MUST BE constrained to be binary. + // + + col witness previousAreLt4; + col witness usePreviousAreLt4; + col witness reset4; + col witness useCarry; + + previousAreLt4 * (1 - previousAreLt4) === 0; + usePreviousAreLt4 * (1 - usePreviousAreLt4) === 0; + reset4 * (1 - reset4) === 0; + useCarry * (1 - useCarry) === 0; + cOut * (1 - cOut) === 0; + + // RESET = Global.CLK32[0] + Global.CLK32[16]; + + cIn' === cOut * ( 1 - RESET' + reset4 * (Global.CLK32[3] + Global.CLK32[7] + Global.CLK32[11] + + Global.CLK32[19] + Global.CLK32[23] + Global.CLK32[27])); + + // LT4_PROPAGATE (polynomial made up of constant, binary and disjoint polynomials, therefore it's a constant and binary polynomial) + // + // Each 4 clocks this sm has processed 8 bytes = 64 bits, last clock isn't relevant last clock cOut is ignored because: + // · last cout = 0 => means LT4 = 0 (if the last chunk of a isn't lower than the last of b then we are done). + // · last cout = 1 => means last a chunk is less than b, in this path result only deepends of ge4 value. + + previousAreLt4' === (CLK0 + previousAreLt4) * cOut; + + // P_FLAGS = cOut + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 + // In even byte clocks, useCarry = usePreviousAreLt4 = 0 and cOut = cMiddle, therefore P_FLAGS = cMiddle + 8 * reset4 + for (int index = 0; index < 7; ++index) { + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[index], freeInB[index], carry[index], freeInC[index], carry[index + 1]]); + } + lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[result, opcode, freeInA[7], freeInB[7], carry[7], freeInC[7], carry[8] + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4]); + + useCarry * usePreviousAreLt4 === 0; + + // a === freeInA[0] + 2**8 * freeInA[1] + 2**16 * freeInA[2] + 2**24 * freeInA[3]; + // b === freeInB[0] + 2**8 * freeInB[1] + 2**16 * freeInB[2] + 2**24 * freeInB[3]; + + // TODO: verify on each 8 clocks + // c === useCarry * cOut + usePreviousAreLt4 * previousAreLt + (1 - useCarry - usePreviousAreLt4) * (freeInC[0] + 2**8 * freeInC[1] + 2**16 * freeInC[2] + 2**24 * freeInC[3]); + + // In the last byte, when useCarry or usePreviousAreLt4 are 1, the value of c[0] needs to change + // to result (0 or 1). In the first clock, freeInC must be changed to match with the lookup + // because lookup is a static table (has a 0 for comparators), but useCarry or + // usePreviousAreLt4 are dynamic. Otherwise, useCarry and usePreviousAreLt4 are enabled only in the last byte + // (verified lookup only enabled when P_LAST = 1). + + // In the last byte, only FACTOR[7] is active, and freeInC only affects to c[7]'. + + // on last clock freeInA[7] = HSB and 3'freeInA[0] = LSB + expr a,b,c; + for (int clk = 0; clk < 4; clk += 1 ) { + for (int index = 0; index < 8; index += ) { + a = a * 256 + clk'freeInA[7-index]; + b = b * 256 + clk'freeInB[7-index]; + c = c * 256 + clk'freeInC[7-index]; + } + } + const expr opCarryOut = usePreviousAreLt * (previousAreLt4 - cOut) + cOut; + multiset_proves(BINARY_ID, result,[opcode, a, b, (useCarry + usePreviousAreLt) * (opCarryOut - c) + c, cIn, opCarryOut]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/climb_key.pil b/test/pil2/zkevm-etrog/climb_key.pil index e3c55ec..bab1d13 100644 --- a/test/pil2/zkevm-etrog/climb_key.pil +++ b/test/pil2/zkevm-etrog/climb_key.pil @@ -1,5 +1,4 @@ - -subproof ClimbKey(2**16, 2**20); +const int CLIMB_KEY_ID = 10; // ClimbKey // @@ -8,91 +7,110 @@ subproof ClimbKey(2**16, 2**20); // SM to correctly navigate (climb up) the given merkle tree path. Here, by correct, we mean verifying that not overflow occurs. // The overflowing is detected by not including ALL possible combinations of values that produce an overflow in the lookup. // -// keyx = 4 goldilocks values holding the key. It must be satisfied that keyx' = keyx·2 + bit (which should be checked to not overflow). -// Clearly, the key [key0 || key1 || key2 || key3] is at most [0xffffffff00000000 || 0xffffffff00000000 || 0xffffffff00000000 || 0xffffffff00000000] -// bit = Bit to add to climb up the path -// level = A value of 8 bits to indicate the level of the tree (depth) -// keyInChunk = Value of the current chunk (maximum 18 bits) used to verify by the lookup and in the rebuild of the key. -// keySelx = Binary value that is distinct from zero only if in CLK3 and keyx is the key chunk to "increase" based on the level. -// It is validated by the lookup in CLK3. -// keyIn = Accumulator of the values of keyInChunk. It is used to rebuild the key and check for consistency with the expected one. -// ============ -// Example: -// key0 key1 key2 key3 bit keyInChunk FACTOR keyIn keySel0 keySel1 keySel2 keySel3 result level -// CLK0 A0 A1 A2 A3 z A2[0..17] 1 A2[0..17] 0 0 0 0 0 X -// CLK1 A0 A1 A2 A3 z A2[18..35] 2**18 A2[0..35] 0 0 0 0 0 X -// ==> CLK2 {A0 A1 A2 A3} z A2[36..53] 2**36 A2[0..53] 0 0 0 0 1 X <=== key = keyIn -// CLK3 {A0 A1 2*A2+z A3} z A2[54..63] 2**54 A2[0..63] 0 0 1 0 0 22 <=== key = keyOut = keyIn' -// -// CLK0 B0 B1 B2 B3 y B1[0..17] 1 B1[0..17] 0 0 0 0 0 X -// CLK1 B0 B1 B2 B3 y B1[18..35] 2**18 B1[0..35] 0 0 0 0 0 X -// ==> CLK2 {B0 B1 B2 B3} y B1[36..53] 2**36 B1[0..53] 0 0 0 0 {1} X <=== key = keyIn -// CLK3 {B0 2*B1+y B2 B3} y B1[54..63] 2**54 B1[0..63] 0 1 0 0 0 {37} <=== key = keyOut = keyIn' -// -// "{·}" is used to indicate the columns used in the lookup for the storage -// "==>" is used to indicate the result clock - -// key = keyIn on CLK0,CLK1,CLK2 -// key = keyOut = keyIn' on CLK3 -col witness key[4]; - -// Domain verification of level,keyIn,keyInChunk is ensured in the lookup -col witness level; -col witness keyInChunk; - -// Result is used to relate the storage SM with this SM via permutation -col witness result; - -// Binary checks of the following pols are necessary because they are introduced in the lookup as a composition -col witness keySel[4]; - -col witness carryLt; - -const expr CLK0 = Global.CLK32[0] + Global.CLK32[4] + Global.CLK32[8] + Global.CLK32[12] + Global.CLK32[16] + Global.CLK32[20] + Global.CLK32[24] + Global.CLK32[28]; -const expr CLK1 = Global.CLK32[1] + Global.CLK32[5] + Global.CLK32[9] + Global.CLK32[13] + Global.CLK32[17] + Global.CLK32[21] + Global.CLK32[25] + Global.CLK32[29]; -const expr CLK2 = Global.CLK32[2] + Global.CLK32[6] + Global.CLK32[10] + Global.CLK32[14] + Global.CLK32[18] + Global.CLK32[22] + Global.CLK32[26] + Global.CLK32[30]; -const expr CLK3 = Global.CLK32[3] + Global.CLK32[7] + Global.CLK32[11] + Global.CLK32[15] + Global.CLK32[19] + Global.CLK32[23] + Global.CLK32[27] + Global.CLK32[31]; - -// these constraints applies on CLK0, CLK1, CLK2, but for selected key on -// CLK2 don't apply, because CLK2 - keySelx' = 1 - keySelx - -// keyx must remain constant on the transitions CLK0 -> CLK1 -> CLK2 -> CLK except -// for the selected key chunk, which varies on the transition CLK2 -> CLK3. -// On CLK2 we have that CLK2 - keySelx' = 0 for the selected key chunk, and CLK2 - keySelx' = 1 for the rest of keys. -// Note: We use the fact that if keySelx = 1 on CLK3 then keySelx' = 1 on CLK2. -(CLK0 + CLK1 + CLK2 - keySel[0]') * (key[0]' - key[0]) === 0; -(CLK0 + CLK1 + CLK2 - keySel[1]') * (key[1]' - key[1]) === 0; -(CLK0 + CLK1 + CLK2 - keySel[2]') * (key[2]' - key[2]) === 0; -(CLK0 + CLK1 + CLK2 - keySel[3]') * (key[3]' - key[3]) === 0; - -// The next two constraints only apply on CLK2 if keySelx' is selected. - -// 1] Key rebuild. Update keyx for the only key chunk x that changes --> keyx[CLK3] = 2 * keyx[CLK0 ∨ CLK1 ∨ CLK2] + bit (carryLt on CLK0) -keySel[0]' * (key[0]' - 2 * key[0] - 2'carryLt) + -keySel[1]' * (key[1]' - 2 * key[1] - 2'carryLt) + -keySel[2]' * (key[2]' - 2 * key[2] - 2'carrtLt) + -keySel[3]' * (key[3]' - 2 * key[3] - 2'carrtLt) === 0; - -// 2] Key consistency. keyIn is equal to the selected key chunk before the update --> keyIn[CLK3] = keyx[CLK2] -// Further: if this constraint holds true, then it also means that keyInChunks are valid and keyx was rebuilt correctly. -CLK2 * (2'keyInChunk + 2**18 * 'keyInChunk + 2**36 * keyInChunk + 2**54 * keyInChunk') - keySel0' * key0 - keySel1' * key1 - keySel2' * key2 - keySel3' * key3 === 0; - -// Binary checks -bit * (1 - bit) = 0; -keySel[0] * (1 - keySel[0]) = 0; -keySel[1] * (1 - keySel[1]) = 0; -keySel[2] * (1 - keySel[2]) = 0; -keySel[3] * (1 - keySel[3]) = 0; -result * (1 - result) = 0; - -// Result is equal to 1 at CLK2 and 0 in the rest -result * (1 - CLK2) = 0; - -// CLK0 (2 bits) + keyChunk = keyIn[ 0..17] 18 bits + carryLt (2 bits) = 22 bits (only one value of level) -// CLK1 (2 bits) + keyChunk = keyIn[18..35] 18 bits + carryLt (2 bits) = 22 bits (only one value of level) -// CLK2 (2 bits) + keyChunk = keyIn[36..53] 18 bits + carryLt (2 bits) = 22 bits (only one value of level) -// CLK3 (2 bits) + keyChunk = keyIn[54..63] 10 bits + carryLt (2 bits) + level (8 bits) = 22 bits -// Note: keySelx is zero on CLK0,CLK1,CLK2 -const expr clkeySel = CLK1 + 2 * CLK2 + 3 * CLK3 + 2**2 * keySel[0] + 2**3 * keySel[1] + 2**4 * keySel[2] + 2**5 * keySel[3]; - -lockup_assumes(CLIMB_KEY_TABLE_ID, 1, [clkeySel, level * CLK3, keyInChunk, carryLt, (1 - CLK3) * carryLt' } in { T_CLKEYSEL, T_LEVEL, T_CHUNK_VALUE, T_CARRYLT_IN, T_CARRYLT_OUT]); \ No newline at end of file +// usage: +// multiset_assumes(CLIMB_KEY_ID, selector, [keyIn[0], keyIn[1], keyIn[2], keyIn[3], level, bit, keyOut[0], keyOut[1], keyOut[2], keyOut[3]]); + +subproof ClimbKey(2**16, 2**20) { + + // keyIn goldilock with 4 input keys, one by clock (CLK[i]: keyIn = keyIn[i]) + col witness keyIn; + + // keyOut four output keys, one by clock (CLK[i]: keyIn = keyOut[i]) + col witness keyOut; + + // msb_level a value of 6 bits to indicate the most significant level bits of the tree (depth), level = 0 → top of tree (root) + col witness msb_level; + + // keyIn/Out selector keySel when keySel == 0 → keyIn is the active key for current level + col witness keySel; + + // keyInChunk = Value of the current chunk (maximum 18 bits) used to verify by the lookup and in the rebuild of the key. + // Size of keyInChunk is 18 bits on CLK0, 17 bits on CLK1 and CLK2 and 12 bits for CLK3. + // keyInClunk = CLK0 * keyIn[0..17] + CLK1 * keyIn[18..34] + CLK2 * keyIn[35..51] + CLK3 * keyIn[52..63] + col witness keyInChunk; + + // Result is used to relate the storage SM with this SM via permutation + col witness result; + + // On CLK0, carryLt == bit, for the rest of clocks used to link "state" between chunks + // carryLt = carry + 2 * lt + // clin = carryLtIn, clout = carryLtOut + // + // CLK0 CLK1 CLK2 CLK3 + // ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ + // bit─>│clin │ ┌─>│clin │ ┌─>│clin │ ┌─>│clin │ + // │ │ │ │ │ │ │ │ │ │ │ + // │ clout│───┘ │ clout│───┘ │ clout│───┘ │ clout│ + // └─────────┘ └─────────┘ └─────────┘ └─────────┘ + // + // bit is carryLt on CLK0, it's bit to add to climb up the path + + col witness carryLt; + + // clocks: CLK0, CLK1, CLK2, CLK3 + col fixed CLK3 = [0,0,0,1]...; + const expr CLK0 = 3'CLK2; + const expr CLK1 = 2'CLK2; + const expr CLK2 = 'CLK2; + + // + // Examples + // + // │ CLK │ keyIn │ keyOut │ keySel │ keyInChunk │ carryLt | h_level | result | CLK2 relative │ + // ├──────┼────────┼─────────────────────────┼────────┼────────────────┼─────────┼─────────┼────────┼───────────────┤ + // │ CLK0 │ keyIn0 │ keyOut0 (=KeyIn0) │ 0 │ keyIn1[0..17] │ bit │ 0 │ 0 │ 3'x │ + // │ CLK1 │ keyIn1 │ keyOut1 (=KeyIn1*2+bit) │ 1 │ keyIn1[18..34] │ x │ 0 │ 0 │ 2'x │ + // │ CLK2 │ keyIn2 │ keyOut2 (=KeyIn2) │ 0 │ keyIn1[35..51] │ x │ 0 │ 0 │ 'x │ + // │ CLK3 │ keyIn3 │ keyOut3 (=KeyIn3) │ 0 │ keyIn1[52..63] │ x │ h_level │ 1 │ x │ + // + // │ CLK │ keyIn │ keyOut │ keySel │ keyInChunk │ carryLt | h_level | result | CLK2 relative │ + // ├──────┼────────┼─────────────────────────┼────────┼────────────────┼─────────┼─────────┼────────┼───────────────┤ + // │ CLK0 │ keyIn0 │ keyOut0 (=KeyIn0) │ 0 │ keyIn3[0..17] │ bit │ 0 │ 0 │ 3'x │ + // │ CLK1 │ keyIn1 │ keyOut1 (=KeyIn1) │ 0 │ keyIn3[18..34] │ x │ 0 │ 0 │ 2'x │ + // │ CLK2 │ keyIn2 │ keyOut2 (=KeyIn2) │ 0 │ keyIn3[35..51] │ x │ 0 │ 0 │ 'x │ + // │ CLK3 │ keyIn3 │ keyOut3 (=KeyIn3*2+bit) │ 1 │ keyIn3[52..63] │ x │ h_level │ 1 │ x │ + + + // binary constraints + keySel * (1 - keySel) === 0; + result * (1 - result) === 0; + + // bit for each clock, on CLK0 take carryLt value, on CLK1 get the previous value of carryLt,... + const expr bit = CLK0 * carryLt + CLK1 * 'carryLt + CLK2 * 2'carry + CLK3 * 3'carry; + + // if keySel == 0 → keyOut === keyIn + // if keySel == 1 → keyOut === keyIn * 2 + bit (climb-up operation) + keyOut === keyIn + keySel * (keyIn + bit); + + const expr keySel[4] = [3'keySel, 2'keySel, 'keySel, keySel]; + const expr keyIn[4] = [3'keyIn, 2'keyIn, 'keyIn, keyIn]; + const expr keyOut[4] = [3'keyOut, 2'keyOut, 'keyOut, keyOut]; + + // 1] KeyIn rebuild using chunks, keyInBuildByChunk only is used on CLK3 + const expr keyInBuildByChunk = 3'keyInChunk + 2'keyInChunk * 2**18 + 'keyInChunk * 2**35 + keyInChunk * 2**52; + + // 2] KeyIn selected with keySel + const expr keyInSelected = keySel0 * keyIn0 + keySel1 * keyIn1 + keySel2 * keyIn2 + keySel3 * keyIn3; + + // on CLK3 check that keyIn rebuild and keyInSelect are the same → means chunks are correctly calculated. The + // range check of these chunks values is verified throw CLIMB_KEY_TABLE. + CLK3 * (keyInBuildByChunk - keyInSelected) === 0; + + // If there is something to calculate result is equal to 1 at CLK3. In restant situations result is zero. + result * (1 - CLK3) = 0; + + // CLK is a sequence to identify the current clock 0,1,2,3,0,1,2,3. + const expr CLK = CLK1 + 2 * CLK2 + 3 * CLK3; + + // CLK0 (2 bits) + keyChunk = keyIn[ 0..17] 18 bits + carry (1 bits) = 19 bits (level = 0) + // CLK1 (2 bits) + keyChunk = keyIn[18..34] 17 bits + carryLt (2 bits) = 19 bits (level = 0) + // CLK2 (2 bits) + keyChunk = keyIn[35..51] 17 bits + carryLt (2 bits) = 19 bits (level = 0) + // CLK3 (2 bits) + keyChunk = keyIn[52..63] 12 bits + carryLt (2 bits) + level (6 bits) = 20 bits (*) + // (*) more than 50% of 2**12 are invalids for these reason they aren't included in table + // total size is 4 * 2 ** 19 = 2 ** 21 + + lookup_assumes(CLIMB_KEY_TABLE_ID, 1, [CLK, level * CLK3, keyInChunk, carryLt, (1 - CLK3) * carryLt']); + + const expr lsb_level = keySel[3] * 3 + keySel[2] * 2 + keySel[1] * 3; + multiset_proves(CLIMB_KEY_ID, result, [...keyIn, ...keySel, msb_level * 4 + lsb_level, bit, ...keyOut]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/climb_key_table.pil b/test/pil2/zkevm-etrog/climb_key_table.pil index 7094304..192062d 100644 --- a/test/pil2/zkevm-etrog/climb_key_table.pil +++ b/test/pil2/zkevm-etrog/climb_key_table.pil @@ -1,12 +1,115 @@ const int CLIMB_KEY_TABLE_ID = 10; -subproof ClimbKeyTable(2**22) { +subproof ClimbKeyTable(2**21) { -col fixed T_CLKEYSEL, T_LEVEL, T_CHUNK_VALUE, T_CARRYLT_IN, T_CARRYLT_OUT; + col fixed CHUNK_VALUE = [[0...0x3FFFF]:2, + [0...0x1FFFF]:4, + [0...0x1FFFF]:4, + [0...0x7FF,0...0x7FE, 0...0x7FF, 0...0x1FE]:64]...; -// TODO: build constants !!! + col fixed MSB_LEVEL = [[0:524288], + [0:524288], + [0:524288], + [0:8191..63:8191]]...; -lockup_proves(CLIMB_KEY_TABLE_ID, 1, [T_CLKEYSEL, T_LEVEL, T_CHUNK_VALUE, T_CARRYLT_IN, T_CARRYLT_OUT]); + col fixed CARRY_LT_IN = [[0:262144, 1:262144], + [0:131072...3:131072], + [0:131072...3:131072], + [0:2048, 1:2047, 2: 2048, 2:2048]:64]...; + + col fixed CARRY_LT_OUT = [[[2, 0:131071, 3, 1:131071], + [0:131071, 1:131071]], + [[2:57344, 0:8192, 3:57344, 1:8192], + [2:57344, 0:8191, 3:57344, 1:8192], + [2:57345, 0:8191, 3:57345, 1:8191], + [2:57344, 0:8191, 3:57344, 1:8192]], + [[2:65536, 3:65536], + [2:65535, 0, 3:65535, 1], + [2:65536, 3:65536], + [2:65536, 3:65536]], + [2:8191]:64]...; + + col fixed CLK = [0:524288, + 1:524288, + 2:524288, + 3:524224]...; + + // + // ────┬────┬───┬──────────────┬──────────────┬───┬──────────────┬────┬───────┬────┬────────┬─────── + // CL │ CI │ L │ KEY_C (HEX) │ KEY_C (UP) │ C | KEY_C (UP&M) │ LT │ GL_C │ CO │ ROWS │ NOTES + // ────┼────┼───┼──────────────┼──────────────┼───┼──────────────┼────┼───────┼────┼────────┼─────── + // 0 │ 0 │ 0 │ 00000 │ 00000 │ 0 │ 00000 │ 1 │ 00001 │ 2 │ 1 │ + // 0 │ 0 │ 0 │ 00001..1FFFF │ 00002..3FFFE │ 0 │ 00002..3FFFE │ 0 │ 00001 │ 0 │ 131071 │ + // 0 │ 0 │ 0 │ 20000 │ 40000 │ 1 │ 00000 │ 1 │ 00001 │ 3 │ 1 │ + // 0 │ 0 │ 0 │ 20001..3FFFF │ 40002..7FFFE │ 1 │ 00002..3FFFE │ 0 │ 00001 │ 1 │ 131071 │ 262144 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 0 │ 1 │ 0 │ 00000..1FFFF │ 00001..3FFFF │ 0 │ 00001..3FFFF │ 0 │ 00001 │ 0 │ 131072 │ + // 0 │ 1 │ 0 │ 20000..3FFFF │ 40001..7FFFF │ 1 │ 00001..3FFFF │ 0 │ 00001 │ 1 │ 131072 │ 262144 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 1 │ 0 │ 0 │ 00000..0DFFF │ 00000..1BFFE │ 0 │ 00000..1BFFE │ 1 │ 1C000 │ 2 │ 57344 │ + // 1 │ 0 │ 0 │ 0E000..0FFFF │ 1C000..1FFFE │ 0 │ 1C000..1FFFE │ 0 │ 1C000 │ 0 │ 8192 │ + // 1 │ 0 │ 0 │ 10000..1DFFF │ 20000..3BFFE │ 1 │ 00000..1BFFE │ 1 │ 1C000 │ 3 │ 57344 │ + // 1 │ 0 │ 0 │ 1E000..1FFFF │ 3C000..3FFFE │ 1 │ 1C000..1FFFE │ 0 │ 1C000 │ 1 │ 8192 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 1 │ 1 │ 0 │ 00000..0DFFF │ 00001..1BFFF │ 0 │ 00001..1BFFF │ 1 │ 1C000 │ 2 │ 57344 │ + // 1 │ 1 │ 0 │ 0E000..0FFFF │ 1C001..1FFFF │ 0 │ 1C001..1FFFF │ 0 │ 1C000 │ 0 │ 8192 │ + // 1 │ 1 │ 0 │ 10000..1DFFF │ 20001..3BFFF │ 1 │ 00001..1BFFF │ 1 │ 1C000 │ 3 │ 57344 │ + // 1 │ 1 │ 0 │ 1E000..1FFFF │ 3C001..3FFFF │ 1 │ 1C001..1FFFF │ 0 │ 1C000 │ 1 │ 8192 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 1 │ 2 │ 0 │ 00000..0E000 │ 00000..1C000 │ 0 │ 00000..1C000 │ 1 │ 1C000 │ 2 │ 57345 │ + // 1 │ 2 │ 0 │ 0E001..0FFFF │ 1C002..1FFFE │ 0 │ 1C002..1FFFE │ 0 │ 1C000 │ 0 │ 8191 │ + // 1 │ 2 │ 0 │ 10000..1E000 │ 20000..3C000 │ 1 │ 00000..1C000 │ 1 │ 1C000 │ 3 │ 57345 │ + // 1 │ 2 │ 0 │ 1E001..1FFFF │ 3C002..3FFFE │ 1 │ 1C002..1FFFE │ 0 │ 1C000 │ 1 │ 8191 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 1 │ 3 │ 0 │ 00000..0DFFF │ 00001..1BFFF │ 0 │ 00001..1BFFF │ 1 │ 1C000 │ 2 │ 57344 │ + // 1 │ 3 │ 0 │ 0E000..0FFFF │ 1C001..1FFFF │ 0 │ 1C001..1FFFF │ 0 │ 1C000 │ 0 │ 8192 │ + // 1 │ 3 │ 0 │ 10000..1DFFF │ 20001..3BFFF │ 1 │ 00001..1BFFF │ 1 │ 1C000 │ 3 │ 57344 │ + // 1 │ 3 │ 0 │ 1E000..1FFFF │ 3C001..3FFFF │ 1 │ 1C001..1FFFF │ 0 │ 1C000 │ 1 │ 8192 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 2 │ 0 │ 0 │ 00000..0FFFF │ 00000..1FFFE │ 0 │ 00000..1FFFE │ 1 │ 1FFFF │ 2 │ 65536 │ + // 2 │ 0 │ 0 │ 10000..1FFFF │ 20000..3FFFE │ 1 │ 00000..1FFFE │ 1 │ 1FFFF │ 3 │ 65536 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 2 │ 1 │ 0 │ 00000..0FFFE │ 00001..1FFFD │ 0 │ 00001..1FFFD │ 1 │ 1FFFF │ 2 │ 65535 │ + // 2 │ 1 │ 0 │ 0FFFF │ 1FFFF │ 0 │ 1FFFF │ 0 │ 1FFFF │ 0 │ 1 │ + // 2 │ 1 │ 0 │ 10000..1FFFE │ 20001..3FFFD │ 1 │ 00001..1FFFD │ 1 │ 1FFFF │ 3 │ 65535 │ + // 2 │ 1 │ 0 │ 1FFFF │ 3FFFF │ 1 │ 1FFFF │ 0 │ 1FFFF │ 1 │ 1 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 2 │ 2 │ 0 │ 00000..0FFFF │ 00000..1FFFE │ 0 │ 00000..1FFFE │ 1 │ 1FFFF │ 2 │ 65536 │ + // 2 │ 2 │ 0 │ 10000..1FFFF │ 20000..3FFFE │ 1 │ 00000..1FFFE │ 1 │ 1FFFF │ 3 │ 65536 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 2 │ 3 │ 0 │ 00000..0FFFF │ 00001..1FFFF │ 0 │ 00001..1FFFF │ 1 │ 1FFFF │ 2 │ 65536 │ + // 2 │ 3 │ 0 │ 10000..1FFFF │ 20001..3FFFF │ 1 │ 00001..1FFFF │ 1 │ 1FFFF │ 3 │ 65536 │ 131072 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 0 │(*)│ 00000..007FF │ 00000..00FFE │ 0 │ 00000..00FFE │ 1 │ 00FFF │ 2 │ 2048 │ 2048 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 1 │(*)│ 00000..007FE │ 00001..00FFD │ 0 │ 00001..00FFD │ 1 │ 00FFF │ 2 │ 2047 │ 2047 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 2 │(*)│ 00000..007FF │ 00000..00FFE │ 0 │ 00000..00FFE │ 1 │ 00FFF │ 2 │ 2048 │ 2048 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 3 │(*)│ 00000..007FF │ 00001..00FFF │ 0 │ 00001..00FFF │ 1 │ 00FFF │ 2 │ 2048 │ 2048 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // + // 262.144 * 2 + 131.072 * 8 + (2.048 * 3 + 2.047) * 64 = 2.097.088 (< 2**21 = 2.097.152) + // + // (*) msb_level (6 bits) => 64 values + // + // + // EXCLUDED VALUES (not valid values) (1) + // ────┬────┬───┬──────────────┬──────────────┬───┬──────────────┬────┬───────┬────┬────────┬─────── + // CL │ CI │ L │ KEY_C (HEX) │ KEY_C (UP) │ C | KEY_C (UP&M) │ LT │ GL_C │ CO │ ROWS │ NOTES + // ────┼────┼───┼──────────────┼──────────────┼───┼──────────────┼────┼───────┼────┼────────┼─────── + // 3 │ 0 │ 0 │ 00800..00FFF │ 01000..01FFE │ 1 │ 00000..00FFE │ 1 │ 00FFF │ 3 │ 2048 │ 2048 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 1 │ 0 │ 007FF │ 00FFF │ 0 │ 00FFF │ 0 │ 00FFF │ 0 │ 1 │ + // 3 │ 1 │ 0 │ 00800..00FFE │ 01001..01FFD │ 1 │ 00001..00FFD │ 1 │ 00FFF │ 3 │ 2047 │ + // 3 │ 1 │ 0 │ 00FFF │ 01FFF │ 1 │ 00FFF │ 0 │ 00FFF │ 1 │ 1 │ 2049 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 2 │ 0 │ 00800..00FFF │ 01000..01FFE │ 1 │ 00000..00FFE │ 1 │ 00FFF │ 3 │ 2048 │ 2048 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + // 3 │ 3 │ 0 │ 00800..00FFF │ 01001..01FFF │ 1 │ 00001..00FFF │ 1 │ 00FFF │ 3 │ 2048 │ 2048 + // ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄ + + lookup_proves(CLIMB_KEY_TABLE_ID, 1, [CLK, MSB_LEVEL, CHUNK_VALUE, CARRY_LT_IN, CARRY_LT_OUT]); } \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/main.pil b/test/pil2/zkevm-etrog/main.pil index f06fa4a..714e88c 100644 --- a/test/pil2/zkevm-etrog/main.pil +++ b/test/pil2/zkevm-etrog/main.pil @@ -1,192 +1,120 @@ -include "config.pil"; -include "global.pil"; -include "rom.pil"; -include "mem_align.pil"; -include "arith.pil"; -include "binary.pil"; -include "poseidong.pil"; -include "padding_pg.pil"; -include "storage.pil"; -include "padding_kk.pil"; -include "mem.pil"; -include "padding_sha256.pil"; - -namespace Main(%N); - -/////////// -// Definitions -/////////// - +// include "config.pil"; +// include "global.pil"; +// include "rom.pil"; +// include "mem_align.pil"; +// include "arith.pil"; +// include "binary.pil"; +// include "poseidong.pil"; +// include "padding_pg.pil"; +// include "storage.pil"; +// include "padding_kk.pil"; +// include "mem.pil"; +// include "padding_sha256.pil"; +include "../std2/std_mset_lookup_range.pil" +// hash bytes +// assumeFREE +// BitRange32 +// memAlign +// freeBits + +const int RANGE32_ID = 10; + +subproof Main(2**23) { + const int NR = 8; + /////// State Polynomials - pol commit A7, A6, A5, A4, A3, A2, A1; - pol commit A0; - - pol commit B7, B6, B5, B4, B3, B2, B1; - pol commit B0; - - pol commit C7, C6, C5, C4, C3, C2, C1; - pol commit C0; - - pol commit D7, D6, D5, D4, D3, D2, D1; - pol commit D0; - - pol commit E7, E6, E5, E4, E3, E2, E1; - pol commit E0; - - pol commit SR7, SR6, SR5, SR4, SR3, SR2, SR1, SR0; // State Root - pol commit CTX; // Call Cntext - pol commit SP; // Stack Pointer - pol commit PC; // EVM Program counter - pol commit GAS; - pol commit zkPC; // Program Counter of current micro instruction - pol commit RR; // Micro code return address (subroutines) - pol commit HASHPOS; - pol commit RCX; + col witness A[NR], B[NR], C[NR], D[NR], E[NR]; // Generic Registers + col witness SR[NR]; // State Root + col witness CTX; // Call Cntext + col witness SP; // Stack Pointer + col witness PC; // EVM Program counter + col witness GAS; + col witness zkPC; // Program Counter of current micro instruction + col witness RR; // Micro code return address (subroutines) + col witness HASHPOS; + col witness RCX; /////// Instruction related polynomials - pol commit CONST7, CONST6, CONST5, CONST4, CONST3, CONST2, CONST1, CONST0; - pol commit FREE7, FREE6, FREE5, FREE4, FREE3, FREE2, FREE1, FREE0; - pol commit inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, inCTX, inSP, inPC, inGAS, inSTEP, inRR, inHASHPOS, inRCX; - pol commit setA, setB, setC, setD, setE, setSR, setCTX, setSP, setPC, setGAS, setRR, setHASHPOS, setRCX; - pol commit JMP, JMPN, JMPC, JMPZ, offset; - pol commit incStack; - pol commit isStack; - pol commit isMem; - pol commit ind, indRR; - pol commit useCTX; - pol commit carry; + col witness CONST[NR]; + col witness FREE[NR]; + col witness inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, inCTX, inSP, inPC, inGAS, inSTEP, inRR, inHASHPOS, inRCX; + col witness setA, setB, setC, setD, setE, setSR, setCTX, setSP, setPC, setGAS, setRR, setHASHPOS, setRCX; + col witness jmp, jmpn, jmpc, jmpz, offset; + col witness incStack; + col witness isStack; + col witness isMem; + col witness ind, indRR; + col witness useCTX; + col witness carry; // operations - pol commit mOp, mWR; - pol commit sWR, sRD; - pol commit arithEq0, arithEq1, arithEq2, arithEq3, arithEq4, arithEq5; - pol commit memAlignRD, memAlignWR, memAlignWR8; - pol commit hashK, hashK1, hashKLen, hashKDigest; - pol commit hashP, hashP1, hashPLen, hashPDigest; - pol commit hashS, hashS1, hashSLen, hashSDigest; - pol commit bin; - pol commit binOpcode; - pol commit assert; - pol commit repeat, call, return; + col witness mOp, mWR; + col witness sWR, sRD; + col witness arith, arithOp, arithUseCD, arithUseE; + col witness memAlignRD, memAlignWR, memAlignWR8; + col witness hashK, hashKLen, hashKDigest; + col witness hashP, hashPLen, hashPDigest; + col witness hashS, hashSLen, hashSDigest; + col witness useHashBytes, hashBytes; + col witness bin; + col witness binOpcode; + col witness assert; + col witness repeat, call, returnJmp; + col witness assumeFREE; /////// Intermediary commit polynomials - pol commit isNeg; + col witness isNeg; /// Counters - pol commit cntArith, cntBinary, cntMemAlign, cntKeccakF, cntSha256F, cntPoseidonG, cntPaddingPG; - pol commit inCntArith, inCntBinary, inCntMemAlign, inCntKeccakF, inCntSha256F, inCntPoseidonG, inCntPaddingPG; - pol commit incCounter; - -/////////// -// Intermediary calculations and checks -/////////// - - - /////// op - pol op0 = - A0 * inA + - B0 * inB + - C0 * inC + - C7 * inROTL_C + - D0 * inD + - E0 * inE + - FREE0 * (inFREE + inFREE0) + - SR0 * inSR + - CTX * inCTX + - SP * inSP + - PC * inPC + - GAS * inGAS + - Global.STEP * inSTEP + - RR * inRR + - HASHPOS * inHASHPOS + - cntArith * inCntArith + - cntBinary * inCntBinary + - cntMemAlign * inCntMemAlign + - cntKeccakF * inCntKeccakF + - cntSha256F * inCntSha256F + - cntPoseidonG * inCntPoseidonG + - cntPaddingPG * inCntPaddingPG + - RCX * inRCX + - CONST0; - - pol op1 = - A1 * inA + - B1 * inB + - C1 * inC + - C0 * inROTL_C + - D1 * inD + - E1 * inE + - SR1 * inSR + - FREE1 * inFREE + - CONST1; - - pol op2 = - A2 * inA + - B2 * inB + - C2 * inC + - C1 * inROTL_C + - D2 * inD + - E2 * inE + - SR2 * inSR + - FREE2 * inFREE + - CONST2; - - pol op3 = - A3 * inA + - B3 * inB + - C3 * inC + - C2 * inROTL_C + - D3 * inD + - E3 * inE + - SR3 * inSR + - FREE3 * inFREE + - CONST3; - - pol op4 = - A4 * inA + - B4 * inB + - C4 * inC + - C3 * inROTL_C + - D4 * inD + - E4 * inE + - SR4 * inSR + - FREE4 * inFREE + - CONST4; - - pol op5 = - A5 * inA + - B5 * inB + - C5 * inC + - C4 * inROTL_C + - D5 * inD + - E5 * inE + - SR5 * inSR + - FREE5 * inFREE + - CONST5; - - pol op6 = - A6 * inA + - B6 * inB + - C6 * inC + - C5 * inROTL_C + - D6 * inD + - E6 * inE + - SR6 * inSR + - FREE6 * inFREE + - CONST6; - - pol op7 = - A7 * inA + - B7 * inB + - C7 * inC + - C6 * inROTL_C + - D7 * inD + - E7 * inE + - SR7 * inSR + - FREE7 * inFREE + - CONST7; - - /////// addr + col witness cntArith, cntBinary, cntMemAlign, cntKeccakF, cntSha256F, cntPoseidonG, cntPaddingPG; + col witness inCntArith, inCntBinary, inCntMemAlign, inCntKeccakF, inCntSha256F, inCntPoseidonG, inCntPaddingPG; + col witness incCounter; + + col witness jmpAddr; + col witness elseAddr; + col witness useAddrRel; + col witness useJmpAddrRel; + col witness useElseAddrRel; + + col fixed L1 = [1,0...]; + col fixed STEP = [0..(N-1)]; + // op registers with out of expression + // av assumed value, could be op or FREE + const expr op[8]; + const expr assumeInput[8]; + for (int index = 0; index < 7; ++index) { + expr _op = + A[index] * inA + + B[index] * inB + + C[index] * inC + + C[(index + 7) % 8] * inROTL_C + + D[index] * inD + + E[index] * inE + + FREE[index] * (inFREE + inFREE0) + + SR[index] * inSR + + CONST[index]; + + if (index == 0) { + _op += + CTX * inCTX + + SP * inSP + + PC * inPC + + GAS * inGAS + + STEP * inSTEP + + RR * inRR + + HASHPOS * inHASHPOS + + cntArith * inCntArith + + cntBinary * inCntBinary + + cntMemAlign * inCntMemAlign + + cntKeccakF * inCntKeccakF + + cntSha256F * inCntSha256F + + cntPoseidonG * inCntPoseidonG + + cntPaddingPG * inCntPaddingPG + + RCX * inRCX; + } + op[index] = _op; + assumeInput[index] = (1 - assumeFREE) * (op[index] - FREE[index]) + FREE[index]; + } /* @@ -199,807 +127,288 @@ namespace Main(%N); */ - pol addrRel = ind*E0 + indRR*RR + offset; - pol addr = useCTX*CTX*2**18 + isStack*2**16 + isStack*SP + isMem*2**17+ addrRel; - - /////// isNeg - - pol commit lJmpnCondValue; - pol jmpnCondValue = JMPN*(isNeg*2**32 + op0); - isNeg * (1 - isNeg) = 0; - - lJmpnCondValue in Global.STEP; - - pol commit hJmpnCondValueBit[9]; - - hJmpnCondValueBit[8] * (1-hJmpnCondValueBit[8]) = 0; - hJmpnCondValueBit[7] * (1-hJmpnCondValueBit[7]) = 0; - hJmpnCondValueBit[6] * (1-hJmpnCondValueBit[6]) = 0; - hJmpnCondValueBit[5] * (1-hJmpnCondValueBit[5]) = 0; - hJmpnCondValueBit[4] * (1-hJmpnCondValueBit[4]) = 0; - hJmpnCondValueBit[3] * (1-hJmpnCondValueBit[3]) = 0; - hJmpnCondValueBit[2] * (1-hJmpnCondValueBit[2]) = 0; - hJmpnCondValueBit[1] * (1-hJmpnCondValueBit[1]) = 0; - hJmpnCondValueBit[0] * (1-hJmpnCondValueBit[0]) = 0; - - jmpnCondValue = 2**31*hJmpnCondValueBit[8] + 2**30*hJmpnCondValueBit[7] + 2**29*hJmpnCondValueBit[6] + 2**28*hJmpnCondValueBit[5] + - 2**27*hJmpnCondValueBit[4] + 2**26*hJmpnCondValueBit[3] + 2**25*hJmpnCondValueBit[2] + 2**24*hJmpnCondValueBit[1] + - 2**23*hJmpnCondValueBit[0] + lJmpnCondValue; - - - /// RCX check zero - pol commit RCXInv; - pol RCXIsZero = 1 - RCX*RCXInv; - RCXIsZero*RCX = 0; - - /// op0 check zero - pol commit op0Inv; - pol op0IsZero = 1 - op0*op0Inv; - op0IsZero*op0 = 0; - -/////////// -// Calculate New State -/////////// - - A0' = setA * (op0 - A0) + A0; - A1' = setA * (op1 - A1) + A1; - A2' = setA * (op2 - A2) + A2; - A3' = setA * (op3 - A3) + A3; - A4' = setA * (op4 - A4) + A4; - A5' = setA * (op5 - A5) + A5; - A6' = setA * (op6 - A6) + A6; - A7' = setA * (op7 - A7) + A7; - - B0' = setB * (op0 - B0) + B0; - B1' = setB * (op1 - B1) + B1; - B2' = setB * (op2 - B2) + B2; - B3' = setB * (op3 - B3) + B3; - B4' = setB * (op4 - B4) + B4; - B5' = setB * (op5 - B5) + B5; - B6' = setB * (op6 - B6) + B6; - B7' = setB * (op7 - B7) + B7; - - C0' = setC * (op0 - C0) + C0; - C1' = setC * (op1 - C1) + C1; - C2' = setC * (op2 - C2) + C2; - C3' = setC * (op3 - C3) + C3; - C4' = setC * (op4 - C4) + C4; - C5' = setC * (op5 - C5) + C5; - C6' = setC * (op6 - C6) + C6; - C7' = setC * (op7 - C7) + C7; - - D0' = setD * (op0 - D0) + D0; - D1' = setD * (op1 - D1) + D1; - D2' = setD * (op2 - D2) + D2; - D3' = setD * (op3 - D3) + D3; - D4' = setD * (op4 - D4) + D4; - D5' = setD * (op5 - D5) + D5; - D6' = setD * (op6 - D6) + D6; - D7' = setD * (op7 - D7) + D7; - - E0' = setE * (op0 - E0) + E0; - E1' = setE * (op1 - E1) + E1; - E2' = setE * (op2 - E2) + E2; - E3' = setE * (op3 - E3) + E3; - E4' = setE * (op4 - E4) + E4; - E5' = setE * (op5 - E5) + E5; - E6' = setE * (op6 - E6) + E6; - E7' = setE * (op7 - E7) + E7; - - SR0' = setSR * (op0 - SR0) + SR0; - SR1' = setSR * (op1 - SR1) + SR1; - SR2' = setSR * (op2 - SR2) + SR2; - SR3' = setSR * (op3 - SR3) + SR3; - SR4' = setSR * (op4 - SR4) + SR4; - SR5' = setSR * (op5 - SR5) + SR5; - SR6' = setSR * (op6 - SR6) + SR6; - SR7' = setSR * (op7 - SR7) + SR7; - - CTX' = setCTX * (op0 - CTX) + CTX; - SP' = setSP * (op0 - (SP +incStack)) + (SP +incStack); - PC' = setPC * (op0 - PC) + PC; + const expr addrRel = ind * E[0] + indRR * RR; + const expr addr = 2**18 * useCTX * CTX + + 2**16 * isStack + isStack*SP + + 2**17 * isMem + useAddrRel * addrRel + offset; + + #pragma debug on + multiset_assumes(RANGE32_ID, jmpn, [isNeg * 2**32 + op[0], 32]); + isNeg * (1 - isNeg) === 0; + + // RCX check zero + col witness RCXInv; + const expr RCXIsZero = 1 - RCX * RCXInv; + RCXIsZero * RCX === 0; + + // op0 check zero + col witness op0Inv; + const expr op0IsZero = 1 - op0*op0Inv; + op0IsZero * op0 === 0; + + // Calculate New State + for (int index = 0; index < NR; ++index) { + A[index]' === setA * (op[index] - A[index]) + A[index]; + B[index]' === setB * (op[index] - B[index]) + B[index]; + C[index]' === setC * (op[index] - C[index]) + C[index]; + D[index]' === setD * (op[index] - D[index]) + D[index]; + E[index]' === setE * (op[index] - E[index]) + E[index]; + SR[index]' === setSR * (op[index] - SR[index]) + SR[index]; + } + + CTX' === setCTX * (op[0] - CTX) + CTX; + SP' === setSP * (op[0] - (SP +incStack)) + (SP +incStack); + PC' === setPC * (op[0] - PC) + PC; // ROM constraint: call * setRR = 0 - RR' = setRR * (op0 - RR) + call * (zkPC + 1 - RR) + RR; - GAS' = setGAS * (op0 - GAS) + GAS; + RR' === setRR * (op[0] - RR) + call * (zkPC + 1 - RR) + RR; + GAS' === setGAS * (op[0] - GAS) + GAS; - pol decRCX = repeat * (1-RCXIsZero); - RCX' = setRCX * (op0 - (RCX-decRCX)) + (RCX-decRCX); + const expr decRCX = repeat * (1 - RCXIsZero); + RCX' === setRCX * (op0 - (RCX-decRCX)) + (RCX-decRCX); - HASHPOS' = setHASHPOS * (op0 - HASHPOS) + HASHPOS + (hashK + hashP + hashS)*D0 + hashK1 + hashP1 + hashS1; + HASHPOS' === setHASHPOS * (op0 - HASHPOS) + HASHPOS + (hashK + hashP + hashS)*D0 + useHashBytes * hashBytes; - pol doJMP = JMPN*isNeg + JMP + JMPC*carry + JMPZ*op0IsZero + return + call; - pol elseJMP = JMPN*(1-isNeg) + JMPC*(1-carry) + JMPZ*(1-op0IsZero); + const expr doJmp = jmpn * isNeg + jmp + jmpC * carry + jmpz * op0IsZero + returnJmp + call; + const expr elseJmp = jmpn * (1-isNeg) + jmpc * (1-carry) + jmpz * (1-op0IsZero); - pol commit jmpAddr; - pol commit elseAddr; - pol commit useJmpAddr; - pol commit useElseAddr; - - // ROM/Zkasm constraint: useJmpAddr * return = 0 - pol finalJmpAddr = useJmpAddr * (jmpAddr - addr ) + return * (RR - addr) + addr; - pol nextNoJmpZkPC = zkPC + 1 - ((1-RCXIsZero)*repeat); - pol finalElseAddr = useElseAddr * (elseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; + // ROM/Zkasm constraint: useJmpAddr * returnJmp = 0 + const expr finalJmpAddr = jmpAddr + useJmpAddrRel * addrRel + returnJmp * (RR' - jmpAddr); + const expr nextNoJmpZkPC = zkPC + 1 - ((1-RCXIsZero)*repeat); + const expr finalElseAddr = useElseAddr * (elseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; // if elseAddr wasn't specified on zkasm, compiler put current address + 1 - zkPC' = doJMP * (finalJmpAddr - nextNoJmpZkPC) + elseJMP * (finalElseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; - - zkPC * Global.L1 = 0; - - (A0-op0)*assert = 0; - (A1-op1)*assert = 0; - (A2-op2)*assert = 0; - (A3-op3)*assert = 0; - (A4-op4)*assert = 0; - (A5-op5)*assert = 0; - (A6-op6)*assert = 0; - (A7-op7)*assert = 0; - - public oldStateRoot0 = B0(0); - public oldStateRoot1 = B1(0); - public oldStateRoot2 = B2(0); - public oldStateRoot3 = B3(0); - public oldStateRoot4 = B4(0); - public oldStateRoot5 = B5(0); - public oldStateRoot6 = B6(0); - public oldStateRoot7 = B7(0); - Global.L1 * (B0 - :oldStateRoot0) = 0; - Global.L1 * (B1 - :oldStateRoot1) = 0; - Global.L1 * (B2 - :oldStateRoot2) = 0; - Global.L1 * (B3 - :oldStateRoot3) = 0; - Global.L1 * (B4 - :oldStateRoot4) = 0; - Global.L1 * (B5 - :oldStateRoot5) = 0; - Global.L1 * (B6 - :oldStateRoot6) = 0; - Global.L1 * (B7 - :oldStateRoot7) = 0; - - public oldAccInputHash0 = C0(0); - public oldAccInputHash1 = C1(0); - public oldAccInputHash2 = C2(0); - public oldAccInputHash3 = C3(0); - public oldAccInputHash4 = C4(0); - public oldAccInputHash5 = C5(0); - public oldAccInputHash6 = C6(0); - public oldAccInputHash7 = C7(0); - Global.L1 * (C0 - :oldAccInputHash0) = 0; - Global.L1 * (C1 - :oldAccInputHash1) = 0; - Global.L1 * (C2 - :oldAccInputHash2) = 0; - Global.L1 * (C3 - :oldAccInputHash3) = 0; - Global.L1 * (C4 - :oldAccInputHash4) = 0; - Global.L1 * (C5 - :oldAccInputHash5) = 0; - Global.L1 * (C6 - :oldAccInputHash6) = 0; - Global.L1 * (C7 - :oldAccInputHash7) = 0; - - public oldBatchNum = SP(0); - Global.L1 * (SP - :oldBatchNum) = 0; - - public chainId = GAS(0); - Global.L1 * (GAS - :chainId) = 0; - - public forkId = CTX(0); - Global.L1 * (CTX - :forkId) = 0; - - public newStateRoot0 = SR0(%N-1); - public newStateRoot1 = SR1(%N-1); - public newStateRoot2 = SR2(%N-1); - public newStateRoot3 = SR3(%N-1); - public newStateRoot4 = SR4(%N-1); - public newStateRoot5 = SR5(%N-1); - public newStateRoot6 = SR6(%N-1); - public newStateRoot7 = SR7(%N-1); - Global.LLAST * (SR0 - :newStateRoot0) = 0; - Global.LLAST * (SR1 - :newStateRoot1) = 0; - Global.LLAST * (SR2 - :newStateRoot2) = 0; - Global.LLAST * (SR3 - :newStateRoot3) = 0; - Global.LLAST * (SR4 - :newStateRoot4) = 0; - Global.LLAST * (SR5 - :newStateRoot5) = 0; - Global.LLAST * (SR6 - :newStateRoot6) = 0; - Global.LLAST * (SR7 - :newStateRoot7) = 0; - - public newAccInputHash0 = D0(%N -1); - public newAccInputHash1 = D1(%N -1); - public newAccInputHash2 = D2(%N -1); - public newAccInputHash3 = D3(%N -1); - public newAccInputHash4 = D4(%N -1); - public newAccInputHash5 = D5(%N -1); - public newAccInputHash6 = D6(%N -1); - public newAccInputHash7 = D7(%N -1); - Global.LLAST * (D0 - :newAccInputHash0) = 0; - Global.LLAST * (D1 - :newAccInputHash1) = 0; - Global.LLAST * (D2 - :newAccInputHash2) = 0; - Global.LLAST * (D3 - :newAccInputHash3) = 0; - Global.LLAST * (D4 - :newAccInputHash4) = 0; - Global.LLAST * (D5 - :newAccInputHash5) = 0; - Global.LLAST * (D6 - :newAccInputHash6) = 0; - Global.LLAST * (D7 - :newAccInputHash7) = 0; - - public localExitRoot0 = E0(%N-1); - public localExitRoot1 = E1(%N-1); - public localExitRoot2 = E2(%N-1); - public localExitRoot3 = E3(%N-1); - public localExitRoot4 = E4(%N-1); - public localExitRoot5 = E5(%N-1); - public localExitRoot6 = E6(%N-1); - public localExitRoot7 = E7(%N-1); - Global.LLAST * (E0 - :localExitRoot0) = 0; - Global.LLAST * (E1 - :localExitRoot1) = 0; - Global.LLAST * (E2 - :localExitRoot2) = 0; - Global.LLAST * (E3 - :localExitRoot3) = 0; - Global.LLAST * (E4 - :localExitRoot4) = 0; - Global.LLAST * (E5 - :localExitRoot5) = 0; - Global.LLAST * (E6 - :localExitRoot6) = 0; - Global.LLAST * (E7 - :localExitRoot7) = 0; - - public newBatchNum = PC(%N-1); - Global.LLAST * (PC - :newBatchNum) = 0; - - + zkPC' = doJmp * (finalJmpAddr - nextNoJmpZkPC) + elseJmp * (finalElseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; + + zkPC * L1 === 0; + + // public inputs + public oldStateRoot[NR]; + public oldAccInputHash[NR]; + public oldBatchNum; + public chainId; + public forkId; + + // public outputs + public newStateRoot[NR]; + public newAccInputHash[NR]; + public localExitRoot[NR]; + public newBatchNum; + + for (int index = 0; index < NR; ++index) { + (A[index] - op[index]) * assert === 0; + // oldStateRoot[NR] = B(NR); + L1 * (B[index] - oldStateRoot[index]) === 0; + // oldBatchNum[NR] = SP(NR); + L1 * (C[index] - oldAccInputHash[index]) === 0; + // public newStateRoot0 = SR0(%N-1); + L1' * (SR[index] - newStateRoot[index]) === 0; + // public newAccInputHash0 = D0(%N -1); + L1' * (D[index] - newAccInputHash[index]) === 0; + // public localExitRoot0 = E0(%N-1); + L1' * (E[index] - localExitRoot[index]) === 0; + } + + // public oldBatchNum = SP(0); + L1 * (SP - oldBatchNum) === 0; + + // public chainId = GAS(0); + L1 * (GAS - chainId) === 0; + + // public forkId = CTX(0); + L1 * (CTX - forkId) === 0; + + L1' * (PC - newBatchNum) === 0; + + const expr GL = 0xFFFFFFFF00000001; + const expr LSB_GL = GL & 0xFFFFFFFF; + const expr HSB_GL = GL >> 16; + + // TODO: + // const expr GL4[8] = [LSB_GL, HSB_GL, LSB_GL, HSB_GL, LSB_GL, HSB_GL, LSB_GL, HSB_GL]; + const expr GL4[8]; + GL4[0] = LSB_GL; + GL4[1] = HSB_GL; + GL4[2] = LSB_GL; + GL4[3] = HSB_GL; + GL4[4] = LSB_GL; + GL4[5] = HSB_GL; + GL4[6] = LSB_GL; + GL4[7] = HSB_GL; // Check that the calculated hash is well formed - sWR + hashPDigest { - op0, op1, op2, op3, op4, op5, op6, op7, - %GL_L, %GL_H, %GL_L, %GL_H, %GL_L, %GL_H, %GL_L, %GL_H, - 8, 1 - } is - Binary.resultValidRange { - Binary.a[0], Binary.a[1], Binary.a[2], Binary.a[3], Binary.a[4], Binary.a[5], Binary.a[6], Binary.a[7], - Binary.b[0], Binary.b[1], Binary.b[2], Binary.b[3], Binary.b[4], Binary.b[5], Binary.b[6], Binary.b[7], - Binary.lOpcode, Binary.lCout - }; - -///////// -// ROM Plookpups -///////// - - /* - code generated with: - node tools/pil_pol_table/bits_compose.js "arithEq0,arithEq1,arithEq2,assert,bin,hashK,hashKDigest,hashKLen,hashP,hashPDigest,hashPLen,ind,indRR,isMem,isStack,JMP,JMPC,JMPN,memAlignRD,memAlignWR,memAlignWR8,mOp,mWR,repeat,setA,setB,setC,setCTX,setD,setE,setGAS,setHASHPOS,setPC,setRCX,setRR,setSP,setSR,sRD,sWR,useCTX,useJmpAddr,JMPZ,call,return,hashK1,hashP1,useElseAddr,arithEq3,arithEq4,arithEq5,hashS,hashSDigest,hashSLen,hashS1" -b - */ - - pol operations = - 2**0 * arithEq0 + 2**1 * arithEq1 + 2**2 * arithEq2 + 2**3 * assert - + 2**4 * bin + 2**5 * hashK + 2**6 * hashKDigest + 2**7 * hashKLen - + 2**8 * hashP + 2**9 * hashPDigest + 2**10 * hashPLen + 2**11 * ind - + 2**12 * indRR + 2**13 * isMem + 2**14 * isStack + 2**15 * JMP - + 2**16 * JMPC + 2**17 * JMPN + 2**18 * memAlignRD + 2**19 * memAlignWR - + 2**20 * memAlignWR8 + 2**21 * mOp + 2**22 * mWR + 2**23 * repeat - + 2**24 * setA + 2**25 * setB + 2**26 * setC + 2**27 * setCTX - + 2**28 * setD + 2**29 * setE + 2**30 * setGAS + 2**31 * setHASHPOS - + 2**32 * setPC + 2**33 * setRCX + 2**34 * setRR + 2**35 * setSP - + 2**36 * setSR + 2**37 * sRD + 2**38 * sWR + 2**39 * useCTX - + 2**40 * useJmpAddr + 2**41 * JMPZ + 2**42 * call + 2**43 * return - + 2**44 * hashK1 + 2**45 * hashP1 + 2**46 * useElseAddr + 2**47 * arithEq3 - + 2**48 * arithEq4 + 2**49 * arithEq5 + 2**50 * hashS + 2**51 * hashSDigest - + 2**52 * hashSLen + 2**53 * hashS1; - - (1 - arithEq0) * arithEq0 = 0; - (1 - arithEq1) * arithEq1 = 0; - (1 - arithEq2) * arithEq2 = 0; - (1 - assert) * assert = 0; - (1 - bin) * bin = 0; - (1 - hashK) * hashK = 0; - (1 - hashKDigest) * hashKDigest = 0; - (1 - hashKLen) * hashKLen = 0; - (1 - hashP) * hashP = 0; - (1 - hashPDigest) * hashPDigest = 0; - (1 - hashPLen) * hashPLen = 0; - (1 - ind) * ind = 0; - (1 - indRR) * indRR = 0; - (1 - isMem) * isMem = 0; - (1 - isStack) * isStack = 0; - (1 - JMP) * JMP = 0; - (1 - JMPC) * JMPC = 0; - (1 - JMPN) * JMPN = 0; - (1 - memAlignRD) * memAlignRD = 0; - (1 - memAlignWR) * memAlignWR = 0; - (1 - memAlignWR8) * memAlignWR8 = 0; - (1 - mOp) * mOp = 0; - (1 - mWR) * mWR = 0; - (1 - repeat) * repeat = 0; - (1 - setA) * setA = 0; - (1 - setB) * setB = 0; - (1 - setC) * setC = 0; - (1 - setCTX) * setCTX = 0; - (1 - setD) * setD = 0; - (1 - setE) * setE = 0; - (1 - setGAS) * setGAS = 0; - (1 - setHASHPOS) * setHASHPOS = 0; - (1 - setPC) * setPC = 0; - (1 - setRCX) * setRCX = 0; - (1 - setRR) * setRR = 0; - (1 - setSP) * setSP = 0; - (1 - setSR) * setSR = 0; - (1 - sRD) * sRD = 0; - (1 - sWR) * sWR = 0; - (1 - useCTX) * useCTX = 0; - (1 - useJmpAddr) * useJmpAddr = 0; - (1 - JMPZ) * JMPZ = 0; - (1 - call) * call = 0; - (1 - return) * return = 0; - (1 - hashK1) * hashK1 = 0; - (1 - hashP1) * hashP1 = 0; - (1 - useElseAddr) * useElseAddr = 0; - (1 - arithEq3) * arithEq3 = 0; - (1 - arithEq4) * arithEq4 = 0; - (1 - arithEq5) * arithEq5 = 0; - (1 - hashS) * hashS = 0; - (1 - hashSDigest) * hashSDigest = 0; - (1 - hashSLen) * hashSLen = 0; - (1 - hashS1) * hashS1 = 0; - - { - CONST0, CONST1, CONST2, CONST3, CONST4, CONST5, CONST6, CONST7, - inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, - inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR, inRCX, - inCntArith, inCntBinary, inCntKeccakF, inCntSha256F, inCntMemAlign, inCntPaddingPG, inCntPoseidonG, - operations, offset, incStack, binOpcode, jmpAddr, elseAddr, zkPC - } in { - Rom.CONST0, Rom.CONST1, Rom.CONST2, Rom.CONST3, Rom.CONST4, Rom.CONST5, Rom.CONST6, Rom.CONST7, - Rom.inA, Rom.inB, Rom.inC, Rom.inROTL_C, Rom.inD, Rom.inE, Rom.inSR, Rom.inFREE, Rom.inFREE0, - Rom.inCTX, Rom.inSP, Rom.inPC, Rom.inGAS, Rom.inHASHPOS, Rom.inSTEP, Rom.inRR, Rom.inRCX, - Rom.inCntArith, Rom.inCntBinary, Rom.inCntKeccakF, Rom.inCntSha256F, Rom.inCntMemAlign, Rom.inCntPaddingPG, Rom.inCntPoseidonG, - Rom.operations, Rom.offset, Rom.incStack, Rom.binOpcode, Rom.jmpAddr, Rom.elseAddr, Rom.line - }; - - pol commit sKeyI[4]; - pol commit sKey[4]; - -///////// -// Arithmetic Plookpups -///////// - - pol ax1_0 = Arith.x1[0] + Arith.x1[1]*2**16; - pol ax1_1 = Arith.x1[2] + Arith.x1[3]*2**16; - pol ax1_2 = Arith.x1[4] + Arith.x1[5]*2**16; - pol ax1_3 = Arith.x1[6] + Arith.x1[7]*2**16; - pol ax1_4 = Arith.x1[8] + Arith.x1[9]*2**16; - pol ax1_5 = Arith.x1[10] + Arith.x1[11]*2**16; - pol ax1_6 = Arith.x1[12] + Arith.x1[13]*2**16; - pol ax1_7 = Arith.x1[14] + Arith.x1[15]*2**16; - - pol ay1_0 = Arith.y1[0] + Arith.y1[1]*2**16; - pol ay1_1 = Arith.y1[2] + Arith.y1[3]*2**16; - pol ay1_2 = Arith.y1[4] + Arith.y1[5]*2**16; - pol ay1_3 = Arith.y1[6] + Arith.y1[7]*2**16; - pol ay1_4 = Arith.y1[8] + Arith.y1[9]*2**16; - pol ay1_5 = Arith.y1[10] + Arith.y1[11]*2**16; - pol ay1_6 = Arith.y1[12] + Arith.y1[13]*2**16; - pol ay1_7 = Arith.y1[14] + Arith.y1[15]*2**16; - - pol ax2_0 = Arith.x2[0] + Arith.x2[1]*2**16; - pol ax2_1 = Arith.x2[2] + Arith.x2[3]*2**16; - pol ax2_2 = Arith.x2[4] + Arith.x2[5]*2**16; - pol ax2_3 = Arith.x2[6] + Arith.x2[7]*2**16; - pol ax2_4 = Arith.x2[8] + Arith.x2[9]*2**16; - pol ax2_5 = Arith.x2[10] + Arith.x2[11]*2**16; - pol ax2_6 = Arith.x2[12] + Arith.x2[13]*2**16; - pol ax2_7 = Arith.x2[14] + Arith.x2[15]*2**16; - - pol ay2_0 = Arith.y2[0] + Arith.y2[1]*2**16; - pol ay2_1 = Arith.y2[2] + Arith.y2[3]*2**16; - pol ay2_2 = Arith.y2[4] + Arith.y2[5]*2**16; - pol ay2_3 = Arith.y2[6] + Arith.y2[7]*2**16; - pol ay2_4 = Arith.y2[8] + Arith.y2[9]*2**16; - pol ay2_5 = Arith.y2[10] + Arith.y2[11]*2**16; - pol ay2_6 = Arith.y2[12] + Arith.y2[13]*2**16; - pol ay2_7 = Arith.y2[14] + Arith.y2[15]*2**16; - - pol ax3_0 = Arith.x3[0] + Arith.x3[1]*2**16; - pol ax3_1 = Arith.x3[2] + Arith.x3[3]*2**16; - pol ax3_2 = Arith.x3[4] + Arith.x3[5]*2**16; - pol ax3_3 = Arith.x3[6] + Arith.x3[7]*2**16; - pol ax3_4 = Arith.x3[8] + Arith.x3[9]*2**16; - pol ax3_5 = Arith.x3[10] + Arith.x3[11]*2**16; - pol ax3_6 = Arith.x3[12] + Arith.x3[13]*2**16; - pol ax3_7 = Arith.x3[14] + Arith.x3[15]*2**16; - - pol ay3_0 = Arith.y3[0] + Arith.y3[1]*2**16; - pol ay3_1 = Arith.y3[2] + Arith.y3[3]*2**16; - pol ay3_2 = Arith.y3[4] + Arith.y3[5]*2**16; - pol ay3_3 = Arith.y3[6] + Arith.y3[7]*2**16; - pol ay3_4 = Arith.y3[8] + Arith.y3[9]*2**16; - pol ay3_5 = Arith.y3[10] + Arith.y3[11]*2**16; - pol ay3_6 = Arith.y3[12] + Arith.y3[13]*2**16; - pol ay3_7 = Arith.y3[14] + Arith.y3[15]*2**16; + // TODO: + // multiset_assumes(BINARY_ID, WR + hashPDigest, [...op, ...GL4, [1, 0:7], BINARY_OP_LT4]); + // multiset_assumes(BINARY_ID, WR + hashPDigest, [...op, ...GL4, [1, 0:(NR-1)], BINARY_OP_LT4]); + multiset_assumes(BINARY_ID, WR + hashPDigest, [...op, ...GL4, 1, 0, 0, 0, 0, 0, 0, 0, BINARY_OP_LT4]); + + // Binary: resultValidRange []...a, ...b, lOpcode, Binary.lCout]; + + // ROM lookup + + // arithEq0, arithEq1, arithEq2,,arithEq3,arithEq4,arithEq5, => arithOp + // hashP1, hashK1, hashS1 => + // ind, indR + const expr romFlags = compact_bin_cols ([ + assert, bin, binCarryIn, sRD, sWR, memAlignRD, memAlignWR, memAlignWR8, mOp, mWR, + arith, arithUseCD, arithUseCD, + hashK, hashKDigest, hashKLen, hashP, hashPDigest, hashPLen, + hashS, hashSDigest, hashSLen, useHashBytes, + isMem, isStack, useCTX, useAddrRel, + useJmpAddrRel, useElseAddrRel, jmp, jmpc, jmpn, jmpz, call, returnJmp, repeat, + setA, setB, setC, setCTX, setD, setE, + setGAS, setHASHPOS, setPC, setRCX, setRR, setSP, setSR]); + + + multiset_assumes(ROM_ID, 1, [...CONST, inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, + inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR, inRCX, ind, indRR, + inCntArith, inCntBinary, inCntKeccakF, inCntSha256F, + inCntMemAlign, inCntPaddingPG, inCntPoseidonG, + romFlags, offset, incStack, binOp, arithOp, hashBytes, + jmpAddr, elseAddr, zkPC]); + + // multiset_proves(ROM_ID, 1, [...CONST, IN_A, IN_B, IN_C, IN_ROTL_C, IN_D, IN_E, IN_SR, IN_FREE, IN_FREE0, + // IN_CTX, IN_SP, IN_PC, IN_GAS, IN_HASHPOS, IN_STEP, IN_RR, IN_RCX, IND, IND_RR, + // IN_CNT_ARITH, IN_CNT_BINARY, IN_CNT_KECCAK_F, IN_CNT_SHA_256_F, + // IN_CNT_MEM_ALIGN, IN_CNT_PADDING_PG, IN_CNT_POSEIDON_G, + // ROM_FLAGS, OFFSET, INC_STACK, BIN_OP, ARITH_OP, HASH_BYTES, + // JMP_ADDR, ELSE_ADDR, LINE]); + + col witness sKeyI[4]; + col witness sKey[4]; + + // Aritmethic State Machine + + expr arithC[NR], arithD[NR], arithE[NR]; + expr paramA[NR], paramB[NR], paramOp[NR]; + for (int i = 0; i < NR; ++i) { + arithC[i] = arithUseCD * (C[i] - A[i]) + A[i]; + arithD[i] = arithUseCD * (C[i] - B[i]) + B[i]; + arithE[i] = arithUseE * E[i]; + paramOp[i] = useOpAsParam * (assumeInput[i] - A[i]) + A[i]; + paramConst[i] = useConstAsParam * (CONST[i] - B[i]) + B[i]; + // if useOpAsParam, res must be zero => managed in SM too (as other flag) + paramRes[i] = (1 - useOpAsParam) * op[i]; + } // We group arithmetic operations by the number of inputs they have // 1] 5 inputs (A * B + C = D * 2^256 + E) - arithEq0 { 1, 0, 0, 0, 0, 0, 0, - A0, A1, A2, A3, A4, A5, A6, A7, - B0, B1, B2, B3, B4, B5, B6, B7, - C0, C1, C2, C3, C4, C5, C6, C7, - D0, D1, D2, D3, D4, D5, D6, D7, - op0, op1, op2, op3, op4, op5, op6, op7 } is - Arith.resultEq0 { - Arith.selEq[0], Arith.selEq[1], Arith.selEq[2], Arith.selEq[3], Arith.selEq[4], Arith.selEq[5], Arith.selEq[6], - ax1_0, ax1_1, ax1_2, ax1_3, ax1_4, ax1_5, ax1_6, ax1_7, - ay1_0, ay1_1, ay1_2, ay1_3, ay1_4, ay1_5, ay1_6, ay1_7, - ax2_0, ax2_1, ax2_2, ax2_3, ax2_4, ax2_5, ax2_6, ax2_7, - ay2_0, ay2_1, ay2_2, ay2_3, ay2_4, ay2_5, ay2_6, ay2_7, - ay3_0, ay3_1, ay3_2, ay3_3, ay3_4, ay3_5, ay3_6, ay3_7 - }; - - // 2] 6 inputs (Point addition, complex multiplication, complex addition, complex subtraction) - arithEq1 + arithEq3 + arithEq4 + arithEq5 { - 0, arithEq1, 0, arithEq1, arithEq3, arithEq4, arithEq5, - A0, A1, A2, A3, A4, A5, A6, A7, - B0, B1, B2, B3, B4, B5, B6, B7, - C0, C1, C2, C3, C4, C5, C6, C7, - D0, D1, D2, D3, D4, D5, D6, D7, - E0, E1, E2, E3, E4, E5, E6, E7, - op0, op1, op2, op3, op4, op5, op6, op7 } is - Arith.resultEq1 { - Arith.selEq[0], Arith.selEq[1], Arith.selEq[2], Arith.selEq[3], Arith.selEq[4], Arith.selEq[5], Arith.selEq[6], - ax1_0, ax1_1, ax1_2, ax1_3, ax1_4, ax1_5, ax1_6, ax1_7, - ay1_0, ay1_1, ay1_2, ay1_3, ay1_4, ay1_5, ay1_6, ay1_7, - ax2_0, ax2_1, ax2_2, ax2_3, ax2_4, ax2_5, ax2_6, ax2_7, - ay2_0, ay2_1, ay2_2, ay2_3, ay2_4, ay2_5, ay2_6, ay2_7, - ax3_0, ax3_1, ax3_2, ax3_3, ax3_4, ax3_5, ax3_6, ax3_7, - ay3_0, ay3_1, ay3_2, ay3_3, ay3_4, ay3_5, ay3_6, ay3_7 - }; - - // 3] 4 inputs (Point doubling) - arithEq2 { 0, 0, 1, 1, 0, 0, 0, - A0, A1, A2, A3, A4, A5, A6, A7, - B0, B1, B2, B3, B4, B5, B6, B7, - A0, A1, A2, A3, A4, A5, A6, A7, - B0, B1, B2, B3, B4, B5, B6, B7, - E0, E1, E2, E3, E4, E5, E6, E7, - op0, op1, op2, op3, op4, op5, op6, op7 } is - Arith.resultEq2 { - Arith.selEq[0], Arith.selEq[1], Arith.selEq[2], Arith.selEq[3], Arith.selEq[4], Arith.selEq[5], Arith.selEq[6], - ax1_0, ax1_1, ax1_2, ax1_3, ax1_4, ax1_5, ax1_6, ax1_7, - ay1_0, ay1_1, ay1_2, ay1_3, ay1_4, ay1_5, ay1_6, ay1_7, - ax2_0, ax2_1, ax2_2, ax2_3, ax2_4, ax2_5, ax2_6, ax2_7, - ay2_0, ay2_1, ay2_2, ay2_3, ay2_4, ay2_5, ay2_6, ay2_7, - ax3_0, ax3_1, ax3_2, ax3_3, ax3_4, ax3_5, ax3_6, ax3_7, - ay3_0, ay3_1, ay3_2, ay3_3, ay3_4, ay3_5, ay3_6, ay3_7 - }; - - cntArith' = cntArith*(1-Global.L1) + arithEq0 + arithEq1 + arithEq2 + arithEq3 + arithEq4 + arithEq5; - -///////// -// Binary Plookpups -///////// - - bin { - binOpcode, - A0, A1, A2, A3, A4, A5, A6, A7, - B0, B1, B2, B3, B4, B5, B6, B7, - op0, op1, op2, op3, op4, op5, op6, op7, - carry - } is - Binary.resultBinOp { - Binary.lOpcode, - Binary.a[0], Binary.a[1], Binary.a[2], Binary.a[3], Binary.a[4], Binary.a[5], Binary.a[6], Binary.a[7], - Binary.b[0], Binary.b[1], Binary.b[2], Binary.b[3], Binary.b[4], Binary.b[5], Binary.b[6], Binary.b[7], - Binary.c[0], Binary.c[1], Binary.c[2], Binary.c[3], Binary.c[4], Binary.c[5], Binary.c[6], Binary.c[7], - Binary.lCout - }; - - cntBinary' = cntBinary*(1-Global.L1) + bin + sWR + hashPDigest; - -///////// -// HASHK Plookpups -///////// - hashK + hashK1 { - addr, - HASHPOS, - D0 * hashK + hashK1, - op0, op1, op2, op3, - op4, op5, op6, op7 - } in - PaddingKK.crLatch * PaddingKK.r8valid { - PaddingKK.addr, - PaddingKK.len - PaddingKK.rem - PaddingKK.crLen + 1, - PaddingKK.crLen, - PaddingKK.crV0C, PaddingKK.crV1C, PaddingKK.crV2C, PaddingKK.crV3C, - PaddingKK.crV4C, PaddingKK.crV5C, PaddingKK.crV6C, PaddingKK.crV7C - }; - - hashKLen { - addr, - op0 - } is - PaddingKK.lastHashLen { - PaddingKK.addr, - PaddingKK.len - }; - - hashKDigest { - addr, - op0, op1, op2, op3, - op4, op5, op6, op7, - incCounter - } is - PaddingKK.lastHashDigest { - PaddingKK.addr, - PaddingKK.hash0, PaddingKK.hash1, PaddingKK.hash2, PaddingKK.hash3, - PaddingKK.hash4, PaddingKK.hash5, PaddingKK.hash6, PaddingKK.hash7, - PaddingKK.incCounter - }; - - cntKeccakF' = cntKeccakF*(1-Global.L1) + incCounter*hashKDigest; - -///////// -// HASHS Plookpups (Sha256) -///////// - - hashS + hashS1 { - addr, - HASHPOS, - D0 * hashS + hashS1, - op0, op1, op2, op3, - op4, op5, op6, op7 - } in - PaddingSha256.crLatch * PaddingSha256.r8valid { - PaddingSha256.addr, - PaddingSha256.len - PaddingSha256.rem - PaddingSha256.crLen + 1, - PaddingSha256.crLen, - PaddingSha256.crV0C, PaddingSha256.crV1C, PaddingSha256.crV2C, PaddingSha256.crV3C, - PaddingSha256.crV4C, PaddingSha256.crV5C, PaddingSha256.crV6C, PaddingSha256.crV7C - }; - - hashSLen { - addr, - op0 - } is - PaddingSha256.lastHashLen { - PaddingSha256.addr, - PaddingSha256.len - }; - - // The Sha digest's chunks are ordered from most to least significant. - // (hash0 => op7, hash1 => op6, ..) - hashSDigest { - addr, - op0, op1, op2, op3, - op4, op5, op6, op7, - incCounter - } is - PaddingSha256.lastHashDigest { - PaddingSha256.addr, - PaddingSha256.hash7, PaddingSha256.hash6, PaddingSha256.hash5, PaddingSha256.hash4, - PaddingSha256.hash3, PaddingSha256.hash2, PaddingSha256.hash1, PaddingSha256.hash0, - PaddingSha256.incCounter - }; - - cntSha256F' = cntSha256F*(1-Global.L1) + incCounter*hashSDigest; - -///////// -// HASHP Plookpups -///////// - hashP + hashP1 { - addr, - HASHPOS, - D0 * hashP + hashP1, - op0, op1, op2, op3, - op4, op5, op6, op7 - } in - PaddingPG.crLatch * PaddingPG.crValid { - PaddingPG.addr, - PaddingPG.len - PaddingPG.rem - PaddingPG.crLen + 1, - PaddingPG.crLen, - PaddingPG.crV0C, PaddingPG.crV1C, PaddingPG.crV2C, PaddingPG.crV3C, - PaddingPG.crV4C, PaddingPG.crV5C, PaddingPG.crV6C, PaddingPG.crV7C - }; - - hashPLen { - addr, - op0 - } is - PaddingPG.lastHashLen { - PaddingPG.addr, - PaddingPG.len - }; - - hashPDigest { - addr, - op0 + 2**32 * op1, - op2 + 2**32 * op3, - op4 + 2**32 * op5, - op6 + 2**32 * op7, - incCounter - } is - PaddingPG.lastHashDigest { - PaddingPG.addr, - PaddingPG.curHash0, - PaddingPG.curHash1, - PaddingPG.curHash2, - PaddingPG.curHash3, - PaddingPG.incCounter - }; - - cntPaddingPG' = cntPaddingPG*(1-Global.L1) + hashPDigest*incCounter; - cntPoseidonG' = cntPoseidonG*(1-Global.L1) + (hashPDigest + sRD + sWR) * incCounter; - -///////// -// Mem Plookpups -///////// - mOp { - addr, - Global.STEP, - mWR, - op0, op1, op2, op3, - op4, op5, op6, op7 - } is - Mem.mOp { - Mem.addr, - Mem.step, - Mem.mWr, - Mem.val[0], Mem.val[1], Mem.val[2], Mem.val[3], - Mem.val[4], Mem.val[5], Mem.val[6], Mem.val[7] - }; - - -///////// -// Storage Plookpups -///////// - - (sRD + sWR) { - 1, 0, 0, // Poseidon Result ID - C0, C1, C2, C3, C4, C5, C6, C7, - 0, 0, 0, 0, - sKeyI[0], sKeyI[1], sKeyI[2], sKeyI[3] - } is - PoseidonG.result1 { - PoseidonG.result1, PoseidonG.result2, PoseidonG.result3, - PoseidonG.in0, - PoseidonG.in1, - PoseidonG.in2, - PoseidonG.in3, - PoseidonG.in4, - PoseidonG.in5, - PoseidonG.in6, - PoseidonG.in7, - PoseidonG.hashType, - PoseidonG.cap1, - PoseidonG.cap2, - PoseidonG.cap3, - PoseidonG.hash0, - PoseidonG.hash1, - PoseidonG.hash2, - PoseidonG.hash3 - }; - - (sRD + sWR) { - 0, 1, 0, - A0, A1, A2, A3, A4, 0, B0, B1, - sKeyI[0], sKeyI[1], sKeyI[2], sKeyI[3], - sKey[0], sKey[1], sKey[2], sKey[3], - A5, A6, A7, B2, B3, B4, B5, B6, B7 } is - PoseidonG.result2 { - PoseidonG.result1, PoseidonG.result2, PoseidonG.result3, - PoseidonG.in0, - PoseidonG.in1, - PoseidonG.in2, - PoseidonG.in3, - PoseidonG.in4, - PoseidonG.in5, - PoseidonG.in6, - PoseidonG.in7, - PoseidonG.hashType, - PoseidonG.cap1, - PoseidonG.cap2, - PoseidonG.cap3, - PoseidonG.hash0, - PoseidonG.hash1, - PoseidonG.hash2, - PoseidonG.hash3, - 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - - sRD { - SR0 + 2**32*SR1, SR2 + 2**32*SR3, SR4 + 2**32*SR5, SR6 + 2**32*SR7, - sKey[0], sKey[1], sKey[2], sKey[3], - op0, op1, op2, op3, - op4, op5, op6, op7, - incCounter - } is - Storage.latchGet { - Storage.oldRoot0, Storage.oldRoot1, Storage.oldRoot2, Storage.oldRoot3, - Storage.rkey0, Storage.rkey1, Storage.rkey2, Storage.rkey3, - Storage.valueLow0, Storage.valueLow1, Storage.valueLow2, Storage.valueLow3, - Storage.valueHigh0, Storage.valueHigh1, Storage.valueHigh2, Storage.valueHigh3, - Storage.incCounter + 2 - }; - - - sWR { - SR0 + 2**32*SR1, SR2 + 2**32*SR3, SR4 + 2**32*SR5, SR6 + 2**32*SR7, - sKey[0], sKey[1], sKey[2], sKey[3], - D0, D1, D2, D3, - D4, D5, D6, D7, - op0 + 2**32*op1, op2 + 2**32*op3, op4 + 2**32*op5, op6 + 2**32*op7, - incCounter - } is - Storage.latchSet { - Storage.oldRoot0, Storage.oldRoot1, Storage.oldRoot2, Storage.oldRoot3, - Storage.rkey0, Storage.rkey1, Storage.rkey2, Storage.rkey3, - Storage.valueLow0, Storage.valueLow1, Storage.valueLow2, Storage.valueLow3, - Storage.valueHigh0, Storage.valueHigh1, Storage.valueHigh2, Storage.valueHigh3, - Storage.newRoot0, Storage.newRoot1, Storage.newRoot2, Storage.newRoot3, - Storage.incCounter + 2 - }; - - -///////// -// MemAlign Plookpups -///////// - // memAlign RD - memAlignRD { - 0, 0, - A0, A1, A2, A3, - A4, A5, A6, A7, - B0, B1, B2, B3, - B4, B5, B6, B7, - op0, op1, op2, op3, - op4, op5, op6, op7, - C0 - } is - MemAlign.resultRd { - MemAlign.wr256, - MemAlign.wr8, - MemAlign.m0[0], MemAlign.m0[1], MemAlign.m0[2], MemAlign.m0[3], - MemAlign.m0[4], MemAlign.m0[5], MemAlign.m0[6], MemAlign.m0[7], - MemAlign.m1[0], MemAlign.m1[1], MemAlign.m1[2], MemAlign.m1[3], - MemAlign.m1[4], MemAlign.m1[5], MemAlign.m1[6], MemAlign.m1[7], - MemAlign.v[0], MemAlign.v[1], MemAlign.v[2], MemAlign.v[3], - MemAlign.v[4], MemAlign.v[5], MemAlign.v[6], MemAlign.v[7], - MemAlign.offset - }; - - memAlignWR { - 1, 0, - A0, A1, A2, A3, - A4, A5, A6, A7, - B0, B1, B2, B3, - B4, B5, B6, B7, - op0, op1, op2, op3, - op4, op5, op6, op7, - C0, - D0, D1, D2, D3, - D4, D5, D6, D7, - E0, E1, E2, E3, - E4, E5, E6, E7 - } is - MemAlign.resultWr256 { - MemAlign.wr256, - MemAlign.wr8, - MemAlign.m0[0], MemAlign.m0[1], MemAlign.m0[2], MemAlign.m0[3], - MemAlign.m0[4], MemAlign.m0[5], MemAlign.m0[6], MemAlign.m0[7], - MemAlign.m1[0], MemAlign.m1[1], MemAlign.m1[2], MemAlign.m1[3], - MemAlign.m1[4], MemAlign.m1[5], MemAlign.m1[6], MemAlign.m1[7], - MemAlign.v[0], MemAlign.v[1], MemAlign.v[2], MemAlign.v[3], - MemAlign.v[4], MemAlign.v[5], MemAlign.v[6], MemAlign.v[7], - MemAlign.offset, - MemAlign.w0[0], MemAlign.w0[1], MemAlign.w0[2], MemAlign.w0[3], - MemAlign.w0[4], MemAlign.w0[5], MemAlign.w0[6], MemAlign.w0[7], - MemAlign.w1[0], MemAlign.w1[1], MemAlign.w1[2], MemAlign.w1[3], - MemAlign.w1[4], MemAlign.w1[5], MemAlign.w1[6], MemAlign.w1[7] - }; - - memAlignWR8 { - 0, 1, - A0, A1, A2, A3, - A4, A5, A6, A7, - op0, op1, op2, op3, - op4, op5, op6, op7, - C0, - D0, D1, D2, D3, - D4, D5, D6, D7 - } is - MemAlign.resultWr8 { - MemAlign.wr256, - MemAlign.wr8, - MemAlign.m0[0], MemAlign.m0[1], MemAlign.m0[2], MemAlign.m0[3], - MemAlign.m0[4], MemAlign.m0[5], MemAlign.m0[6], MemAlign.m0[7], - MemAlign.v[0], MemAlign.v[1], MemAlign.v[2], MemAlign.v[3], - MemAlign.v[4], MemAlign.v[5], MemAlign.v[6], MemAlign.v[7], - MemAlign.offset, - MemAlign.w0[0], MemAlign.w0[1], MemAlign.w0[2], MemAlign.w0[3], - MemAlign.w0[4], MemAlign.w0[5], MemAlign.w0[6], MemAlign.w0[7] - }; - - cntMemAlign' = cntMemAlign*(1-Global.L1) + memAlignRD + memAlignWR + memAlignWR8; + multiset_assume(ARITH_ID, arith, [arithOp, ...A, ...B, ...arithC, ...arithD, ...arithE, ...assumeInput]); + cntArith' === cntArith * (1 - L1) + arith; + + multiset_assume(BINARY_ID, bin, [binOp, ...paramA, ...paramB, ...paramOp, binCarryIn, carry]); + cntBinary' = cntBinary * (1 - L1) + bin + sWR + hashPDigest; + + // OPTIMIZATION2EVAL: HASHPOSDIGEST = HASHPOS :HASHLEN + $ :HASHDIGEST + // optimization reuse CONST as hashBytes or use CONST_LITE to general purpose + lookup_assume(PADDING_KK_HASH_ID, hashK, [addr, HASHPOS, useHashBytes * (hashBytes - D[0]) + D[0], ...assumeInput]); + // PaddingKK: crLatch * PaddingKK.r8valid { addr, len - rem - crLen + 1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C } + + multiset_assume(PADDING_KK_LEN_DIGEST_ID, hashKLen + hashKDigest, [hashKLen, addr, ...assumeInput, hashKDigest * incCounter]); + // TODO: check if could be in same, perhaps len and Digest is in same "clock" of keccak + // TODO: if use 2 multisets, better use a lookup without selector + // REVIEW: + // PaddingKK: lastHashLen { addr, len } + // PaddingKK: lastHashDigest { addr, hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, incCounter } + + cntKeccakF' = cntKeccakF * (1 - L1) + incCounter * hashKDigest; + + // SHA256 lookups and permutation check + + lookup_assumes(PADDING_SHA256_HASH_ID, hashS, [addr, HASHPOS, useHashBytes * (hashBytes - D[0]) + D[0], ...op]); + // PaddingKK: crLatch * PaddingKK.r8valid { addr, len - rem - crLen + 1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C } + + multiset_assumes(PADDING_SHA256_LEN_DIGEST_ID, hashSLen + hashSDigest, [hashSLen, addr, ...op, hashSDigest * incCounter]); + // TODO: check if could be in same, perhaps len and Digest is in same "clock" of keccak + // PaddingKK: lastHashLen { addr, len } + // PaddingKK: lastHashDigest { addr, hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, incCounter } + + + // TODO: modify sha to be aligned with rest of hash, because currently the Sha digest's chunks are ordered + // from most to least significant. (hash0 => op7, hash1 => op6, ..) + + cntSha256F' = cntSha256F * (1 - L1) + incCounter * hashSDigest; + + // HASHP Plookpups + lookup_assumes(PADDING_PG_HASH_ID, hashS, [addr, HASHPOS, useHashBytes * (hashBytes - D[0]) + D[0], ...op]); + // lookup_proves(PADDING_PG_HASH_ID, crLatch * r8valid [addr, len - rem - crLen + 1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C]); + + assumeInput[1] * (hashSLen + hashKLen + hashPLen) === 0; + assumeInput[2] * (hashSLen + hashKLen + hashPLen) === 0; + assumeInput[3] * (hashSLen + hashKLen + hashPLen) === 0; + assumeInput[4] * (hashSLen + hashKLen + hashPLen) === 0; + assumeInput[5] * (hashSLen + hashKLen + hashPLen) === 0; + assumeInput[6] * (hashSLen + hashKLen + hashPLen) === 0; + assumeInput[7] * (hashSLen + hashKLen + hashPLen) === 0; + + multiset_assumes(PADDING_PG_LEN_ID, hashSLen, [addr, assumeInput[0], hashSDigest * incCounter]); + multiset_assumes(PADDING_PG_DIGEST_ID, hashSLen + hashSDigest, [hashSLen, addr, + assumeInput[0] + 2**32 * assumeInput[1], + assumeInput[2] + 2**32 * assumeInput[3], + assumeInput[4] + 2**32 * assumeInput[5], + assumeInput[6] + 2**32 * assumeInput[7], + hashSDigest * incCounter]); + // multiset_proves(PADDING_PG_LEN, lastHashLen, [addr, len]); + // multiset_proves(PADDING_PG_LEN_DIGEST_ID, lastHashDigest, [addr, ...curHash, incCounter]) + + cntPaddingPG' = cntPaddingPG * (1 - L1) + hashPDigest * incCounter; + + // TODO: modify executor + cntPoseidonG' = cntPoseidonG * (1 - L1) + (hashPDigest + sRD + sWR) * incCounter + 2 * (sRD + sWR); + + // Memory + multiset_assumes(MEMORY_ID, mOp, [addr, STEP, mWR, ...assumeInput]); + // multiset_proves(MEMORY_ID, mOp, [addr, step, mWr, ...val]); + + // Storage + + multiset_assumes(POSEIDON_G_ID, sRD + sWR, [...C, 0, 0, 0, 0, ...sKeyI]); + // multiset_proves(POSEIDON_G_ID, ,[..._in, hashType, ...cap, ...hash]); + + A[5] * (sRD + sWR) === 0; + A[6] * (sRD + sWR) === 0; + A[7] * (sRD + sWR) === 0; + A[8] * (sRD + sWR) === 0; + B[3] * (sRD + sWR) === 0; + B[4] * (sRD + sWR) === 0; + B[5] * (sRD + sWR) === 0; + B[6] * (sRD + sWR) === 0; + B[7] * (sRD + sWR) === 0; + B[8] * (sRD + sWR) === 0; + multiset_assume(POSEIDON_G_ID, sRD + sWR, [...A[0:4], 0, ...B[0:2], ...sKeyI, sKey]); + // [...in, hashType, ...cap, ...hash] + + multiset_assume(STORAGE_ID, sRD, [SR[0] + 2**32*SR[1], SR[2] + 2**32*SR[3], SR[4] + 2**32*SR[5], SR[6] + 2**32*SR[7], + ...sKey, ...assumeInput, incCounter]); + // STORAGE_ID,latchGet,[...oldRoot, ...rkey, ...valueLow, ...valueHigh, incCounter] + + multiset_assume(STORAGE_ID, sWR, [SR[0] + 2**32*SR[1], SR[2] + 2**32*SR[3], SR[4] + 2**32*SR[5], SR[6] + 2**32*SR[7], + ...sKey, ...D, + op[0] + 2**32*op[1], op[2] + 2**32*op[3], op[4] + 2**32*op[5], op[6] + 2**32*op[7], + incCounter]); + // STORAGE_ID,latchSet,[...oldRoot, ...rkey, ...valueLow, ...valueHigh, ...newRoot, incCounter] + + // MemAlign + // memAlign RD + multiset_assume(MEM_ALIGN_ID, memAlignRD, [0, C0, ...A, ...B, ...assumeInput]); + multiset_assume(MEM_ALIGN_ID, memAlignWR, [1, C0, ...A, ...B, ...assumeInput, ...D, ...E]); + + cntMemAlign' = cntMemAlign * (1 - L1) + memAlignRD + memAlignWR; +} + +function compact_bin_cols(expr cols[]) { + int factor = 1; + expr res = 0; + if (length(cols) > 63) { + // TODO: ERROR + } + // TODO: REPEATED + for (int i = 0; i < length(cols); ++i) { + res = res + factor * cols[i]; + cols[i] * (1 - cols[i]) === 0; + factor = factor * 2; + } + return res; +} diff --git a/test/pil2/zkevm-etrog/mem_align.pil b/test/pil2/zkevm-etrog/mem_align.pil index eadde2b..4741f99 100644 --- a/test/pil2/zkevm-etrog/mem_align.pil +++ b/test/pil2/zkevm-etrog/mem_align.pil @@ -19,7 +19,8 @@ namespace MemAlign:: { col witness inM[2]; // 32 bytes of V - col witness inV; + col witness inValueShifted; + col witness inValueSorted; // write 32 bytes (256 bits) col witness wr256; @@ -78,10 +79,10 @@ namespace MemAlign:: { col RESET = Global.CLK32[0]; // RangeCheck Latch Clock - // factorV Plookup (FACTORV) no yes - // wr256 Plookup (WR256) yes no - // wr8 Plookup (WR8) yes no - // offset Plookup (OFFSET) yes no + // factorV Lookup (FACTORV) no yes + // wr256 Lookup (WR256) yes no + // wr8 Lookup (WR8) yes no + // offset Lookup (OFFSET) yes no // inV RangeCheck (BYTE_C4096) no yes // inM[0..1] RangeCheck (BYTE2A,BYTE2) no yes // m0[0..7] Built no yes diff --git a/test/pil2/zkevm-etrog/padding_pg.pil b/test/pil2/zkevm-etrog/padding_pg.pil index cd29673..d6d860a 100644 --- a/test/pil2/zkevm-etrog/padding_pg.pil +++ b/test/pil2/zkevm-etrog/padding_pg.pil @@ -1,171 +1,102 @@ -include "global.pil"; +// include "global.pil"; include "poseidong.pil"; -namespace PaddingPG(%N); +subproof PaddingPG(2**23) { + + const int BYTES_BLOCK = 56; + const int BLOCKS = N \\ BYTES_BLOCK; + + col fixed F[8]; + col fixed OFFSET = [0..32]...; + col fixed LAST_BLOCK = [[0:55, 1]:BLOCKS,0...,1]; // blocks of 56 steps, 0 in the first 55 steps and 1 in the last step of the block. + // Also the last global step was 1 to close the global cycle (allowing addr change from step N-1 to 0) + col fixed CR_VALID = [1:56*BLOCKS,0...]; // 1 for valid/complete 56 steps blocks, 0 for last smaller/incomplete block // Polynomials that are used to compute a hash chunk - pol commit acc[8]; - pol commit freeIn; - pol commit addr; - - freeIn in Global.BYTE; - - pol constant F[8]; - pol constant lastBlock; // [0:55 1] + [0:N-1 1] blocks of 56 steps, 0 in the first 55 steps and 1 in the last step of the block. - // Also the last global step was 1 to close the global cycle (allowing addr change from step N-1 to 0) - pol constant crValid; // 1 for valid/complete 56 steps blocks, 0 for last smaller/incomplete block - - // rem: It can be different only the first byte of a new Hash. - pol commit rem; - - rem' * (1-lastHash) = (rem-1)*(1-lastHash); - - pol commit remInv; - pol remIsZero = 1 - rem*remInv; - remIsZero*rem = 0; - - - pol commit spare; - pol lastHash = lastBlock*(spare + remIsZero); - spare' = (spare + remIsZero)*(1-lastHash); - spare * (1 - spare) = 0; - - pol commit lastHashLen; - pol commit lastHashDigest; - - lastHashLen * (1 - lastHashLen) = 0; - lastHashDigest * (1 - lastHashDigest) = 0; - - lastHashLen * (1 - lastHash) = 0; - lastHashDigest * (1 - lastHash) = 0; - - pol aFreeIn = (1 - (remIsZero + spare))*freeIn + remIsZero + lastHash*0x80; - - pol acc0C = acc[0] + F[0] * aFreeIn; - pol acc1C = acc[1] + F[1] * aFreeIn; - pol acc2C = acc[2] + F[2] * aFreeIn; - pol acc3C = acc[3] + F[3] * aFreeIn; - pol acc4C = acc[4] + F[4] * aFreeIn; - pol acc5C = acc[5] + F[5] * aFreeIn; - pol acc6C = acc[6] + F[6] * aFreeIn; - pol acc7C = acc[7] + F[7] * aFreeIn; - - acc[0]' = acc0C*(1-lastBlock); - acc[1]' = acc1C*(1-lastBlock); - acc[2]' = acc2C*(1-lastBlock); - acc[3]' = acc3C*(1-lastBlock); - acc[4]' = acc4C*(1-lastBlock); - acc[5]' = acc5C*(1-lastBlock); - acc[6]' = acc6C*(1-lastBlock); - acc[7]' = acc7C*(1-lastBlock); - - lastBlock { - acc0C, - acc1C, - acc2C, - acc3C, - acc4C, - acc5C, - acc6C, - acc7C, - prevHash0, - prevHash1, - prevHash2, - prevHash3, - curHash0, - curHash1, - curHash2, - curHash3 - } in PoseidonG.LATCH { - PoseidonG.in0, - PoseidonG.in1, - PoseidonG.in2, - PoseidonG.in3, - PoseidonG.in4, - PoseidonG.in5, - PoseidonG.in6, - PoseidonG.in7, - PoseidonG.hashType, - PoseidonG.cap1, - PoseidonG.cap2, - PoseidonG.cap3, - PoseidonG.hash0, - PoseidonG.hash1, - PoseidonG.hash2, - PoseidonG.hash3 - }; - - pol commit curHash0, curHash1, curHash2, curHash3; - curHash0' * (1-lastBlock) = curHash0*(1-lastBlock); - curHash1' * (1-lastBlock) = curHash1*(1-lastBlock); - curHash2' * (1-lastBlock) = curHash2*(1-lastBlock); - curHash3' * (1-lastBlock) = curHash3*(1-lastBlock); - - pol commit prevHash0, prevHash1, prevHash2, prevHash3; - prevHash0' = lastBlock*(curHash0 - prevHash0) + prevHash0 - lastHash*curHash0; - prevHash1' = lastBlock*(curHash1 - prevHash1) + prevHash1 - lastHash*curHash1; - prevHash2' = lastBlock*(curHash2 - prevHash2) + prevHash2 - lastHash*curHash2; - prevHash3' = lastBlock*(curHash3 - prevHash3) + prevHash3 - lastHash*curHash3; - - pol commit incCounter; - // if lastHash=0 && lastBLock=0 then incCounter'=incCounter - // if lastHash=0 && lastBLock=1 then incCounter'=incCounter+1 - // if lastHash=1 && lastBlock=1 then incCounter'=1 - incCounter' = incCounter*(1-lastBlock) + (incCounter +1)*(lastBlock-lastHash) + lastHash; - (incCounter - 1) * Global.L1 = 0; + col witness acc[8]; + col witness freeIn; + col witness addr; + col witness rem; // rem: It can be different only the first byte of a new Hash. - pol commit len; - len' * lastHash = rem' * lastHash; - len'*(1-lastHash) = len*(1-lastHash); + range_check(freeIn, 0, 255); + rem' * (1-lastHash) === (rem-1)*(1-lastHash); - (addr' -addr) * (1-lastHash) = 0; + col witness remInv; + col remIsZero = 1 - rem*remInv; + remIsZero * rem === 0; - pol doInc = lastHash * (1-Global.L1'); - (addr' - 1 -addr) * doInc = 0; + col witness spare; + col lastHash = lastBlock*(spare + remIsZero); + spare' === (spare + remIsZero)*(1-lastHash); + spare * (1 - spare) === 0; - // chunkReader generator + col witness lastHashLen; + col witness lastHashDigest; - pol commit crOffset; - pol commit crLen; + lastHashLen * (1 - lastHashLen) === 0; + lastHashDigest * (1 - lastHashDigest) === 0; - pol commit crOffsetInv; - pol crLatch = 1 - crOffset*crOffsetInv; - crOffset * crLatch = 0; + lastHashLen * (1 - lastHash) === 0; + lastHashDigest * (1 - lastHash) === 0; - crOffset'*(1-crLatch) = (crOffset - 1)*(1-crLatch); - crLen'*(1-crLatch) = crLen*(1-crLatch); - crLatch * crOffset' = crLatch * (crLen' -1); + col aFreeIn = (1 - (remIsZero + spare))*freeIn + remIsZero + lastHash*0x80; - pol commit crF0, crF1, crF2, crF3, crF4, crF5, crF6, crF7; + col accC[8]; + for (i = 0; i < 8; i += 1) { + accC[i] = acc[i] + F[i] * aFreeIn; + acc[i]' === accC[i] * (1 - LAST_BLOCK); + } - { crOffset, crF0, crF1, crF2, crF3, - crF4, crF5, crF6, crF7} in - { Global.STEP32, Global.BYTE_FACTOR[0], Global.BYTE_FACTOR[1], Global.BYTE_FACTOR[2], Global.BYTE_FACTOR[3], - Global.BYTE_FACTOR[4], Global.BYTE_FACTOR[5], Global.BYTE_FACTOR[6], Global.BYTE_FACTOR[7] }; + lookup_assume(POSEIDON_G_ID, lastBlock, [...accC, ...prevHash, ...curHash]); + col witness curHash[4]; + col witness prevHash[4]; - pol commit crV0, crV1, crV2, crV3, crV4, crV5, crV6, crV7; + for (i = 0; i < 4; i += 1) { + (1 - LAST_BLOCK) * (curHash[i]' - curHash[i]) === 0 + prevHash[i]' === LAST_BLOCK * (curHash[i] - prevHash[i]) + prevHash[i] - lastHash * curHash[i]; + } - pol crV0C = crV0 + crF0 * aFreeIn; - pol crV1C = crV1 + crF1 * aFreeIn; - pol crV2C = crV2 + crF2 * aFreeIn; - pol crV3C = crV3 + crF3 * aFreeIn; - pol crV4C = crV4 + crF4 * aFreeIn; - pol crV5C = crV5 + crF5 * aFreeIn; - pol crV6C = crV6 + crF6 * aFreeIn; - pol crV7C = crV7 + crF7 * aFreeIn; + col witness incCounter; + // if lastHash=0 && lastBLock=0 then incCounter'=incCounter + // if lastHash=0 && lastBLock=1 then incCounter'=incCounter+1 + // if lastHash=1 && lastBlock=1 then incCounter === + incCounter' === incCounter*(1-lastBlock) + (incCounter +1)*(lastBlock-lastHash) + lastHash; + + col witness len; + len' * lastHash === rem' * lastHash; + len'*(1-lastHash) === len*(1-lastHash); - crV0' = crV0C*(1-crLatch); - crV1' = crV1C*(1-crLatch); - crV2' = crV2C*(1-crLatch); - crV3' = crV3C*(1-crLatch); - crV4' = crV4C*(1-crLatch); - crV5' = crV5C*(1-crLatch); - crV6' = crV6C*(1-crLatch); - crV7' = crV7C*(1-crLatch); + (addr' -addr) * (1-lastHash) === 0; - (1-crLatch) * lastHash = 0; // Ensure when a hash ends it resets the address. + col doInc = lastHash * (1-Global.L1'); + (addr' - 1 -addr) * doInc === 0; + + // chunkReader generator + col witness crOffset; + col witness crLen; + + col witness crOffsetInv; + col crLatch = 1 - crOffset*crOffsetInv; + crOffset * crLatch === 0; + + crOffset'*(1-crLatch) === (crOffset - 1)*(1-crLatch); + crLen'*(1-crLatch) === crLen*(1-crLatch); + crLatch * crOffset' === crLatch * (crLen' -1); + + col witness crF[8]; + lookup_check([crOffset, ...crF], + [OFFSET, ...BYTE_FACTOR]); // ?¿?¿? BYTE_FACTOR[8] + + col crVC[8]; + col witness crV[8]; + for (i = 0; i < 8; ++i) { + crVC[i] = crV[i] + crF[i] * aFreeIn; + crV[i]' === crVC[i] * (1 - crLatch); + } + + (1-crLatch) * lastHash === 0; // Ensure when a hash ends it resets the address. /* Read Data output crLatch * crValid [hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, crOffset - crLen -1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C] @@ -175,7 +106,4 @@ namespace PaddingPG(%N); lastHash [hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, len] */ - - - - +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/range_32.pil b/test/pil2/zkevm-etrog/range_32.pil new file mode 100644 index 0000000..ddec318 --- /dev/null +++ b/test/pil2/zkevm-etrog/range_32.pil @@ -0,0 +1,9 @@ +subproof Range32(2**23) { + + col fixed CLK = [0,1]...; + col witness value; + col witness bits; + col witness result; + + result * (1 - result) === 0; +} diff --git a/test/pil2/zkevm-etrog/storage_rom.pil b/test/pil2/zkevm-etrog/storage_rom.pil index 7582c15..fc87249 100644 --- a/test/pil2/zkevm-etrog/storage_rom.pil +++ b/test/pil2/zkevm-etrog/storage_rom.pil @@ -1,4 +1,4 @@ -const int STORAGE_ROM_ID 10; +const int STORAGE_ROM_ID = 10; subproof StorageRom(2**16) { diff --git a/tools/sm/sm_climb_key/compact.js b/tools/sm/sm_climb_key/compact.js new file mode 100644 index 0000000..6b079a2 --- /dev/null +++ b/tools/sm/sm_climb_key/compact.js @@ -0,0 +1,70 @@ +#!/usr/bin/env node + +const path = require("path"); +const fs = require("fs"); +const tty = require('tty'); + +const argv = require("yargs") + .usage("table") + .alias("v", "verbose") + .alias("c", "clt") + .alias("m", "mask") + .argv; +function log2(value) { + let limit = 2n; + let bits = 1; + while (value >= limit) { + limit = limit * 2n; + ++bits; + } + return bits; +} + +async function run() { + let total = 0n; + let tlevel = 0n; + let loops = 0; + let _level = 255; + let level; + let bits = 26; + let mask = 2n ** BigInt(bits) - 1n; + for (let lchunk = 0; lchunk < 16; ++lchunk) { + ++loops; + level = (lchunk << 4); + let values = (2n**BigInt(255 - level) & mask)+1n; + tlevel = tlevel + values; + console.log(`${level} ${loops} ${tlevel.toString(16)} ${log2(tlevel)}`); + } + _level = level; + console.log([tlevel, log2(tlevel), loops]); + return; + total += tlevel; + loops = 0; + tlevel = 0n; + for (level = _level; level >= 207; --level) { + ++loops; + let values = 2n**BigInt((_level - level) >> 2); + tlevel = tlevel + values; + console.log(`${level} ${loops} ${tlevel.toString(16)} ${log2(tlevel)}`); + } + _level = level; + console.log([tlevel, log2(tlevel), loops]); + total += tlevel; + loops = 0; + tlevel = 0n; + for (level = _level; level >= 0; --level) { + ++loops; + let values = 2n**BigInt((_level - level) >> 2); + tlevel = tlevel + values; + console.log(`${level} ${loops} ${tlevel.toString(16)} ${log2(tlevel)}`); + } +} + + +run().then(()=> { + process.exitCode = 0; +}, (err) => { + console.log(err.stack); + console.log(err.message); + process.exitCode = 1; +}); diff --git a/tools/sm/sm_climb_key/table.js b/tools/sm/sm_climb_key/table.js new file mode 100644 index 0000000..62ec108 --- /dev/null +++ b/tools/sm/sm_climb_key/table.js @@ -0,0 +1,99 @@ +#!/usr/bin/env node + +const path = require("path"); +const fs = require("fs"); +const tty = require('tty'); +const assert = require('chai').assert; + +const argv = require("yargs") + .usage("table") + .alias("v", "verbose") + .alias("c", "clt") + .alias("m", "mask") + .argv; + +function log2(value) { + value = BigInt(value); + let limit = 2n; + let bits = 1; + while (value >= limit) { + limit = limit * 2n; + ++bits; + } + return bits; +} + +async function run() { + + const cins = [[0,1],[0,1,2,3],[0,1,2,3],[0,1,2,3]]; + const masks = [0x3FFFF, 0x1FFFF, 0x1FFFF, 0x00FFF]; + const gls = [0x00001, 0x1C000, 0x1FFFF, 0x00FFF]; + + assert(64 === masks.reduce((t, x) => t+log2(x), 0)); + assert(0xFFFFFFFF00000001n === gls.reduce((t, x, i) => t + (BigInt(x) << BigInt(masks.slice(0, i).reduce((bits, mask) => bits += log2(mask), 0))), 0n)); + + let ranges = []; + let clt = false; + let carry, lt; + + for (let index = 0; index < masks.length; ++index) { + const _gl = gls[index]; + const _glhex = _gl.toString(16).toUpperCase().padStart(5, '0'); + const _mask = masks[index]; + for (const cin of cins[index]) { + let tcount = 0; + const _lt = cin >= 2 ? 1:0; + const _carry = cin % 2 ? 1:0; + for (let value = 0; value <= (_mask+1); ++value) { + const value_ = value * 2 + _carry; + const vmask_ = value_ & _mask; + const carry_ = value_ > _mask ? 1:0; + const lt_ = (vmask_ < _gl || (vmask_ == _gl && _lt)) ? 1:0; + const clt_ = lt_ * 2 + carry_; + + if (clt === false) { + from = value; + clt = clt_; + carry = carry_; + lt = lt_; + } else if (clt !== clt_ || value > _mask) { + const to = value - 1; + const fromUp = from * 2 + _carry; + const toUp = to * 2 + _carry; + const count = to - from + 1; + tcount += count; + const ranges = [[from, to],[fromUp, toUp],[fromUp & _mask, toUp & _mask]].map( + ft => (ft[0].toString(16).toUpperCase().padStart(5, '0') + + (ft[0] == ft[1] ? '' : '..'+ft[1].toString(16).toUpperCase().padStart(5, '0'))).padEnd(12)); + console.log(`// ${index} │ ${cin} │ 0 │ ${ranges[0]} │ ${ranges[1]} │ ${carry} │ ${ranges[2]} │ ${lt} │ ${_glhex} │ ${clt} │ ${count.toString(10).padStart(6)} │ ${to == _mask ? tcount.toString(10).padStart(6):''}`); + from = value; + clt = (value > _mask) ? false : clt_; + carry = carry_; + lt = lt_; + } + } + clt = false; + console.log('// ┄┄┄┄│┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄│┄┄┄┄┄┄┄┄│┄┄┄┄┄┄┄┄'); + } + } +/* + console.log("Input Pol Commitmets: " + out.nCommitments); + console.log("Q Pol Commitmets: " + out.nQ); + console.log("Constant Pols: " + out.nConstants); + console.log("Im Pols: " + out.nIm); + console.log("plookupIdentities: " + out.plookupIdentities.length); + console.log("permutationIdentities: " + out.permutationIdentities.length); + console.log("connectionIdentities: " + out.connectionIdentities.length); + console.log("polIdentities: " + out.polIdentities.length); +*/ + // await fs.promises.writeFile(outputFile.trim(), JSON.stringify(out, null, 1) + "\n", "utf8"); +} + + +run().then(()=> { + process.exitCode = 0; +}, (err) => { + console.log(err.stack); + console.log(err.message); + process.exitCode = 1; +}); From f09d001e63296c0974f8af53dc7254b20396f917 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Fri, 2 Feb 2024 00:27:48 +0100 Subject: [PATCH 27/33] WIP --- build/pil_parser.js | 17 ++- src/assign.js | 5 + src/builtin/defined.js | 4 - src/builtin/error.js | 2 + src/builtin/length.js | 7 -- src/definition_items/expression_variable.js | 1 - src/expression.js | 58 ++++++++++- src/expression_factory.js | 13 ++- src/expression_items.js | 2 + src/expression_items/array_of.js | 62 +++++++++-- src/expression_items/expression_item.js | 8 ++ src/expression_items/expression_list.js | 33 ++++-- src/expression_items/function_call.js | 3 +- src/expression_items/int_value.js | 8 +- src/expression_items/range_index.js | 16 +++ src/expression_items/reference_item.js | 10 +- src/expression_operations_info.js | 6 +- src/expressions.js | 1 - src/function.js | 79 +++++++++++--- src/indexable.js | 6 +- src/multi_array.js | 23 +++- src/pil_parser.jison | 19 +++- src/processor.js | 2 +- src/reference.js | 28 ++++- src/references.js | 26 ++++- src/scope.js | 2 - src/types.js | 24 +++++ test/pil2/std2/std_mset_lookup_range.pil | 14 +-- test/pil2/zkevm-etrog/main.pil | 110 ++++++++++++-------- 29 files changed, 463 insertions(+), 126 deletions(-) create mode 100644 src/expression_items/range_index.js create mode 100644 src/types.js diff --git a/build/pil_parser.js b/build/pil_parser.js index b73294b..ef32a49 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -92,7 +92,7 @@ break; case 3: this.$ = [] break; -case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 29: case 31: case 55: case 56: case 66: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 109: case 110: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 122: case 132: case 133: case 134: case 135: case 137: case 138: case 140: case 143: case 164: case 170: case 171: case 172: case 195: case 245: case 259: case 310: case 341: +case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 29: case 31: case 55: case 56: case 66: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 109: case 110: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 122: case 132: case 133: case 134: case 135: case 137: case 138: case 140: case 143: case 164: case 170: case 171: case 172: case 195: case 245: case 259: case 310: case 341: case 344: this.$ = $$[$0] break; case 17: case 154: @@ -624,10 +624,10 @@ case 250: this.$ = ExpressionFactory.fromObject({ type: 'expression_list', values: [$$[$0]], __debug: 3 }); break; case 251: - this.$ = $$[$0-3]; this.$.values.push({ type: 'append', value: $$[$0] }) + this.$ = $$[$0-3]; this.$.values.push($$[$0].insert('spread')) break; case 253: - this.$ = { type: 'expression_list', values: [{ type: 'append', value: $$[$0]}] } + this.$ = { type: 'expression_list', values: [$$[$0].insert('spread')] } break; case 254: this.$ = { type: 'expression_list', values: [$$[$0]] } @@ -883,6 +883,15 @@ break; case 342: this.$ = { ...$$[$0], dim: 0 } break; +case 345: + this.$ = ExpressionFactory.fromObject({type: 'range_index', from: $$[$0-2], to: $$[$0]}); +break; +case 346: + this.$ = ExpressionFactory.fromObject({type: 'range_index', from: $$[$0-1]}); +break; +case 347: + this.$ = ExpressionFactory.fromObject({type: 'range_index', to: $$[$0]}); +break; case 348: this.$ = { dim: $$[$0-3].dim + 1, indexes: [...$$[$0-3].indexes, $$[$0-1]] } break; @@ -906,7 +915,7 @@ case 357: case 358: break; } }, -table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],21:[1,19],26:$V1,33:[1,21],56:22,57:$V2,58:$V3,63:$V4,64:[1,20],72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,126:31,139:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),o($V0,[2,18]),{28:[1,41],155:[1,40]},{30:[1,42]},{48:[1,43]},{33:[1,45],56:44,57:$Vh,58:$V3,64:[1,46]},{140:48,144:$Vi,145:$Vj},o($Vk,$Vl,{141:51,77:$Vm,78:$Vn,142:$Vo}),o($Vk,$Vl,{141:55,142:$Vo}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:56,154:57},{155:[1,63]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:64},{155:[1,66]},o($Vt,[2,173]),{26:$V1,57:$Vu,72:$V5,73:$V6,74:$V7,80:$Vb,126:67},{24:72,28:[1,69],33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},{57:[1,77]},{24:72,28:$Vz,33:$Vv,53:[1,80],64:$Vw,70:$Vx,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,53:[1,84],64:$Vw,70:$Vx,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,53:[1,87],64:$Vw,70:$Vx,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,53:[1,90],64:$Vw,70:$Vx,97:$Vy,127:88,128:89},{24:72,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{28:[1,93]},{30:[1,95],48:[1,94]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:96,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:$V81,57:$V91,59:163,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,181]},{56:182,57:$Vh,58:$V3},{56:183,57:$Vh,58:$V3},{28:[1,184]},o($Vn1,[2,217]),o($Vo1,[2,220]),o($Vo1,[2,221]),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:186,154:185},o($Vk,$Vl,{141:187,142:$Vo}),o($Vk,$Vl,{141:188,142:$Vo}),{48:[1,189]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:190},o([6,8,20,21,26,32,33,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,139],$Vp1,{150:192,53:$Vq1,129:[1,191]}),o($Vn1,[2,276],{66:$Vr1}),o($Vs1,[2,261]),o($Vs1,[2,262]),o($Vs1,[2,263]),{153:[1,195]},o($Vt1,[2,267]),{48:[1,196]},o($Vn1,[2,279],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1}),{48:[1,197]},o($Vt,[2,174]),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},o([6,8,20,21,26,32,33,53,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,129,139],$Vu1,{48:$Vv1,153:$Vw1}),o($Vt,[2,179],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,200]}),o($Vz1,$VA1,{130:201,53:$VB1}),{153:[1,203]},{153:[1,204]},{153:[1,205]},o($VC1,[2,355],{153:[1,206]}),{28:[1,207]},o($Vt,[2,175],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,208]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},o($VC1,$Vu1,{153:$Vw1}),o($Vt,[2,176],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,211]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},o($Vt,[2,177],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,213]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},o($Vt,[2,178],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,215]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{129:[1,217]},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:218,128:210},{48:[1,219]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:220,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:229,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,230]},{32:[2,39]},{11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:[2,29],33:$Vv,36:232,38:231,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,32:[2,31],37:233},o($VJ1,[2,35],{37:234,8:$VB}),o($VJ1,[2,38],{8:$VK1}),o($VL1,[2,108]),o($VL1,[2,109]),o($VL1,[2,110]),o($VL1,[2,111],{88:[1,236],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VL1,[2,113]),o($VL1,[2,114]),o($VL1,[2,115]),o($VL1,[2,116]),o($VL1,[2,117]),o($VL1,[2,118]),o($VL1,[2,119]),o($VL1,[2,120]),o($VL1,[2,121]),o($V72,[2,49]),{42:261,43:[1,262],44:[1,263],45:[1,264],48:[1,260]},{24:162,28:$Vz,30:[1,265],33:$Vv,48:$VJ,49:267,53:[1,266],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,55]),o($V72,[2,56]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:268,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,45]),o($VL1,[2,137]),o($VL1,[2,138]),o($VL1,[2,139]),o($VL1,[2,140]),o($VL1,[2,141]),o($VL1,[2,142]),o($Vk,$Vl,{141:51,71:270,48:$V82,53:$V92,77:$Vm,78:$Vn,142:$Vo}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:272,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:273,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:274,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o([8,32,88,109,110,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Va2,{132:277,123:$Vb2,125:$Vc2,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:282,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:287,143:$Vi2,180:$Vj2,182:$V71},o($Vo1,[2,317],{182:$Vk2}),o($Vo1,[2,318]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:289,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo1,[2,320]),o($Vo1,[2,321],{182:$Vl2}),o($Vo1,[2,322]),{63:[1,292],95:291},{28:[1,293]},{24:294,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{24:295,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy},{48:[1,296]},{48:[1,297]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:298,36:300,37:301,38:299,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{33:$Vm2,64:$Vn2,96:302,97:$Vo2},{48:[1,306]},{48:[1,307]},o($V72,[2,154]),o($V72,[2,155]),{129:[1,308]},o($VL1,[2,199],{140:136,92:138,181:140,93:155,24:162,124:223,49:309,28:$Vz,33:$Vv,48:$VJ,53:[1,310],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,$Vq2,{48:$Vr2,182:$Vs2}),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:313,97:$Vy},{24:72,28:$Vz,33:$Vv,48:$Vt2,53:[1,316],64:$Vw,70:$Vx,71:315,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,48:$Vu2,53:[1,319],64:$Vw,70:$Vx,71:318,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,48:$Vv2,53:[1,322],64:$Vw,70:$Vx,71:321,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,48:$Vw2,53:[1,325],64:$Vw,70:$Vx,71:324,97:$Vy,127:88,128:89},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:327,136:326,143:$Vi2,180:$Vj2,182:$V71},o($Vx2,[2,342],{183:328,53:[1,329]}),{50:[1,330]},{50:[2,66],66:[1,331]},{50:[2,68]},o($Vy2,[2,71]),{28:[1,332],70:[1,333]},o($Vz2,[2,76]),o($Vz2,[2,77]),o($Vz2,[2,78]),{72:[1,334],73:[1,335],74:[1,336],80:[1,337]},{77:[1,338],78:[1,339]},o($Vz2,[2,84]),o($Vz2,[2,85]),o($Vz2,[2,87]),o($Vz2,[2,88]),o($Vz2,[2,89]),o($Vz2,[2,90]),o($Vz2,[2,91]),o($Vz2,[2,92]),{50:$V81,57:$V91,59:340,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,341]},{48:[1,342]},{48:$Vv1},o($Vt,[2,268],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,343]}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:344},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:346,154:345},{143:[1,347]},o($Vn1,[2,274],{66:$Vr1}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:348,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt1,[2,260],{53:$VA2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:351,55:[1,350],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:352,152:65},{28:[1,353],145:[1,354]},{28:[1,355]},{28:[1,356]},{28:$VB2,145:$VC2,185:357},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,128:360},{24:162,28:$Vz,33:$Vv,48:$VJ,49:361,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vz1,[2,196],{53:[1,362]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:364,55:[1,363],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$VB2,145:$VC2,185:365},{28:$VB2,145:$VC2,185:366},{28:$VB2,145:$VC2,185:367},{28:$VB2,145:$VC2,185:368},{48:[2,59]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:369,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,370],66:$Vx1},o($VD2,$Vy1),{24:162,28:$Vz,33:$Vv,48:$VJ,49:371,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,372],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:373,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,374],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:375,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,376],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:377,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,378],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:379,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,380],66:$VE2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:382,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,254],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,$Va2,{123:$Vb2,125:$Vc2}),{48:$Vt2,53:$V92,71:315},{48:$Vu2,53:$V92,71:318},{48:$Vv2,53:$V92,71:321},{48:$V82,53:$V92,71:270},{48:$Vw2,53:$V92,71:324},{32:[1,383]},o($V0,[2,24]),{8:$VB,32:[2,30],37:384},o($VJ1,[2,32],{37:385,8:$VB}),o($VJ1,[2,37],{8:$VK1}),o($VJ1,[2,36],{8:$VK1}),o($V72,[2,44]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:386,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:387,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:388,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:389,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:390,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:391,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:392,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:393,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{57:$V91,62:394,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:396,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:397,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:398,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:399,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:400,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:401,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:402,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:403,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:404,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:405,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:406,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:407,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:408,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:409,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:410,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:411,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:412,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,46]),o($VG2,[2,47]),o($VG2,[2,48]),{28:$VH2,52:414},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:416,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:[1,421],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{32:[1,422]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:423,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,424],53:$VK2},{55:$VL2},o($Vo1,[2,302]),o($Vo1,[2,310]),o($Vo1,[2,311]),o($Vo1,[2,315]),o($Vo1,[2,316]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:427,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VM2,[2,202],{138:428,53:$VN2}),o($VM2,[2,203]),o($VM2,[2,204]),o($VM2,[2,205]),o($Vo1,[2,313]),o($Vp2,$Vq2,{182:$Vs2}),{182:$Vk2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:430,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$Vl2},o($Vo1,[2,314]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:431,97:$Vy},{50:[1,432],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:433,97:$Vy},{33:$Vm2,64:$Vn2,96:434,97:$Vo2},o([33,64,97],[2,132]),{53:$Vq1,129:[1,435],150:436},o($VL1,[2,20],{130:201,27:[1,437],30:[1,438],53:$VB1,129:$VA1}),o($VL1,[2,19]),{13:443,19:440,24:162,26:$V1,28:$Vz,33:$Vv,48:$Vh2,57:$Vu,64:$Vw,70:$Vx,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,80:$Vb,93:283,97:$Vy,99:441,107:439,124:442,126:31,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:444,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{110:[1,445]},{8:$VB,37:447,110:[1,446]},o([20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,25],{37:448,8:$VB}),o($V72,[2,27]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:449,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,133]),o($VG2,[2,134]),o($VG2,[2,135]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:450,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:451,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,53:[1,453],64:$Vw,70:$Vx,92:452,93:454,97:$Vy},o($VL1,[2,200],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:455,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,333],{48:[1,457],143:[1,456],180:[1,458]}),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,94:459,49:461,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,[2,337]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:462,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,463],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:464,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,465],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:466,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,467],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:468,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,469],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{55:[1,470],66:[1,471]},o($VD2,[2,208]),o($Vx2,[2,343],{53:[1,472]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,60:$VQ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:473},{30:[1,477],60:[1,476]},{57:$V91,67:[1,478],68:479,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},o($Vy2,[2,72],{71:480,53:$V92}),o($Vy2,[2,73],{71:481,53:$V92}),o($Vz2,[2,79]),o($Vz2,[2,80]),o($Vz2,[2,81]),o($Vz2,[2,86]),o($Vz2,[2,82]),o($Vz2,[2,83]),{50:[1,482]},{50:$V81,57:$V91,59:483,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{50:$V81,57:$V91,59:484,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:485,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt,[2,270],{66:$Vr1}),o($Vt,[2,271],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,486]}),{50:[1,487]},o($Vn1,[2,275],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:489,55:[1,488],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vs1,[2,255]),{55:[1,490],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vt1,[2,266]),o($Vs1,[2,264]),o($Vs1,[2,265]),{66:[1,491]},{50:[1,492]},o($VC1,[2,354],{153:$VR2}),o($VS2,[2,359]),o($VS2,[2,360]),o([6,8,20,21,26,32,33,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],[2,197]),o($Vn1,[2,184],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:495,55:[1,494],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VT2,[2,191]),{55:[1,496],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VC1,[2,350],{153:$VR2}),o($VC1,[2,351],{153:$VR2}),o($VC1,[2,352],{153:$VR2}),o($VC1,[2,356],{153:$VR2}),o($Vn1,[2,180],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,497]},o($Vn1,[2,181],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,498]},o($Vn1,[2,182],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,499]},o($Vn1,[2,183],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,500]},o($Vn1,[2,185],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,501]},{50:[1,502],66:$VE2},{30:[1,503]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:505,64:$Vw,67:[1,504],70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,253],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V0,[2,283]),o($VJ1,[2,34],{8:$VK1}),o($VJ1,[2,33],{8:$VK1}),o($VL1,[2,112],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,286],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,287],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,288],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,289],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,290],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,291],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,163,164,165,166,167,168,169],[2,292],{157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,[2,293]),o($VV2,[2,97],{71:506,53:$V92}),o($VW2,[2,294],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{60:[1,507],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VW2,[2,296],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,297],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,298],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,299],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,300],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,301],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,303],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,304],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VZ2,[2,305],{179:$V62}),o($VZ2,[2,306],{179:$V62}),o($VZ2,[2,307],{179:$V62}),o($VZ2,[2,308],{179:$V62}),o($Vo1,[2,309]),{50:[1,508],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,51]),{8:$VB,37:447},{32:[1,509],66:$V_2},o($V$2,[2,128],{60:[1,511]}),{55:[1,512],66:$V03},o($VD2,[2,130]),o($V13,[2,122],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{28:$VH2,52:514},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:515,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,54]),o($V72,[2,57]),{50:[1,516],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:517,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,518]},o($V23,[2,96]),o([8,32,50,66,110],[2,213],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([8,32,50,66,109,110],[2,214]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:519,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,523],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vp2,[2,338]),o($Vo1,[2,319],{182:$V43}),o($Vp2,[2,340]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:525,97:$Vy},{24:162,28:$Vz,33:$Vv,48:$VJ,49:526,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:$VA2,129:[1,527]},{28:[1,528]},{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:529,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},{8:[1,539],109:[1,540]},o($V63,[2,169]),o($V63,[2,170]),o($V63,[2,171],{132:277,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),o($V63,[2,172]),{50:[1,541],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{48:[1,542]},{48:[1,543]},o($V72,[2,28]),o($V72,[2,26]),o($V72,[2,150]),{50:[1,544],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,545],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VL1,[2,211]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:546,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:$Vr2},{55:[1,547],66:$VE2},o($Vp2,[2,334]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:548,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,336]),{50:[1,549],66:$V73},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:551,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,250],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{50:[1,552],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:553,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,554],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:555,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,556],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:557,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,558],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:559,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{129:[2,209]},o($VD2,[2,207],{24:162,93:283,124:561,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,67:[1,560],70:$Vx,97:$Vy,143:$Vi2,180:$Vj2,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,60:$VQ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:562},{55:[1,563]},{55:[2,344],60:[1,564],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:565,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,566],57:$V91,62:567,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:568,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[2,67]},o($Vy2,[2,70]),o($Vy2,[2,74],{53:$VK2}),o($Vy2,[2,75],{53:$VK2}),{30:[1,569]},{50:[1,570]},{50:[1,571]},o($Vn1,[2,269],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:572,53:$VN2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,138:573,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vk,[2,218]),o($Vs1,[2,257]),{55:[1,574],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vs1,[2,256]),{28:[1,575]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:576},{28:[1,577],145:[1,578]},o($VT2,[2,193]),{55:[1,579],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VT2,[2,192]),{53:[1,580]},{53:[1,581]},{53:[1,582]},{53:[1,583]},{53:[1,584]},{30:[1,585]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:586,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:587,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,252],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VV2,[2,98],{53:$VK2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:588,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:589,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,52]),{28:[1,590]},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:591,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,53]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:592,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,593],66:$V_2},{55:[1,594],66:$V03},o($Vo1,[2,326]),{50:[1,595],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V23,[2,95]),{55:[1,596],66:$V83},o($VD2,[2,236],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,600],109:$VM1,120:$Vd3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:602,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$V43},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:603,97:$Vy},{48:[1,604]},o($VL1,[2,284],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:$VN2,138:605},o($VL1,[2,21],{30:[1,606]}),{32:[1,607]},{8:$VB,32:[2,41],37:608},o($Ve3,[2,100]),o($Ve3,[2,101]),o($Ve3,[2,102]),o($Ve3,[2,103]),o($Ve3,[2,104]),o($Ve3,[2,105]),o($Ve3,[2,106]),o($Ve3,[2,107]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:609,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:611,53:[1,612],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,104:610,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:613,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:614,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:615,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,617],114:616},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:618,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,619],66:$VE2},o($VL1,[2,201]),{50:[1,620],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,131]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:621,53:[1,622],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,623],66:$VE2},o($Vo1,[2,323]),{50:[1,624],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,324]),{50:[1,625],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,325]),{50:[1,626],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,327]),{50:[1,627],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,628]},o($VD2,[2,206]),{55:[1,629]},o($Vf3,[2,349]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:630,55:[2,346],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[2,347],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{57:$V91,61:631,62:632,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{30:[1,633]},{32:[1,634]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:635,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,636]},{30:[1,637]},o($Vn1,[2,272],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vt,[2,273]),o($Vs1,[2,258]),{50:[1,639],66:[1,638]},o($Vn1,[2,280],{66:$Vr1}),o($VS2,[2,357]),o($VS2,[2,358]),o($VT2,[2,194]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:640,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:641,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:642,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:643,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:644,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:645,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,646]},o($VF2,[2,251],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149],[2,295],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,50]),o($V$2,[2,126],{60:[1,647]}),o($V$2,[2,127]),o($VD2,[2,129]),o($V13,[2,123]),o($V13,[2,124]),o($Vo1,[2,331]),o($Vg3,[2,222],{60:[1,649],67:[1,648]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:651,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,147:650,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:652,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vh3,[2,243]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:653,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:654,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,655],66:$V83},o($Vp2,[2,339]),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,49:461,94:656,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VL1,[2,285]),{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:657,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},o($V72,[2,22]),{8:$VK1,13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,32:[2,42],57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:658,126:31},{8:[1,659],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,660]},{50:[2,143],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:661,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,147]),{50:[1,662],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,663],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,151]),{117:664,121:[1,665]},o([8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,152],{116:[1,666]}),o($VL1,[2,212]),o($Vp2,[2,335]),o($Vy2,[2,247],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:667,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,249]),o($Vo1,[2,328]),o($Vo1,[2,329]),o($Vo1,[2,330]),o($Vo1,[2,332]),{129:[2,210]},o($Vf3,[2,348]),{55:[2,345],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,668],66:[1,669]},o($VD2,[2,94]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:670,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vi3,[2,62]),{32:[1,671]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:672,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:673,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:674,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:[1,675]},{55:[1,676],66:$VE2},{55:[1,677],66:$VE2},{55:[1,678],66:$VE2},{55:[1,679],66:$VE2},{55:[1,680],66:$VE2},{32:[1,681]},o($V0,[2,282]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:682,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,223]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:683,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,226],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,684],109:$VM1,120:$Vd3,148:[1,685],149:[1,686],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,238],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,237],{109:$VM1,120:$Vj3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,239],{60:[1,688],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,244]),{50:[1,689],66:$V73},{32:[1,690]},o($Ve3,[2,99]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,108:691,122:692,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:697,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,698],66:$VE2},o($V72,[2,148]),o($V72,[2,149]),{32:[1,699],118:[1,700],121:[1,701]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:702,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:704,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,705],66:$VE2},{30:[1,706]},{57:$V91,62:707,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{32:[1,708]},o($Vi3,[2,63]),{32:[1,709]},{32:[1,710]},{50:[1,711],66:$VE2},{53:[1,712]},o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($Vt,[2,189]),o($Vt,[2,190]),o($V0,[2,281]),o($V$2,[2,125]),o($Vg3,[2,224],{67:[1,713],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:714,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,232],{140:136,92:138,181:140,93:155,24:162,124:223,49:715,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,233],{140:136,92:138,181:140,93:155,24:162,124:223,49:716,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:717,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:718,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VL1,[2,136]),o($V72,[2,23]),{50:[1,719],66:[1,720]},o($Vy2,[2,216]),o($Vy2,[2,164]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:721,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:722,143:$Vi2,180:$Vj2,182:$V71},{123:[1,723],125:[1,724],129:$Vd2,132:277,133:$Ve2,134:$Vf2,135:$Vg2},o($V72,[2,146]),{50:[2,144]},o($V72,[2,156]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:99,39:725,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:726,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{60:[1,727],66:$Vm3},o($Vn3,[2,160],{109:$VM1,120:[1,729],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,153]),o($Vy2,[2,248]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:730,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,93]),o($Vi3,[2,61]),o($Vi3,[2,64]),o($Vi3,[2,65]),{28:[1,731]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:732,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,225]),o($VD2,[2,227],{109:$VM1,120:$Vj3,148:[1,733],149:[1,734],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,228],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,229],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,241],{60:[1,735],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,240],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:736,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,122:737,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},o($Vy2,[2,165]),o($Vy2,[2,166]),o($Vy2,[2,167]),o($Vy2,[2,168]),{32:[1,738]},{60:[1,739],66:$Vm3},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:740,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:742,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:743,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,744]},{53:[1,745]},{55:[1,746],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,234],{140:136,92:138,181:140,93:155,24:162,124:223,49:747,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,235],{140:136,92:138,181:140,93:155,24:162,124:223,49:748,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:749,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,145]),o($Vy2,[2,215]),o($V72,[2,157]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:750,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo3,[2,163],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:233},o($Vn3,[2,158],{109:$VM1,120:[1,752],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vn3,[2,161],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vi3,[2,60]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:753,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,754]},{60:[1,755],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{60:[1,756],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vh3,[2,242],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo3,[2,162],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:384},{24:162,28:$Vz,33:$Vv,48:$VJ,49:757,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,758],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:759,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:760,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:761,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn3,[2,159],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:[1,762]},{55:[1,763],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,230],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,231],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:764,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn1,[2,278]),{55:[1,765],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vn1,[2,277])], +table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],21:[1,19],26:$V1,33:[1,21],56:22,57:$V2,58:$V3,63:$V4,64:[1,20],72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,126:31,139:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),o($V0,[2,18]),{28:[1,41],155:[1,40]},{30:[1,42]},{48:[1,43]},{33:[1,45],56:44,57:$Vh,58:$V3,64:[1,46]},{140:48,144:$Vi,145:$Vj},o($Vk,$Vl,{141:51,77:$Vm,78:$Vn,142:$Vo}),o($Vk,$Vl,{141:55,142:$Vo}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:56,154:57},{155:[1,63]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:64},{155:[1,66]},o($Vt,[2,173]),{26:$V1,57:$Vu,72:$V5,73:$V6,74:$V7,80:$Vb,126:67},{24:72,28:[1,69],33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},{57:[1,77]},{24:72,28:$Vz,33:$Vv,53:[1,80],64:$Vw,70:$Vx,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,53:[1,84],64:$Vw,70:$Vx,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,53:[1,87],64:$Vw,70:$Vx,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,53:[1,90],64:$Vw,70:$Vx,97:$Vy,127:88,128:89},{24:72,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{28:[1,93]},{30:[1,95],48:[1,94]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:96,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:$V81,57:$V91,59:163,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,181]},{56:182,57:$Vh,58:$V3},{56:183,57:$Vh,58:$V3},{28:[1,184]},o($Vn1,[2,217]),o($Vo1,[2,220]),o($Vo1,[2,221]),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:186,154:185},o($Vk,$Vl,{141:187,142:$Vo}),o($Vk,$Vl,{141:188,142:$Vo}),{48:[1,189]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:190},o([6,8,20,21,26,32,33,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,139],$Vp1,{150:192,53:$Vq1,129:[1,191]}),o($Vn1,[2,276],{66:$Vr1}),o($Vs1,[2,261]),o($Vs1,[2,262]),o($Vs1,[2,263]),{153:[1,195]},o($Vt1,[2,267]),{48:[1,196]},o($Vn1,[2,279],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1}),{48:[1,197]},o($Vt,[2,174]),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},o([6,8,20,21,26,32,33,53,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,129,139],$Vu1,{48:$Vv1,153:$Vw1}),o($Vt,[2,179],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,200]}),o($Vz1,$VA1,{130:201,53:$VB1}),{153:[1,203]},{153:[1,204]},{153:[1,205]},o($VC1,[2,355],{153:[1,206]}),{28:[1,207]},o($Vt,[2,175],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,208]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},o($VC1,$Vu1,{153:$Vw1}),o($Vt,[2,176],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,211]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},o($Vt,[2,177],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,213]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},o($Vt,[2,178],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,215]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{129:[1,217]},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:218,128:210},{48:[1,219]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:220,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:229,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,230]},{32:[2,39]},{11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:[2,29],33:$Vv,36:232,38:231,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,32:[2,31],37:233},o($VJ1,[2,35],{37:234,8:$VB}),o($VJ1,[2,38],{8:$VK1}),o($VL1,[2,108]),o($VL1,[2,109]),o($VL1,[2,110]),o($VL1,[2,111],{88:[1,236],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VL1,[2,113]),o($VL1,[2,114]),o($VL1,[2,115]),o($VL1,[2,116]),o($VL1,[2,117]),o($VL1,[2,118]),o($VL1,[2,119]),o($VL1,[2,120]),o($VL1,[2,121]),o($V72,[2,49]),{42:261,43:[1,262],44:[1,263],45:[1,264],48:[1,260]},{24:162,28:$Vz,30:[1,265],33:$Vv,48:$VJ,49:267,53:[1,266],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,55]),o($V72,[2,56]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:268,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,45]),o($VL1,[2,137]),o($VL1,[2,138]),o($VL1,[2,139]),o($VL1,[2,140]),o($VL1,[2,141]),o($VL1,[2,142]),o($Vk,$Vl,{141:51,71:270,48:$V82,53:$V92,77:$Vm,78:$Vn,142:$Vo}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:272,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:273,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:274,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o([8,32,88,109,110,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Va2,{132:277,123:$Vb2,125:$Vc2,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:282,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:287,143:$Vi2,180:$Vj2,182:$V71},o($Vo1,[2,317],{182:$Vk2}),o($Vo1,[2,318]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:289,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo1,[2,320]),o($Vo1,[2,321],{182:$Vl2}),o($Vo1,[2,322]),{63:[1,292],95:291},{28:[1,293]},{24:294,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{24:295,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy},{48:[1,296]},{48:[1,297]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:298,36:300,37:301,38:299,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{33:$Vm2,64:$Vn2,96:302,97:$Vo2},{48:[1,306]},{48:[1,307]},o($V72,[2,154]),o($V72,[2,155]),{129:[1,308]},o($VL1,[2,199],{140:136,92:138,181:140,93:155,24:162,124:223,49:309,28:$Vz,33:$Vv,48:$VJ,53:[1,310],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,$Vq2,{48:$Vr2,182:$Vs2}),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:313,97:$Vy},{24:72,28:$Vz,33:$Vv,48:$Vt2,53:[1,316],64:$Vw,70:$Vx,71:315,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,48:$Vu2,53:[1,319],64:$Vw,70:$Vx,71:318,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,48:$Vv2,53:[1,322],64:$Vw,70:$Vx,71:321,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,48:$Vw2,53:[1,325],64:$Vw,70:$Vx,71:324,97:$Vy,127:88,128:89},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:327,136:326,143:$Vi2,180:$Vj2,182:$V71},o($Vx2,[2,342],{183:328,53:[1,329]}),{50:[1,330]},{50:[2,66],66:[1,331]},{50:[2,68]},o($Vy2,[2,71]),{28:[1,332],70:[1,333]},o($Vz2,[2,76]),o($Vz2,[2,77]),o($Vz2,[2,78]),{72:[1,334],73:[1,335],74:[1,336],80:[1,337]},{77:[1,338],78:[1,339]},o($Vz2,[2,84]),o($Vz2,[2,85]),o($Vz2,[2,87]),o($Vz2,[2,88]),o($Vz2,[2,89]),o($Vz2,[2,90]),o($Vz2,[2,91]),o($Vz2,[2,92]),{50:$V81,57:$V91,59:340,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,341]},{48:[1,342]},{48:$Vv1},o($Vt,[2,268],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,343]}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:344},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:346,154:345},{143:[1,347]},o($Vn1,[2,274],{66:$Vr1}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:348,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt1,[2,260],{53:$VA2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:351,55:[1,350],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:352,152:65},{28:[1,353],145:[1,354]},{28:[1,355]},{28:[1,356]},{28:$VB2,145:$VC2,185:357},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,128:360},{24:162,28:$Vz,33:$Vv,48:$VJ,49:361,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vz1,[2,196],{53:[1,362]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:364,55:[1,363],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$VB2,145:$VC2,185:365},{28:$VB2,145:$VC2,185:366},{28:$VB2,145:$VC2,185:367},{28:$VB2,145:$VC2,185:368},{48:[2,59]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:369,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,370],66:$Vx1},o($VD2,$Vy1),{24:162,28:$Vz,33:$Vv,48:$VJ,49:371,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,372],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:373,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,374],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:375,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,376],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:377,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,378],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:379,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,380],66:$VE2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:382,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,254],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,$Va2,{123:$Vb2,125:$Vc2}),{48:$Vt2,53:$V92,71:315},{48:$Vu2,53:$V92,71:318},{48:$Vv2,53:$V92,71:321},{48:$V82,53:$V92,71:270},{48:$Vw2,53:$V92,71:324},{32:[1,383]},o($V0,[2,24]),{8:$VB,32:[2,30],37:384},o($VJ1,[2,32],{37:385,8:$VB}),o($VJ1,[2,37],{8:$VK1}),o($VJ1,[2,36],{8:$VK1}),o($V72,[2,44]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:386,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:387,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:388,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:389,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:390,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:391,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:392,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:393,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{57:$V91,62:394,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:396,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:397,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:398,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:399,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:400,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:401,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:402,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:403,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:404,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:405,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:406,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:407,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:408,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:409,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:410,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:411,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:412,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,46]),o($VG2,[2,47]),o($VG2,[2,48]),{28:$VH2,52:414},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:416,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:[1,421],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{32:[1,422]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:423,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,424],53:$VK2},{55:$VL2},o($Vo1,[2,302]),o($Vo1,[2,310]),o($Vo1,[2,311]),o($Vo1,[2,315]),o($Vo1,[2,316]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:427,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VM2,[2,202],{138:428,53:$VN2}),o($VM2,[2,203]),o($VM2,[2,204]),o($VM2,[2,205]),o($Vo1,[2,313]),o($Vp2,$Vq2,{182:$Vs2}),{182:$Vk2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:430,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$Vl2},o($Vo1,[2,314]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:431,97:$Vy},{50:[1,432],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:433,97:$Vy},{33:$Vm2,64:$Vn2,96:434,97:$Vo2},o([33,64,97],[2,132]),{53:$Vq1,129:[1,435],150:436},o($VL1,[2,20],{130:201,27:[1,437],30:[1,438],53:$VB1,129:$VA1}),o($VL1,[2,19]),{13:443,19:440,24:162,26:$V1,28:$Vz,33:$Vv,48:$Vh2,57:$Vu,64:$Vw,70:$Vx,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,80:$Vb,93:283,97:$Vy,99:441,107:439,124:442,126:31,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:444,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{110:[1,445]},{8:$VB,37:447,110:[1,446]},o([20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,25],{37:448,8:$VB}),o($V72,[2,27]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:449,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,133]),o($VG2,[2,134]),o($VG2,[2,135]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:450,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:451,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,53:[1,453],64:$Vw,70:$Vx,92:452,93:454,97:$Vy},o($VL1,[2,200],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:455,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,333],{48:[1,457],143:[1,456],180:[1,458]}),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,94:459,49:461,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,[2,337]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:462,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,463],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:464,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,465],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:466,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,467],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:468,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,469],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{55:[1,470],66:[1,471]},o($VD2,[2,208]),o($Vx2,[2,343],{53:[1,472]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,120:$VQ2,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:473},{30:[1,477],60:[1,476]},{57:$V91,67:[1,478],68:479,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},o($Vy2,[2,72],{71:480,53:$V92}),o($Vy2,[2,73],{71:481,53:$V92}),o($Vz2,[2,79]),o($Vz2,[2,80]),o($Vz2,[2,81]),o($Vz2,[2,86]),o($Vz2,[2,82]),o($Vz2,[2,83]),{50:[1,482]},{50:$V81,57:$V91,59:483,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{50:$V81,57:$V91,59:484,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:485,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt,[2,270],{66:$Vr1}),o($Vt,[2,271],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,486]}),{50:[1,487]},o($Vn1,[2,275],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:489,55:[1,488],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vs1,[2,255]),{55:[1,490],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vt1,[2,266]),o($Vs1,[2,264]),o($Vs1,[2,265]),{66:[1,491]},{50:[1,492]},o($VC1,[2,354],{153:$VR2}),o($VS2,[2,359]),o($VS2,[2,360]),o([6,8,20,21,26,32,33,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],[2,197]),o($Vn1,[2,184],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:495,55:[1,494],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VT2,[2,191]),{55:[1,496],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VC1,[2,350],{153:$VR2}),o($VC1,[2,351],{153:$VR2}),o($VC1,[2,352],{153:$VR2}),o($VC1,[2,356],{153:$VR2}),o($Vn1,[2,180],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,497]},o($Vn1,[2,181],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,498]},o($Vn1,[2,182],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,499]},o($Vn1,[2,183],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,500]},o($Vn1,[2,185],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,501]},{50:[1,502],66:$VE2},{30:[1,503]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:505,64:$Vw,67:[1,504],70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,253],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V0,[2,283]),o($VJ1,[2,34],{8:$VK1}),o($VJ1,[2,33],{8:$VK1}),o($VL1,[2,112],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,286],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,287],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,288],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,289],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,290],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,291],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,163,164,165,166,167,168,169],[2,292],{157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,[2,293]),o($VV2,[2,97],{71:506,53:$V92}),o($VW2,[2,294],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{60:[1,507],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VW2,[2,296],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,297],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,298],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,299],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,300],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,301],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,303],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,304],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VZ2,[2,305],{179:$V62}),o($VZ2,[2,306],{179:$V62}),o($VZ2,[2,307],{179:$V62}),o($VZ2,[2,308],{179:$V62}),o($Vo1,[2,309]),{50:[1,508],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,51]),{8:$VB,37:447},{32:[1,509],66:$V_2},o($V$2,[2,128],{60:[1,511]}),{55:[1,512],66:$V03},o($VD2,[2,130]),o($V13,[2,122],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{28:$VH2,52:514},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:515,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,54]),o($V72,[2,57]),{50:[1,516],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:517,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,518]},o($V23,[2,96]),o([8,32,50,66,110],[2,213],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([8,32,50,66,109,110],[2,214]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:519,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,523],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vp2,[2,338]),o($Vo1,[2,319],{182:$V43}),o($Vp2,[2,340]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:525,97:$Vy},{24:162,28:$Vz,33:$Vv,48:$VJ,49:526,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:$VA2,129:[1,527]},{28:[1,528]},{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:529,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},{8:[1,539],109:[1,540]},o($V63,[2,169]),o($V63,[2,170]),o($V63,[2,171],{132:277,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),o($V63,[2,172]),{50:[1,541],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{48:[1,542]},{48:[1,543]},o($V72,[2,28]),o($V72,[2,26]),o($V72,[2,150]),{50:[1,544],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,545],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VL1,[2,211]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:546,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:$Vr2},{55:[1,547],66:$VE2},o($Vp2,[2,334]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:548,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,336]),{50:[1,549],66:$V73},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:551,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,250],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{50:[1,552],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:553,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,554],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:555,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,556],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:557,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,558],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:559,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{129:[2,209]},o($VD2,[2,207],{24:162,93:283,124:561,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,67:[1,560],70:$Vx,97:$Vy,143:$Vi2,180:$Vj2,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,120:$VQ2,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:562},{55:[1,563]},{55:[2,344],109:$VM1,120:[1,564],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:565,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,566],57:$V91,62:567,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:568,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[2,67]},o($Vy2,[2,70]),o($Vy2,[2,74],{53:$VK2}),o($Vy2,[2,75],{53:$VK2}),{30:[1,569]},{50:[1,570]},{50:[1,571]},o($Vn1,[2,269],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:572,53:$VN2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,138:573,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vk,[2,218]),o($Vs1,[2,257]),{55:[1,574],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vs1,[2,256]),{28:[1,575]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:576},{28:[1,577],145:[1,578]},o($VT2,[2,193]),{55:[1,579],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VT2,[2,192]),{53:[1,580]},{53:[1,581]},{53:[1,582]},{53:[1,583]},{53:[1,584]},{30:[1,585]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:586,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:587,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,252],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VV2,[2,98],{53:$VK2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:588,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:589,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,52]),{28:[1,590]},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:591,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,53]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:592,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,593],66:$V_2},{55:[1,594],66:$V03},o($Vo1,[2,326]),{50:[1,595],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V23,[2,95]),{55:[1,596],66:$V83},o($VD2,[2,236],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,600],109:$VM1,120:$Vd3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:602,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$V43},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:603,97:$Vy},{48:[1,604]},o($VL1,[2,284],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:$VN2,138:605},o($VL1,[2,21],{30:[1,606]}),{32:[1,607]},{8:$VB,32:[2,41],37:608},o($Ve3,[2,100]),o($Ve3,[2,101]),o($Ve3,[2,102]),o($Ve3,[2,103]),o($Ve3,[2,104]),o($Ve3,[2,105]),o($Ve3,[2,106]),o($Ve3,[2,107]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:609,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:611,53:[1,612],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,104:610,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:613,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:614,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:615,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,617],114:616},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:618,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,619],66:$VE2},o($VL1,[2,201]),{50:[1,620],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,131]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:621,53:[1,622],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,623],66:$VE2},o($Vo1,[2,323]),{50:[1,624],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,324]),{50:[1,625],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,325]),{50:[1,626],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,327]),{50:[1,627],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,628]},o($VD2,[2,206]),{55:[1,629]},o($Vf3,[2,349]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:630,55:[2,346],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[2,347],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{57:$V91,61:631,62:632,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{30:[1,633]},{32:[1,634]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:635,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,636]},{30:[1,637]},o($Vn1,[2,272],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vt,[2,273]),o($Vs1,[2,258]),{50:[1,639],66:[1,638]},o($Vn1,[2,280],{66:$Vr1}),o($VS2,[2,357]),o($VS2,[2,358]),o($VT2,[2,194]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:640,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:641,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:642,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:643,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:644,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:645,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,646]},o($VF2,[2,251],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149],[2,295],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,50]),o($V$2,[2,126],{60:[1,647]}),o($V$2,[2,127]),o($VD2,[2,129]),o($V13,[2,123]),o($V13,[2,124]),o($Vo1,[2,331]),o($Vg3,[2,222],{60:[1,649],67:[1,648]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:651,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,147:650,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:652,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vh3,[2,243]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:653,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:654,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,655],66:$V83},o($Vp2,[2,339]),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,49:461,94:656,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VL1,[2,285]),{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:657,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},o($V72,[2,22]),{8:$VK1,13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,32:[2,42],57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:658,126:31},{8:[1,659],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,660]},{50:[2,143],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:661,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,147]),{50:[1,662],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,663],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,151]),{117:664,121:[1,665]},o([8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,152],{116:[1,666]}),o($VL1,[2,212]),o($Vp2,[2,335]),o($Vy2,[2,247],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:667,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,249]),o($Vo1,[2,328]),o($Vo1,[2,329]),o($Vo1,[2,330]),o($Vo1,[2,332]),{129:[2,210]},o($Vf3,[2,348]),{55:[2,345],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,668],66:[1,669]},o($VD2,[2,94]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:670,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vi3,[2,62]),{32:[1,671]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:672,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:673,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:674,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:[1,675]},{55:[1,676],66:$VE2},{55:[1,677],66:$VE2},{55:[1,678],66:$VE2},{55:[1,679],66:$VE2},{55:[1,680],66:$VE2},{32:[1,681]},o($V0,[2,282]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:682,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,223]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:683,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,226],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,684],109:$VM1,120:$Vd3,148:[1,685],149:[1,686],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,238],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,237],{109:$VM1,120:$Vj3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,239],{60:[1,688],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,244]),{50:[1,689],66:$V73},{32:[1,690]},o($Ve3,[2,99]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,108:691,122:692,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:697,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,698],66:$VE2},o($V72,[2,148]),o($V72,[2,149]),{32:[1,699],118:[1,700],121:[1,701]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:702,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:704,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,705],66:$VE2},{30:[1,706]},{57:$V91,62:707,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{32:[1,708]},o($Vi3,[2,63]),{32:[1,709]},{32:[1,710]},{50:[1,711],66:$VE2},{53:[1,712]},o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($Vt,[2,189]),o($Vt,[2,190]),o($V0,[2,281]),o($V$2,[2,125]),o($Vg3,[2,224],{67:[1,713],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:714,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,232],{140:136,92:138,181:140,93:155,24:162,124:223,49:715,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,233],{140:136,92:138,181:140,93:155,24:162,124:223,49:716,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:717,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:718,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VL1,[2,136]),o($V72,[2,23]),{50:[1,719],66:[1,720]},o($Vy2,[2,216]),o($Vy2,[2,164]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:721,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:722,143:$Vi2,180:$Vj2,182:$V71},{123:[1,723],125:[1,724],129:$Vd2,132:277,133:$Ve2,134:$Vf2,135:$Vg2},o($V72,[2,146]),{50:[2,144]},o($V72,[2,156]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:99,39:725,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:726,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{60:[1,727],66:$Vm3},o($Vn3,[2,160],{109:$VM1,120:[1,729],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,153]),o($Vy2,[2,248]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:730,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,93]),o($Vi3,[2,61]),o($Vi3,[2,64]),o($Vi3,[2,65]),{28:[1,731]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:732,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,225]),o($VD2,[2,227],{109:$VM1,120:$Vj3,148:[1,733],149:[1,734],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,228],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,229],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,241],{60:[1,735],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,240],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:736,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,122:737,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},o($Vy2,[2,165]),o($Vy2,[2,166]),o($Vy2,[2,167]),o($Vy2,[2,168]),{32:[1,738]},{60:[1,739],66:$Vm3},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:740,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:742,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:743,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,744]},{53:[1,745]},{55:[1,746],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,234],{140:136,92:138,181:140,93:155,24:162,124:223,49:747,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,235],{140:136,92:138,181:140,93:155,24:162,124:223,49:748,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:749,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,145]),o($Vy2,[2,215]),o($V72,[2,157]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:750,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo3,[2,163],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:233},o($Vn3,[2,158],{109:$VM1,120:[1,752],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vn3,[2,161],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vi3,[2,60]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:753,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,754]},{60:[1,755],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{60:[1,756],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vh3,[2,242],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo3,[2,162],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:384},{24:162,28:$Vz,33:$Vv,48:$VJ,49:757,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,758],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:759,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:760,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:761,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn3,[2,159],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:[1,762]},{55:[1,763],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,230],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,231],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:764,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn1,[2,278]),{55:[1,765],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vn1,[2,277])], defaultActions: {4:[2,1],97:[2,39],165:[2,68],184:[2,58],207:[2,59],470:[2,209],478:[2,67],628:[2,210],698:[2,144]}, parseError: function parseError (str, hash) { if (hash.recoverable) { diff --git a/src/assign.js b/src/assign.js index 320261d..6a98da8 100644 --- a/src/assign.js +++ b/src/assign.js @@ -22,6 +22,7 @@ module.exports = class Assign { return value; } #assign (name, indexes, value) { + // console.log(`ASSIGN(${name})[#${indexes.length ?? 0}] = ${value.constructor ? (value.constructor.name ?? typeof value):typeof value}`); // const array = Context.references.getArray(name, indexes); const reference = Context.references.getReference(name); return reference.set(value, indexes); @@ -42,6 +43,7 @@ module.exports = class Assign { } } assignArray(name, indexes, value, array) { + console.log(`ASSIGN_ARRAY(${name})[#${indexes.length ?? 0}] = ${value.constructor ? (value.constructor.name ?? typeof value):typeof value}`); const ref = value.getAloneOperand(); let valueIndexes = value.__indexes ?? []; const def = Context.references.getDefinition(ref.name); @@ -53,6 +55,7 @@ module.exports = class Assign { // array.lengths[0] != def.array.lengths[0]) { } assignArrayLevel(level, name, indexes, value, leftArray, rightArray) { + console.log(`ASSIGN_ARRAY_LEVEL(${level},${name})[#${indexes.length ?? 0}] = ${value.constructor ? (value.constructor.name ?? typeof value):typeof value}`); // console.log(['assignArrayLevel', level, name, indexes]); const len = leftArray.lengths[level]; for (let index = 0; index < len; ++index) { @@ -68,6 +71,7 @@ module.exports = class Assign { } } assignReference (name, value) { + console.log(`ASSIGN_REFERENCE(${level},${name}) = ${value.constructor ? (value.constructor.name ?? typeof value):typeof value}`); Context.references.setReference(name, value); } assignTypeInt(name, indexes, value, type) { @@ -78,6 +82,7 @@ module.exports = class Assign { } } assignTypeExpr(name, indexes, value, type) { + console.log(`ASSIGN_TYPE_EXPR(${name},${type})[#${indexes.length ?? 0}] = ${value.constructor ? (value.constructor.name ?? typeof value):typeof value}`); if (!(value instanceof Expression)) { Context.references.set(name, indexes, value); return; diff --git a/src/builtin/defined.js b/src/builtin/defined.js index 6f6665b..56bec3f 100644 --- a/src/builtin/defined.js +++ b/src/builtin/defined.js @@ -12,7 +12,6 @@ module.exports = class Defined extends Function { throw new Error('Invalid number of parameters'); } const arg0 = s.args[0]; - console.log('DEFINED', arg0); let value = false; try { if (arg0) { @@ -29,13 +28,10 @@ module.exports = class Defined extends Function { throw e; } } - console.log(value); const res = new IntValue(value !== false ? 1n : 0n); - console.log(`defined(${arg0.toString()})`,res); return res; } exec(s, mapInfo) { - console.log('DEFINED', mapInfo); return mapInfo; } } diff --git a/src/builtin/error.js b/src/builtin/error.js index 6770437..c55ae03 100644 --- a/src/builtin/error.js +++ b/src/builtin/error.js @@ -1,5 +1,6 @@ const Function = require("../function.js"); const IntValue = require('../expression_items/int_value.js'); +const Context = require('../context.js'); module.exports = class Error extends Function { constructor (parent) { @@ -26,6 +27,7 @@ module.exports = class Error extends Function { caller = e.stack.split('\n').slice(1).join('\n'); } console.log(caller);*/ + console.log(Context.sourceRef); console.log(`\x1B[1;35mERROR ${mapInfo.join(' ')}\x1B[0m`); EXIT_HERE; return new IntValue(0n); diff --git a/src/builtin/length.js b/src/builtin/length.js index 1142f3f..657c02c 100644 --- a/src/builtin/length.js +++ b/src/builtin/length.js @@ -12,23 +12,16 @@ module.exports = class Length extends Function { } const arg0 = s.args[0]; const item = arg0.evalAsItem(); - console.log(util.inspect(item, false, null, true)); if (item instanceof StringValue) { return {result: BigInt(item.length)}; } - console.log(item); - console.log(item.array); if (item && item.array) { - console.log(util.inspect(item, false, null, true)); - console.log(BigInt(item.array.getLength(0))); return {result: item.array ? BigInt(item.array.getLength(0)) : 0n}; } - console.log('OHH, NOOO!!!'); return {result: 0n}; } exec(s, mapInfo) { const res = new IntValue(mapInfo.result); - console.log('LENGTH', res); return res; } } diff --git a/src/definition_items/expression_variable.js b/src/definition_items/expression_variable.js index ee33b06..39e37eb 100644 --- a/src/definition_items/expression_variable.js +++ b/src/definition_items/expression_variable.js @@ -17,7 +17,6 @@ module.exports = class ExpressionVariable extends Variable { } // super.setValue(value); if (typeof value.instance === 'function') { - assert(value.stack.length > 0); this.value = value.instance(); return; } diff --git a/src/expression.js b/src/expression.js index 51ebd81..d6d3c39 100644 --- a/src/expression.js +++ b/src/expression.js @@ -17,10 +17,13 @@ const VALID_NATIVE_OPS = [false, ...NATIVE_OPS]; const Exceptions = require('./exceptions.js'); const ExpressionPacker = require('./expression_packer.js'); const ExpressionClass = require('./expression_class.js'); +const ExpressionList = require('./expression_items/expression_list.js'); const Debug = require('./debug.js'); +const Types = require('./types.js'); // TODO: StackPos as class function assertExpressionItem(value, info) { + assert((value instanceof ExpressionList) === false); return assertReturnInstanceOf(value, ExpressionItem, info); } class Expression extends ExpressionItem { @@ -36,6 +39,7 @@ class Expression extends ExpressionItem { static operatorsToMethodCache = {}; static operators = ExpressionOperatorMethods; + static unitaryOperators = ExpressionOperationsInfo.getUnitaryOperations(); static context; constructor () { @@ -88,6 +92,7 @@ class Expression extends ExpressionItem { } insertStack(expressionToInsert, stackIndex) { + assert(expressionToInsert instanceof Expression); const delta = expressionToInsert.stack.length; // @@ -227,7 +232,7 @@ class Expression extends ExpressionItem { const aIsEmpty = this.stack.length === 0; const bIsEmpty = b === false || b.stack.length === 0; - if (bIsEmpty && op !== 'not') { + if (bIsEmpty && Expression.unitaryOperators.includes(op) === false ) { throw new Error(`insert without operands`); } const aIsAlone = this.isAlone(); @@ -279,7 +284,7 @@ class Expression extends ExpressionItem { return res; } // verify that all bs are expressions - assert(bs.reduce((isExpression, b) => isExpresion = isExpression && b instanceof Expression, true)); + assert(bs.reduce((isExpression, b) => isExpression && b instanceof Expression, true)); const anyEmptyB = bs.some((b) => b.stack.length === 0); @@ -457,6 +462,7 @@ class Expression extends ExpressionItem { // stackResults[pos][0] contains result of this stack position, // in stackResults[pos][1] contains a results array of this stack position operands instance(options) { + assert(this.stack.length > 0); if (Debug.active) { console.log(Context.sourceRef); this.dump("#############"); @@ -469,10 +475,37 @@ class Expression extends ExpressionItem { if (Debug.active) cloned.dump('PRE-SIMPLIFY'); cloned.simplify(); if (Debug.active) cloned.dump('POST-SIMPLIFY'); + if (options.unroll) { + return cloned.unroll(); + } + if (options.unpackItem && cloned.isAlone()) { + const operand = cloned.getAloneOperand(); + if (operand instanceof ExpressionItem) { + return operand; + } + } // console.log(stackResults); // cloned.dumpStackResults(stackResults, ''); return cloned; } + isInstanceOf(cls) { + if (!this.isAlone()) return false; + + const operand = this.getAloneOperand(); + return (operand instanceof cls); + } + unroll(options) { + if (!this.isAlone()) return this; + + const operand = this.getAloneOperand(); + if (operand instanceof ExpressionItems.ArrayOf === false) return this; + + return operand.toArrays(); + // for (const e of res) { + // if (e instanceof Expression) e.dump(); + // else console.log(e); + // } + } evalAsValue(options) { // return this.eval({...options, onlyAsValue: true}); let res = this.eval(options); @@ -482,6 +515,7 @@ class Expression extends ExpressionItem { return (res instanceof ExpressionItems.ValueItem || res instanceof ExpressionItems.StringValue) ? res : ExpressionItems.NonRuntimeEvaluableItem.get(); } eval(options = {}) { + assert(this.stack.length > 0); return this.instance(options); /* console.trace('EVAL '+this.toString()); if (this.stack.length === 0) { @@ -499,6 +533,7 @@ class Expression extends ExpressionItem { return stackResults.map((x, index) => `#${index} ${x[0] ?? 'null'} ${x[1].map(o => o ? o.toString() : o).join(',')}`).reverse().join('\n'); } evaluateFullStack(stackResults, options) { + assert(this.stack.length > 0); const evaluateId = Date.now(); if (Debug.active) { this.dump(`evaluateFullStack #${evaluateId} BEGIN`); @@ -509,6 +544,7 @@ class Expression extends ExpressionItem { if (Debug.active) this.dump(`evaluateFullStack #${evaluateId} END`); } evaluateStackPos(stackResults, stackIndex, options = {}) { + assert(stackIndex < this.stack.length); const st = this.stack[stackIndex]; const results = stackResults[stackIndex]; const _debugLabel = `#${options.evaluateId ?? 0} S${stackIndex}(${st.op})`; @@ -598,6 +634,7 @@ class Expression extends ExpressionItem { const operationInfo = ExpressionOperationsInfo.get(operation); if (operationInfo === false) { + console.log(values); throw new Error(`Operation ${operation} not was defined`); } @@ -666,7 +703,7 @@ class Expression extends ExpressionItem { } ++iarg; } - + throw new Error(`Operation ${operation} not was defined by types ${types.join(',')} [${methods.join(', ')}]`); } castingItemMethod(type) { @@ -793,7 +830,15 @@ class Expression extends ExpressionItem { // optimization to get stackResults, to avoid calculate two times when // insert into stack the expression (1) + if (Debug.active) { + console.log(options); + console.log(operand); + } const result = operand.eval(options); + if (Debug.active) { + console.log(result); + console.log(Context.sourceRef); + } operandResults.push(result); if (options.instance && result !== null) { if (Debug.active) this.dump(`AAAA.IN stpos:${stpos}`); @@ -1166,6 +1211,9 @@ class Expression extends ExpressionItem { return op.dumpItem({...options, cType, cProp, cValue, pos}); } if (op === null) return 'null'; + if (Array.isArray(op)) { + return '['+op.map(x => this.dumpOperand(x, pos, options)).join()+']' + } EXIT_HERE; } toString(options) { @@ -1359,8 +1407,12 @@ class Expression extends ExpressionItem { hasRuntimes() { return this.stack.some(stackPos => stackPos.operands.some(operand => operand.isRuntime())); } + static getType() { + return 'expr'; + } } ExpressionItem.registerClass('Expression', Expression); ExpressionClass.set(Expression); +Types.register('expr', Expression); module.exports = Expression; \ No newline at end of file diff --git a/src/expression_factory.js b/src/expression_factory.js index e0682df..515f10e 100644 --- a/src/expression_factory.js +++ b/src/expression_factory.js @@ -2,7 +2,7 @@ const util = require('util'); const {cloneDeep} = require('lodash'); const Expression = require("./expression.js"); const {ReferenceItem, IntValue, StringValue, StringTemplate, - FunctionCall, ExpressionList} = require("./expression_items.js"); + FunctionCall, ExpressionList, RangeIndex} = require("./expression_items.js"); const Router = require("./router.js"); const {assert, assertLog} = require('./assert'); const RowOffset = require('./expression_items/row_offset.js'); @@ -97,8 +97,12 @@ module.exports = class ExpressionFactory { } static _fromAppend(obj) { console.log('TODO !!! '); + console.log(util.inspect(obj, false, null)); let res = this._fromObject(obj.value); + res.transform = 'spread'; delete obj.value; + res.dump(); + EXIT_HERE; return res; } static _fromReference(obj) { @@ -167,5 +171,12 @@ module.exports = class ExpressionFactory { // console.log(res); return res; } + static _fromRangeIndex(obj) { + const from = obj.from ?? false; + const to = obj.to ?? false; + delete obj.from; + delete obj.to; + return new RangeIndex(from, to); + } // TODO: positionalParams } diff --git a/src/expression_items.js b/src/expression_items.js index 560ff3b..83d473e 100644 --- a/src/expression_items.js +++ b/src/expression_items.js @@ -20,6 +20,7 @@ const ArrayOf = require("./expression_items/array_of.js"); const FixedCol = require("./expression_items/fixed_col.js"); const FunctionCall = require("./expression_items/function_call.js"); const ParamItem = require("./expression_items/param_item.js"); +const RangeIndex = require("./expression_items/range_index.js"); const NonRuntimeEvaluableItem = require('./expression_items/non_runtime_evaluable_item.js'); module.exports = { @@ -45,5 +46,6 @@ module.exports = { ArrayOf, FunctionCall, ParamItem, + RangeIndex, NonRuntimeEvaluableItem } diff --git a/src/expression_items/array_of.js b/src/expression_items/array_of.js index 12f7e0f..f4adc28 100644 --- a/src/expression_items/array_of.js +++ b/src/expression_items/array_of.js @@ -3,36 +3,80 @@ const RuntimeItem = require("./runtime_item.js"); const MultiArray = require('../multi_array.js'); const {assert, assertLog} = require('../assert.js'); const Context = require('../context.js'); +const Types = require('../types.js'); module.exports = class ArrayOf extends RuntimeItem { - constructor (instanceType, array) { + constructor (instanceType, array, unrollLevels = 0) { super(); assertLog(array instanceof MultiArray, array); + this._array = array.clone(); + this.unrollLevels = unrollLevels; +// console.log(`ARRAYOF(${instanceType})[${array.lengths.map(x => x.toString(10)).join('],[')}] D${this.dim}`); this.instanceType = instanceType; - this._array = array.clone(); - console.log(array.constructor.name, array, this._array); } toString(options) { - return super.toString(options)+'['+this._array.lengths.join('],[')+']'; + return super.toString(options)+'['+this._array.lengths.join('],[')+`] D${this.dim}`; + } + get dim() { + return this._array.dim; } get array() { + assert(this._array !== false, 'try to access to array, but array lengths not defined'); return this._array; } set array(value) { - throw new Error(); + if (this._array !== false) { + throw new Error(); + } + this._array = value; } get instance() { return Context.references.getTypeInstance(this.instanceType); } cloneInstance() { - console.log(this.instanceType, this._array); - return new ArrayOf(this.instanceType, this._array); + return new ArrayOf(this.instanceType, this._array, this.unrollLevels); } evalInside() { return this.clone(); } getItem(indexes) { - const id = this._array.indexesToOffset(indexes); - return this.instance.getItem(id); + const offset = this._array.indexesToOffset(indexes); + return this.instance.getItem(offset); + } + toArrays(indexes = []) { + let level = indexes.length; + if (level >= this._array.dim) { + return this.getItem(indexes); + } + let nextLevelLen = this._array.lengths[level]; + let res = []; + for (let nextLevelIndex = 0; nextLevelIndex < nextLevelLen; ++nextLevelIndex) { + const _indexes = [...indexes, nextLevelIndex]; + res.push(this.toArrays(_indexes)); + } + return res; + } + static getType() { + return this.instanceType; + } + operatorSpread() { + return new ArrayOf(this.instanceType, this._array, this.unrollLevels + 1); + } + isUnrolled() { + return this.unrollLevels > 0; + } + unroll() { + assert(this.unrollLevels === 1); + + if (this._array.dim > 1) { + // TODO: implement array of arrays of + EXIT_HERE; + } + let len = this._array.lengths[0]; + let res = []; + for (let index = 0; index < len; ++index) { + res.push(this.getItem([index])); + } + return res; } } diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index a91d59b..3126d67 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -186,6 +186,14 @@ class ExpressionItem { instance(options) { return this.clone(); } + isEmpty() { + // default implementation + return false; + } + isUnrolled() { + // default implementation + return false; + } } module.exports = ExpressionItem; \ No newline at end of file diff --git a/src/expression_items/expression_list.js b/src/expression_items/expression_list.js index 1c96d73..c02251e 100644 --- a/src/expression_items/expression_list.js +++ b/src/expression_items/expression_list.js @@ -2,15 +2,21 @@ const Exceptions = require('../exceptions.js'); const {assert, assertLog} = require('../assert.js'); const ExpressionItem = require('./expression_item.js'); const MultiArray = require('../multi_array.js'); +const util = require('util'); +const Context = require('../context.js'); class ExpressionList extends ExpressionItem { - constructor(items, debug = {}) { - super(debug); + constructor(items, options = {}) { + super(options); this.indexes = [items.length]; this.label = ''; - this.items = []; - for (const item of items) { - this.items.push(item.clone()); + if (options.cloneItems === false) { + this.items = items; + } else { + this.items = []; + for (const item of items) { + this.items.push(item.clone()); + } } this.array = new MultiArray([this.items.length]); this._ns_ = 'ExpressionItem'; @@ -41,8 +47,21 @@ class ExpressionList extends ExpressionItem { return item.getItem(indexes.slice(1)); } instance(options) { - let _items = this.items.map(x => x.instance(options)); - return new ExpressionList(_items, this.debug); + let _items = []; + const _options = {...options, unroll: false}; + for (const item of this.items) { + const _instanced = item.instance(_options); + if (_instanced.isAlone()) { + const _operand = _instanced.getAloneOperand(); + if (_operand.isUnrolled()) { + const unrolled = _operand.unroll(); + _items = [..._items, ...unrolled]; + continue; + } + } + _items.push(_instanced); + } + return new ExpressionList(_items, {...this.debug, cloneItems: false}); } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index ed9dddb..beb4c58 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -12,7 +12,8 @@ module.exports = class FunctionCall extends RuntimeItem { if (Debug.active) console.log(util.inspect(args, false, 10, true)); args = args.items; } - if (Debug.active) console.log([`#FCALL#${name} ${Context.sourceTag} ${args.length}`, args]); + if (Debug.active) console.log(`#FCALL#${name} ${Context.sourceTag} ${args.length}`+ + util.inspect(args, false, null)); // this.args = args.map(x => (typeof x.clone === 'function') ? x.clone() : x); this.args = args.map(x => x.clone()); this.indexes = indexes.map(x => (typeof x.clone === 'function') ? x.clone() : x); diff --git a/src/expression_items/int_value.js b/src/expression_items/int_value.js index 3fd8404..ae62181 100644 --- a/src/expression_items/int_value.js +++ b/src/expression_items/int_value.js @@ -1,6 +1,6 @@ const {assert, assertLog} = require('../assert.js'); const ValueItem = require("./value_item.js"); - +const Types = require('../types.js'); class IntValue extends ValueItem { constructor (value = 0n) { if (value instanceof IntValue) { @@ -32,6 +32,9 @@ class IntValue extends ValueItem { console.log(value); EXIT_HERE; } + static getType() { + return 'int'; + } asInt() { return this.value; } @@ -122,6 +125,7 @@ class IntValue extends ValueItem { return new IntValue(this.asInt() == valueB.asInt() ? 1:0); } } - +Types.register('int', IntValue); ValueItem.registerClass('IntValue', IntValue); + module.exports = IntValue; \ No newline at end of file diff --git a/src/expression_items/range_index.js b/src/expression_items/range_index.js new file mode 100644 index 0000000..ef52e47 --- /dev/null +++ b/src/expression_items/range_index.js @@ -0,0 +1,16 @@ +const RuntimeItem = require("./runtime_item.js"); +const {assert, assertLog} = require('../assert.js'); +const Context = require('../context.js'); +module.exports = class RangeIndex extends RuntimeItem { + constructor (from, to) { + super(); + this.from = from !== false ? from.clone() : false; + this.to = to !== false ? to.clone(): false; + } + cloneInstance() { + return new RangeIndex(this.from, this.to); + } + evalInside() { + return this.clone(); + } +} diff --git a/src/expression_items/reference_item.js b/src/expression_items/reference_item.js index 467412d..5733945 100644 --- a/src/expression_items/reference_item.js +++ b/src/expression_items/reference_item.js @@ -7,7 +7,12 @@ module.exports = class ReferenceItem extends RuntimeItem { constructor (name, indexes = [], rowOffset) { super(); this.name = name; - this.indexes = indexes.map(index => index.clone()); + try { + this.indexes = indexes.map(index => index.clone()); + } catch (e) { + console.log(indexes); + throw e; + } // TODO: next as expression this.rowOffset = RowOffset.factory(rowOffset); } @@ -38,6 +43,9 @@ module.exports = class ReferenceItem extends RuntimeItem { } } const item = Context.references.getItem(this.name, this.indexes); + if (item.isEmpty()) { + throw new Error(`accessing to ${item.label} before his initialization at ${Context.sourceRef}`); + } if (this.rowOffset && !this.rowOffset.isZero()) { item.rowOffset = this.rowOffset.clone(); } diff --git a/src/expression_operations_info.js b/src/expression_operations_info.js index e41c149..7245948 100644 --- a/src/expression_operations_info.js +++ b/src/expression_operations_info.js @@ -20,10 +20,14 @@ module.exports = class ExpressionOperationsInfo { band: { type: 'bit', label: '&', precedence: 58, args: 2, commutative: true }, bor: { type: 'bit', label: '|', precedence: 56, args: 2, commutative: true }, bxor: { type: 'bit', label: '^', precedence: 54, args: 2, commutative: true }, - not: { type: 'logical', label: '!', precedence: 100, args: 1, commutative: false } + not: { type: 'logical', label: '!', precedence: 100, args: 1, commutative: false }, + spread: { type: 'array', label: '...', precedence: 101, args: 1, commutative: false } }; static get(operation) { return ExpressionOperationsInfo.#operations[operation] ?? false; } + static getUnitaryOperations() { + return Object.keys(this.#operations).filter(x => this.#operations[x].args === 1); + } }; diff --git a/src/expressions.js b/src/expressions.js index 28b32de..216692b 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -34,7 +34,6 @@ module.exports = class Expressions { return res; } get(id) { - console.log(this.expressions); if (this.isDefined(id)) { return this.expressions[id]; } diff --git a/src/function.js b/src/function.js index c49c05a..8bebd50 100644 --- a/src/function.js +++ b/src/function.js @@ -7,6 +7,8 @@ const ExpressionItems = require("./expression_items.js"); const List = require("./list.js"); const Context = require('./context.js'); const Debug = require('./debug.js'); +const Types = require('./types.js'); +const {ArrayOf} = require('./expression_items.js') module.exports = class Function { constructor (id, data = {}) { this.id = id; @@ -17,8 +19,12 @@ module.exports = class Function { } this.returns = data.returns ?? [] this.statements = data.statements ?? []; + this.sourceRef = data.sourceRef; } setValue(value) { + if (Debug.active || value.name == 'multiset_assumes') { + console.log(`FUNCTION.setValue ${value.name}`, value.args); + } if (this.initialized) { throw new Error(`function it's initialized again`); } @@ -29,6 +35,9 @@ module.exports = class Function { this.name = value.name; // TODO: clone return types this.args = {...value.args}; + if (Debug.active || value.name == 'multiset_assumes') { + console.log(`FUNCTION.setValue2 ${value.name}`, this.args); + } this.returns = value.returns && Array.isArray(value.returns) ? [...value.returns] : value.returns; this.statements = value.statements; } @@ -38,32 +47,49 @@ module.exports = class Function { const name = arg.name; if (name === '') throw new Error('Invalid argument name'); if (name in this.args) throw new Error(`Duplicated argument ${name}`); - this.args[name] = arg; + // console.log('## BEGIN ARG DEFINITION ##'); + // console.log(arg); + // console.log('## END ARG DEFINITION ##'); + + this.args[name] = {type: arg.type, dim: arg.dim}; } } // evaluate all called arguments on call scope before // scope changes evalArguments(args) { let eargs = []; - for (const arg of args) { - eargs.push(arg.instance()); + let argslen = args.length ?? 0; + let argnames = Object.keys(this.args); + for (let iarg = 0; iarg < argslen; ++iarg) { + const argname = argnames[iarg] ?? 'undef'; + if (Debug.active) { + console.log(`FUNC.evalArguments ${this.name}.args[${iarg}](${argname})`, this.args[argname]); + } + const arg = args[iarg]; + const _argInstanced = arg.instance({unroll: true}); + eargs.push(_argInstanced); + } + if (Debug.active) { + console.log('ARGUMENTS '+eargs.map(x => x.toString()).join(',')); } - if (Debug.active) console.log('ARGUMENTS '+eargs.map(x => x.toString()).join(',')); return eargs; } // mapArgument was called before enter on function visibility scope because // inside function args "values" aren't visible. mapArguments(s) { + if (Debug.active) console.log(s.args); const eargs = this.evalArguments(s.args); + if (Debug.active) console.log(eargs); const scall = this.callToString(eargs); if (Debug.active) { + console.log(`FUNCTION.mapArguments(s.args) ${this.name}`); + console.log(util.inspect(s.args, false, null, true)); console.log(`FUNCTION.mapArguments ${this.name}`); console.log(util.inspect(eargs, false, null, true)); } this.checkArgumentsTypes(eargs); return {eargs, scall}; } - // calculate a string to debug, with function name and list of arguments // with its values callToString(eargs) { @@ -82,17 +108,19 @@ module.exports = class Function { let iarg = 0; for (const name in this.args) { // TODO: checking types and dims + /* if (Array.isArray(args[iarg])) { for (const arg of args[iarg]) { arg.dump(); } } else { args[iarg].dump(); - } + }*/ ++iarg; } } getArgumentsReferences(args) { + EXIT_HERE; let iarg = 0; let extraInfo = ''; for (const name in this.args) { @@ -193,6 +221,7 @@ module.exports = class Function { return false; } declareAndInitializeArguments(eargs) { + Context.processor.sourceRef = this.sourceRef; let iarg = 0; for (const name in this.args) { this.setArgument(name, eargs[iarg]); @@ -201,21 +230,41 @@ module.exports = class Function { } setArgument(name, value) { const arg = this.args[name]; - if (Debug.active) console.log(name); - if (Debug.active) console.log(arg); - if (Debug.active) console.log(value); - // REVIEW: use arg.type, but perphaps we need to do a casting - if (name === 'cols') { - debugger; + if (Debug.active) { + console.log(name); + console.log(arg); + console.log(value.dim); + let values = Array.isArray(value) ? value : [value]; + for (const v of values) { + if (typeof v.dump === 'function') v.dump(`${this.name}(...${name}...) ${Context.sourceRef}`); + else console.log(v); + } } + let lengths = []; - if (value.array) { + if (value.array) { lengths = value.array.lengths; } else if (Array.isArray(value)) { lengths = [value.length]; } - if (Debug.active) console.log('KKK2KKK', name, lengths, value.constructor.name, value.toString()); - Context.references.declare(name, arg.type, lengths, {}, value); + + // REVIEW: use arg.type, but perphaps we need to do a casting + if (lengths.length !== arg.dim) { + console.log(arg); + console.log(value.dim); + throw new Error(`Invalid match dimensions on parameter ${name} (${lengths.length} !== ${arg.dim})`); + } + if (Debug.active) { + console.log(`${this.name}.${name} = ${value.constructor.name}`); + console.log('KKK2KKK', name, lengths, value.constructor.name, value.toString()); + } + Context.references.declare(name, arg.type, lengths, {sourceRef: this.sourceRef}, value); + if (Debug.active && name === '__cols') { + console.log(Context.references.get(name, [0])); + Context.references.get(name, [0]).value.dump('__cols[0]'); + console.log(Context.references.get(name, [1])); + Context.references.get(name, [1]).value.dump('__cols[1]'); + } // TODO: arrays. /* diff --git a/src/indexable.js b/src/indexable.js index 8b080ec..1673c5f 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -3,6 +3,7 @@ const {cloneDeep} = require('lodash'); const {assert, assertLog} = require('./assert.js'); const ExpressionItem = require('./expression_items/expression_item.js'); const Debug = require('./debug.js'); +const Context = require('./context.js'); module.exports = class Indexable { constructor (type, definitionClass, expressionItemClass, options) { this.expressionItemClass = expressionItemClass ?? false; @@ -126,7 +127,10 @@ module.exports = class Indexable { if (Debug.active) console.log(value.constructor.name); // if (value && typeof value.toString === 'function') console.log(value.toString()); // else console.log(value); - assertLog(item && typeof item.setValue === 'function', {type: this.type, definition: this.definitionClass, id, item: item}); + assertLog(item, {type: this.type, definition: this.definitionClass, id, item}); + if (typeof item.setValue !== 'function') { + throw new Error(`Invalid assignation at ${Context.sourceRef}`); + } item.setValue(value); /* if (typeof this.cls === 'function') { diff --git a/src/multi_array.js b/src/multi_array.js index f83d382..02b28a7 100644 --- a/src/multi_array.js +++ b/src/multi_array.js @@ -29,10 +29,27 @@ class MultiArray { initialized: [...this.initialized]}); return cloned; } - createSubArray(indexes, locatorOffset) { - const [offset, dims] = this.getIndexesOffset(indexes); + createSubArray(indexes, locatorOffset, from = false, to = false) { + let [offset, dims] = this.getIndexesOffset(indexes); const dim = this.offsets.length - dims; - const cloned = new MultiArray(this.lengths.slice(-dim), { + let _lengths = this.lengths.slice(-dim); + if (from !== false || to !== false) { + assert(dim === 1); + if (to === false) { + assert(from < _lengths[0]); + _lengths[0] = _lengths[0] - to; + offset += to + } else if (from === false) { + assert(to < _lengths[0]); + _lengths[0] = to + 1; + } else { + assert(to < _lengths[0] && from < _lengths[0] && from <= to); + _lengths[0] = to - from + 1; + offset += from + } + console.log(this.lengths, dim, _lengths, offset, from, to); + } + const cloned = new MultiArray(_lengths, { baseOffset: this.baseOffset + offset + locatorOffset, parentOffset: this.baseOffset, parentInitialized: this.initialized }); diff --git a/src/pil_parser.jison b/src/pil_parser.jison index 9b01288..9a2857f 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -1100,13 +1100,15 @@ multiple_expression_list expression_list : expression_list ',' DOTS_FILL expression %prec ',' - { $$ = $1; $$.values.push({ type: 'append', value: $4 }) } +// { $$ = $1; $$.values.push({ type: 'append', value: $4 }) } + { $$ = $1; $$.values.push($4.insert('spread')) } | expression_list ',' expression %prec ',' { $$ = $1; $$.values.push($3) } | DOTS_FILL expression - { $$ = { type: 'expression_list', values: [{ type: 'append', value: $2}] } } +// { $$ = { type: 'expression_list', values: [{ type: 'append', value: $2}] } } + { $$ = { type: 'expression_list', values: [$2.insert('spread')] } } | expression { $$ = { type: 'expression_list', values: [$1] } } @@ -1428,9 +1430,16 @@ name_optional_index expression_index : expression - | expression ':' expression - | expression ':' - | ':' expression + { $$ = $1 } + + | expression DOTS_RANGE expression + { $$ = ExpressionFactory.fromObject({type: 'range_index', from: $1, to: $3}); } + + | expression DOTS_RANGE + { $$ = ExpressionFactory.fromObject({type: 'range_index', from: $1}); } + + | DOTS_RANGE expression + { $$ = ExpressionFactory.fromObject({type: 'range_index', to: $2}); } ; array_index diff --git a/src/processor.js b/src/processor.js index 087fa8b..c958283 100644 --- a/src/processor.js +++ b/src/processor.js @@ -590,7 +590,7 @@ module.exports = class Processor { execFunctionDefinition(s) { if (Debug.active) console.log('FUNCTION '+s.funcname); let func = new Function(this, s); - this.references.declare(func.name, 'function'); + this.references.declare(func.name, 'function', [], {sourceRef: Context.sourceRef}); this.references.set(func.name, [], func); } getExprNumber(expr, s, title) { diff --git a/src/reference.js b/src/reference.js index 50bd324..b051706 100644 --- a/src/reference.js +++ b/src/reference.js @@ -1,8 +1,10 @@ const {assert, assertLog} = require('./assert.js'); const MultiArray = require("./multi_array.js"); const ArrayOf = require('./expression_items/array_of.js'); +const RangeIndex = require('./expression_items/range_index.js'); const Context = require('./context.js'); const Debug = require('./debug.js'); + /** * @property {MultiArray} array */ @@ -58,16 +60,19 @@ class Reference { // At this point, it's a array initilization } setArrayLevel(level, indexes, value, options = {}) { - if (Debug.active) console.log(`setArrayLevel(${this.name} ${level}, [${indexes.join(',')}]`); + if (Debug.active) console.log(`setArrayLevel(${this.name} ${level}, [${indexes.join(',')}] ${Context.sourceRef}`); const len = this.array.lengths[level]; for (let index = 0; index < len; ++index) { let _indexes = [...indexes]; _indexes.push(index); if (level + 1 === this.array.dim) { if (Array.isArray(value)) { +// console.log('native', _indexes[level], _indexes); this.setOneItem(value[_indexes[level]], _indexes, options); - } else { - this.setOneItem(value.getItem(_indexes), _indexes, options); + } else { + const _item = value.getItem(_indexes); +// console.log('getItem', _indexes, _item); + this.setOneItem(_item, _indexes, options); } continue; } @@ -120,8 +125,21 @@ class Reference { } // indexes evaluation let evaluatedIndexes = []; + let fromIndex = false; + let toIndex = false; if (Array.isArray(indexes) && indexes.length > 0) { - evaluatedIndexes = indexes.map(x => x.asInt()); + for (let index = 0; index < indexes.length; ++index) { + if (indexes[index].isInstanceOf(RangeIndex)) { + if (index + 1 !== indexes.length) { + throw new Error(`Range index is valid only in last index ${Context.sourceRef}`); + } + const rangeIndex = indexes[index].getAloneOperand(); + fromIndex = rangeIndex.from === false ? false : Number(rangeIndex.from.asInt()); + toIndex = rangeIndex.to === false ? false : Number(rangeIndex.to.asInt()); + continue; + } + evaluatedIndexes.push(indexes[index].asInt()); + } if (label) label = label + '['+evaluatedIndexes.join('],[')+']'; } @@ -133,7 +151,7 @@ class Reference { locator = this.array.locatorIndexesApply(this.locator, evaluatedIndexes); } else { // parcial access => result a subarray - res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator)); + res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator, fromIndex, toIndex)); } } else if (evaluatedIndexes.length > 0) { console.log(evaluatedIndexes); diff --git a/src/references.js b/src/references.js index 8c8c98c..fc9ecca 100644 --- a/src/references.js +++ b/src/references.js @@ -107,6 +107,7 @@ module.exports = class References { return typedef.instance; } decodeName (name) { + assert(typeof name === 'string'); const parts = name.split('.'); let scope = false; if (parts.length === 1) { @@ -172,10 +173,17 @@ module.exports = class References { } const scopeId = this.hasScope(type) ? Context.scope.declare(nameInfo.name, type, existingReference, false) : 0; + if (nameInfo.name === 'Main.jmp') { + console.log(scopeId); + console.log(existingReference); + // EXIT_HERE; + } // scope(name, def) => exception !!! // => scopeId; - if (existingReference !== false && existingReference.scopeId === scopeId) { - throw new Error(`${nameInfo.name} was defined previously on ${existingReference.data.sourceRef}`) + if (existingReference !== false && this.isVisible(existingReference)) { + if (existingReference.scopeId === scopeId || existingReference.scope === false || scopeId === false) { + throw new Error(`At ${Context.sourceRef} is defined ${nameInfo.name}, but ${existingReference.name} as ${existingReference.type} was defined previously on ${existingReference.data.sourceRef}`) + } } return [scopeId, false]; } @@ -185,12 +193,19 @@ module.exports = class References { assert(!name.includes('.object')); const nameInfo = this.decodeName(name); + if (name === 'Main.jmp') { console.log(nameInfo); } console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} ${lengths.length ? '[' + lengths.join(',') + '] ': ''}scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}[type: ${initValue instanceof Object ? initValue.constructor.name : typeof initValue}]`, options); let [array, size] = Reference.getArrayAndSize(lengths); + if (Debug.active) console.log(name, lengths, array, size); - const existingReference = this.references[nameInfo.name] ?? false; - + let refname = nameInfo.name; + let internalReference = false; + if (nameInfo.absoluteScope === false && nameInfo.parts.length === 2) { + const _ref = this.references[nameInfo.parts[1]] ?? false; + internalReference = _ref; + } + const existingReference = this.references[nameInfo.name] ?? internalReference; // When reference is reference to other reference, caller put & before type name (ex: &int) const [isReference, finalType] = this.normalizeType(type); @@ -247,6 +262,7 @@ module.exports = class References { } get (name, indexes = []) { + assertLog(typeof name === 'string', name); if (Debug.active) console.log('GET', name, indexes); // getReference produce an exception if name not found @@ -431,7 +447,7 @@ module.exports = class References { } isVisible(def) { if (Debug.active) console.log('ISVISIBLE', (def.constructor ?? {name: '_'}).name, def); - return !def.scopeId || !this.hasScope(def.type) || ['constant', 'function', 'witness', 'fixed'].includes(def.type) || + return !def.scopeId || !this.hasScope(def.type) || ['constant', 'function'].includes(def.type) || def.scopeId >= this.visibilityScope; // || def.scopeId <= Context.scope.getScopeId('air'); } /** diff --git a/src/scope.js b/src/scope.js index 95bcff5..554d9a4 100644 --- a/src/scope.js +++ b/src/scope.js @@ -72,8 +72,6 @@ module.exports = class Scope { } this.shadows[this.deep] = {}; for (const property in this.properties[this.deep]) { - console.log(this.properties); - console.log(this.properties[this.deep]); assertLog(typeof Context.references.unsetProperty === 'function', Context.references.constructor.name); Context.references.unsetProperty(property, this.properties[this.deep][property]); } diff --git a/src/types.js b/src/types.js new file mode 100644 index 0000000..1b1973f --- /dev/null +++ b/src/types.js @@ -0,0 +1,24 @@ +// class to register differents types + +module.exports = class Types { + static types = {}; + + static register(type, cls) { + if (typeof this.types[type] !== 'undefined') { + throw new Error(`Type ${type} already defined with class ${this.types[type]}`); + } + this.types[type] = cls; + } + static get(type) { + if (typeof this.types[type] === 'undefined') { + throw new Error(`Type ${type} not defined`); + } + return this.types[type]; + } + static getTypeFromClass(cls) { + for (const type in this.types) { + if (this.types[type] === cls) return type; + } + return false; + } +} diff --git a/test/pil2/std2/std_mset_lookup_range.pil b/test/pil2/std2/std_mset_lookup_range.pil index 49e5797..ef75193 100644 --- a/test/pil2/std2/std_mset_lookup_range.pil +++ b/test/pil2/std2/std_mset_lookup_range.pil @@ -15,8 +15,8 @@ function multiset_proves(int opid, expr cols[]) { piop_update(1, 0, opid, 1, cols); } */ -function multiset_assumes(int opid, expr sel, expr cols[]) { - piop_update(0, 0, opid, sel, cols); +function multiset_assumes(int opid, expr sel, expr __cols[]) { + piop_update(0, 0, opid, sel, __cols); } function multiset_proves(int opid, expr sel, expr cols[]) { @@ -137,7 +137,7 @@ private function check_opid_and_cols(int proves, int type, int opid, int cols_co piop.opids[piop.opids_count] = opid; piop.opids_count = piop.opids_count + 1; } else if (piopid.cols != cols_count) { - error(`The number of columns of PIOP #${opid} must be ${piopid.cols}`); + error(`The number of columns of PIOP #${opid} must be ${piopid.cols} but was ${cols_count}`); } if (proves) { @@ -239,9 +239,9 @@ private function lookup_range_proves_batch() { private function PIOP_air() { use air.std.piop; - + col witness stage(2) gsum; - + // mt1 mt2 mt3 mf1 mf2 mf3 // gsum === 'gsum * (1 - L1) + ------- + ------- + ------- - ------- - ------- - ------- // t1 t2 t3 f1 f2 f3 @@ -268,11 +268,13 @@ private function PIOP_air() { for (int i = 0; i < gsum_assumes_count; i = i + 1) { LHS = LHS * gsum_assumes[i]; RHS1 = RHS1 * gsum_assumes[i]; - + + println(`i:${i}`); expr tmp = gsum_assumes_sel[i]; // for (int j = 0; j < length(gsum_assumes); j = j + 1) { for (int j = 0; j < gsum_assumes_count; j = j + 1) { if (j != i) tmp = tmp * gsum_assumes[j]; + println(`j:${j}`); } RHS2b = RHS2b + tmp; } diff --git a/test/pil2/zkevm-etrog/main.pil b/test/pil2/zkevm-etrog/main.pil index 714e88c..2a71a9d 100644 --- a/test/pil2/zkevm-etrog/main.pil +++ b/test/pil2/zkevm-etrog/main.pil @@ -17,7 +17,24 @@ include "../std2/std_mset_lookup_range.pil" // memAlign // freeBits -const int RANGE32_ID = 10; + +const int ARITH_ID = 1; +const int BINARY_ID = 2; +const int MEM_ALIGN_ID = 3; +const int MEMORY_ID = 4; +const int PADDING_KK_HASH_ID = 5; +const int PADDING_KK_LEN_DIGEST_ID = 6; +const int PADDING_PG_DIGEST_ID = 7; +const int PADDING_PG_HASH_ID = 8; +const int PADDING_PG_LEN_ID = 9; +const int PADDING_SHA256_HASH_ID = 10; +const int PADDING_SHA256_LEN_DIGEST_ID = 11; +const int POSEIDON_G_ID = 12; +const int RANGE32_ID = 13; +const int ROM_ID = 14; +const int STORAGE_ID = 15; + +const int BINARY_OP_LT4 = 8; subproof Main(2**23) { const int NR = 8; @@ -57,8 +74,9 @@ subproof Main(2**23) { col witness hashS, hashSLen, hashSDigest; col witness useHashBytes, hashBytes; col witness bin; - col witness binOpcode; - col witness assert; + col witness binOp; + col witness carryIn; + col witness doAssert; col witness repeat, call, returnJmp; col witness assumeFREE; @@ -76,18 +94,22 @@ subproof Main(2**23) { col witness useJmpAddrRel; col witness useElseAddrRel; + col witness useOpAsParam; + col witness useConstAsParam; + col fixed L1 = [1,0...]; col fixed STEP = [0..(N-1)]; // op registers with out of expression // av assumed value, could be op or FREE - const expr op[8]; - const expr assumeInput[8]; - for (int index = 0; index < 7; ++index) { + const expr op[NR]; + const expr assumeInput[NR]; + const expr zeros[NR]; + for (int index = 0; index < NR; ++index) { expr _op = A[index] * inA + B[index] * inB + C[index] * inC + - C[(index + 7) % 8] * inROTL_C + + C[(index + NR - 1) % NR] * inROTL_C + D[index] * inD + E[index] * inE + FREE[index] * (inFREE + inFREE0) + @@ -112,6 +134,7 @@ subproof Main(2**23) { cntPaddingPG * inCntPaddingPG + RCX * inRCX; } + zeros[index] = 0; op[index] = _op; assumeInput[index] = (1 - assumeFREE) * (op[index] - FREE[index]) + FREE[index]; } @@ -132,7 +155,7 @@ subproof Main(2**23) { 2**16 * isStack + isStack*SP + 2**17 * isMem + useAddrRel * addrRel + offset; - #pragma debug on + #pragma debug off multiset_assumes(RANGE32_ID, jmpn, [isNeg * 2**32 + op[0], 32]); isNeg * (1 - isNeg) === 0; @@ -143,8 +166,8 @@ subproof Main(2**23) { // op0 check zero col witness op0Inv; - const expr op0IsZero = 1 - op0*op0Inv; - op0IsZero * op0 === 0; + const expr op0IsZero = 1 - op[0]*op0Inv; + op0IsZero * op[0] === 0; // Calculate New State for (int index = 0; index < NR; ++index) { @@ -165,20 +188,20 @@ subproof Main(2**23) { GAS' === setGAS * (op[0] - GAS) + GAS; const expr decRCX = repeat * (1 - RCXIsZero); - RCX' === setRCX * (op0 - (RCX-decRCX)) + (RCX-decRCX); + RCX' === setRCX * (op[0] - (RCX-decRCX)) + (RCX-decRCX); - HASHPOS' === setHASHPOS * (op0 - HASHPOS) + HASHPOS + (hashK + hashP + hashS)*D0 + useHashBytes * hashBytes; + HASHPOS' === setHASHPOS * (op[0] - HASHPOS) + HASHPOS + (hashK + hashP + hashS)*D[0] + useHashBytes * hashBytes; - const expr doJmp = jmpn * isNeg + jmp + jmpC * carry + jmpz * op0IsZero + returnJmp + call; + const expr doJmp = jmpn * isNeg + jmp + jmpc * carry + jmpz * op0IsZero + returnJmp + call; const expr elseJmp = jmpn * (1-isNeg) + jmpc * (1-carry) + jmpz * (1-op0IsZero); // ROM/Zkasm constraint: useJmpAddr * returnJmp = 0 const expr finalJmpAddr = jmpAddr + useJmpAddrRel * addrRel + returnJmp * (RR' - jmpAddr); const expr nextNoJmpZkPC = zkPC + 1 - ((1-RCXIsZero)*repeat); - const expr finalElseAddr = useElseAddr * (elseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; + const expr finalElseAddr = elseAddr + useElseAddrRel * elseAddr; // if elseAddr wasn't specified on zkasm, compiler put current address + 1 - zkPC' = doJmp * (finalJmpAddr - nextNoJmpZkPC) + elseJmp * (finalElseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; + zkPC' === doJmp * (finalJmpAddr - nextNoJmpZkPC) + elseJmp * (finalElseAddr - nextNoJmpZkPC) + nextNoJmpZkPC; zkPC * L1 === 0; @@ -195,8 +218,9 @@ subproof Main(2**23) { public localExitRoot[NR]; public newBatchNum; + #pragma debug off for (int index = 0; index < NR; ++index) { - (A[index] - op[index]) * assert === 0; + (A[index] - op[index]) * doAssert === 0; // oldStateRoot[NR] = B(NR); L1 * (B[index] - oldStateRoot[index]) === 0; // oldBatchNum[NR] = SP(NR); @@ -241,7 +265,8 @@ subproof Main(2**23) { // TODO: // multiset_assumes(BINARY_ID, WR + hashPDigest, [...op, ...GL4, [1, 0:7], BINARY_OP_LT4]); // multiset_assumes(BINARY_ID, WR + hashPDigest, [...op, ...GL4, [1, 0:(NR-1)], BINARY_OP_LT4]); - multiset_assumes(BINARY_ID, WR + hashPDigest, [...op, ...GL4, 1, 0, 0, 0, 0, 0, 0, 0, BINARY_OP_LT4]); + #pragma debug off + multiset_assumes(BINARY_ID, sWR + hashPDigest, [...op, ...GL4, 1, 0, 0, 0, 0, 0, 0, 0, BINARY_OP_LT4, 1, 0]); // Binary: resultValidRange []...a, ...b, lOpcode, Binary.lCout]; @@ -251,7 +276,7 @@ subproof Main(2**23) { // hashP1, hashK1, hashS1 => // ind, indR const expr romFlags = compact_bin_cols ([ - assert, bin, binCarryIn, sRD, sWR, memAlignRD, memAlignWR, memAlignWR8, mOp, mWR, + doAssert, bin, carryIn, sRD, sWR, memAlignRD, memAlignWR, memAlignWR8, mOp, mWR, arith, arithUseCD, arithUseCD, hashK, hashKDigest, hashKLen, hashP, hashPDigest, hashPLen, hashS, hashSDigest, hashSLen, useHashBytes, @@ -286,33 +311,34 @@ subproof Main(2**23) { arithC[i] = arithUseCD * (C[i] - A[i]) + A[i]; arithD[i] = arithUseCD * (C[i] - B[i]) + B[i]; arithE[i] = arithUseE * E[i]; - paramOp[i] = useOpAsParam * (assumeInput[i] - A[i]) + A[i]; - paramConst[i] = useConstAsParam * (CONST[i] - B[i]) + B[i]; + paramA[i] = useOpAsParam * (assumeInput[i] - A[i]) + A[i]; + paramB[i] = useConstAsParam * (CONST[i] - B[i]) + B[i]; // if useOpAsParam, res must be zero => managed in SM too (as other flag) - paramRes[i] = (1 - useOpAsParam) * op[i]; + paramOp[i] = (1 - useOpAsParam) * op[i]; } // We group arithmetic operations by the number of inputs they have // 1] 5 inputs (A * B + C = D * 2^256 + E) - multiset_assume(ARITH_ID, arith, [arithOp, ...A, ...B, ...arithC, ...arithD, ...arithE, ...assumeInput]); + multiset_assumes(ARITH_ID, arith, [arithOp, ...A, ...B, ...arithC, ...arithD, ...arithE, ...assumeInput]); cntArith' === cntArith * (1 - L1) + arith; - multiset_assume(BINARY_ID, bin, [binOp, ...paramA, ...paramB, ...paramOp, binCarryIn, carry]); - cntBinary' = cntBinary * (1 - L1) + bin + sWR + hashPDigest; + multiset_assumes(BINARY_ID, bin, [binOp, ...paramA, ...paramB, ...paramOp, carryIn, carry]); + cntBinary' === cntBinary * (1 - L1) + bin + sWR + hashPDigest; // OPTIMIZATION2EVAL: HASHPOSDIGEST = HASHPOS :HASHLEN + $ :HASHDIGEST // optimization reuse CONST as hashBytes or use CONST_LITE to general purpose - lookup_assume(PADDING_KK_HASH_ID, hashK, [addr, HASHPOS, useHashBytes * (hashBytes - D[0]) + D[0], ...assumeInput]); + lookup_assumes(PADDING_KK_HASH_ID, hashK, [addr, HASHPOS, useHashBytes * (hashBytes - D[0]) + D[0], ...assumeInput]); // PaddingKK: crLatch * PaddingKK.r8valid { addr, len - rem - crLen + 1, crLen, crV0C, crV1C, crV2C, crV3C, crV4C, crV5C, crV6C, crV7C } - multiset_assume(PADDING_KK_LEN_DIGEST_ID, hashKLen + hashKDigest, [hashKLen, addr, ...assumeInput, hashKDigest * incCounter]); + multiset_assumes(PADDING_KK_LEN_DIGEST_ID, hashKLen + hashKDigest, [hashKLen, addr, ...assumeInput, hashKDigest * incCounter]); // TODO: check if could be in same, perhaps len and Digest is in same "clock" of keccak // TODO: if use 2 multisets, better use a lookup without selector // REVIEW: // PaddingKK: lastHashLen { addr, len } // PaddingKK: lastHashDigest { addr, hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, incCounter } - cntKeccakF' = cntKeccakF * (1 - L1) + incCounter * hashKDigest; + // ERROR: cntKeccakF' = cntKeccakF * (1 - L1) + incCounter * hashKDigest; + cntKeccakF' === cntKeccakF * (1 - L1) + incCounter * hashKDigest; // SHA256 lookups and permutation check @@ -328,7 +354,7 @@ subproof Main(2**23) { // TODO: modify sha to be aligned with rest of hash, because currently the Sha digest's chunks are ordered // from most to least significant. (hash0 => op7, hash1 => op6, ..) - cntSha256F' = cntSha256F * (1 - L1) + incCounter * hashSDigest; + cntSha256F' === cntSha256F * (1 - L1) + incCounter * hashSDigest; // HASHP Plookpups lookup_assumes(PADDING_PG_HASH_ID, hashS, [addr, HASHPOS, useHashBytes * (hashBytes - D[0]) + D[0], ...op]); @@ -352,10 +378,10 @@ subproof Main(2**23) { // multiset_proves(PADDING_PG_LEN, lastHashLen, [addr, len]); // multiset_proves(PADDING_PG_LEN_DIGEST_ID, lastHashDigest, [addr, ...curHash, incCounter]) - cntPaddingPG' = cntPaddingPG * (1 - L1) + hashPDigest * incCounter; + cntPaddingPG' === cntPaddingPG * (1 - L1) + hashPDigest * incCounter; // TODO: modify executor - cntPoseidonG' = cntPoseidonG * (1 - L1) + (hashPDigest + sRD + sWR) * incCounter + 2 * (sRD + sWR); + cntPoseidonG' === cntPoseidonG * (1 - L1) + (hashPDigest + sRD + sWR) * incCounter + 2 * (sRD + sWR); // Memory multiset_assumes(MEMORY_ID, mOp, [addr, STEP, mWR, ...assumeInput]); @@ -369,21 +395,23 @@ subproof Main(2**23) { A[5] * (sRD + sWR) === 0; A[6] * (sRD + sWR) === 0; A[7] * (sRD + sWR) === 0; - A[8] * (sRD + sWR) === 0; + // ERROR out of bounds A[8] * (sRD + sWR) === 0; + B[2] * (sRD + sWR) === 0; B[3] * (sRD + sWR) === 0; B[4] * (sRD + sWR) === 0; B[5] * (sRD + sWR) === 0; B[6] * (sRD + sWR) === 0; B[7] * (sRD + sWR) === 0; - B[8] * (sRD + sWR) === 0; - multiset_assume(POSEIDON_G_ID, sRD + sWR, [...A[0:4], 0, ...B[0:2], ...sKeyI, sKey]); + + // ERROR: multiset_assumes(POSEIDON_G_ID, sRD + sWR, [...A[0:4], 0, ...B[0:2], ...sKeyI, sKey]); + multiset_assumes(POSEIDON_G_ID, sRD + sWR, [...A[0..4], 0, ...B[0..1], ...sKeyI, ...sKey]); // [...in, hashType, ...cap, ...hash] - multiset_assume(STORAGE_ID, sRD, [SR[0] + 2**32*SR[1], SR[2] + 2**32*SR[3], SR[4] + 2**32*SR[5], SR[6] + 2**32*SR[7], - ...sKey, ...assumeInput, incCounter]); + multiset_assumes(STORAGE_ID, sRD, [SR[0] + 2**32*SR[1], SR[2] + 2**32*SR[3], SR[4] + 2**32*SR[5], SR[6] + 2**32*SR[7], + ...sKey, ...assumeInput, 0, 0, 0, 0, incCounter]); // STORAGE_ID,latchGet,[...oldRoot, ...rkey, ...valueLow, ...valueHigh, incCounter] - multiset_assume(STORAGE_ID, sWR, [SR[0] + 2**32*SR[1], SR[2] + 2**32*SR[3], SR[4] + 2**32*SR[5], SR[6] + 2**32*SR[7], + multiset_assumes(STORAGE_ID, sWR, [SR[0] + 2**32*SR[1], SR[2] + 2**32*SR[3], SR[4] + 2**32*SR[5], SR[6] + 2**32*SR[7], ...sKey, ...D, op[0] + 2**32*op[1], op[2] + 2**32*op[3], op[4] + 2**32*op[5], op[6] + 2**32*op[7], incCounter]); @@ -391,11 +419,11 @@ subproof Main(2**23) { // MemAlign - // memAlign RD - multiset_assume(MEM_ALIGN_ID, memAlignRD, [0, C0, ...A, ...B, ...assumeInput]); - multiset_assume(MEM_ALIGN_ID, memAlignWR, [1, C0, ...A, ...B, ...assumeInput, ...D, ...E]); + // memAlign RD + multiset_assumes(MEM_ALIGN_ID, memAlignRD, [0, C[0], ...A, ...B, ...assumeInput, ...zeros, ...zeros]); + multiset_assumes(MEM_ALIGN_ID, memAlignWR, [1, C[0], ...A, ...B, ...assumeInput, ...D, ...E]); - cntMemAlign' = cntMemAlign * (1 - L1) + memAlignRD + memAlignWR; + cntMemAlign' === cntMemAlign * (1 - L1) + memAlignRD + memAlignWR; } function compact_bin_cols(expr cols[]) { @@ -411,4 +439,4 @@ function compact_bin_cols(expr cols[]) { factor = factor * 2; } return res; -} +} \ No newline at end of file From 41feddf3a862988795146900c95d1024dcd1fe65 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Tue, 6 Feb 2024 01:31:20 +0100 Subject: [PATCH 28/33] WIP pil2 --- src/compiler.js | 5 +- src/constraints.js | 9 - src/context.js | 11 +- src/expression.js | 320 +----------------- src/expression_items/expression_item.js | 8 +- src/expression_items/expression_reference.js | 26 +- src/expression_items/function_call.js | 4 +- src/expression_items/no_evaluated_item.js | 2 +- .../non_runtime_evaluable_item.js | 2 +- src/expression_items/proof_item.js | 2 +- src/expression_items/runtime_item.js | 6 +- src/indexable.js | 26 +- src/pil.js | 8 +- src/processor.js | 123 +++---- src/reference.js | 2 +- src/references.js | 1 - src/variable.js | 4 +- test/pil2/std2/std_mset_lookup_range.pil | 26 +- test/pil2/zkevm-etrog/main.pil | 12 +- 19 files changed, 147 insertions(+), 450 deletions(-) diff --git a/src/compiler.js b/src/compiler.js index e6ec494..97b5c37 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -31,7 +31,6 @@ class Compiler { constructor(Fr) { this.Fr = Fr; this.constants = new Definitions(Fr); - this.processor = new Processor(Fr, this); } initContext() { @@ -45,8 +44,10 @@ class Compiler { } async compile(fileName, config = {}) { const isMain = true; - this.initContext(); this.config = config; + this.initContext(); + console.log(config); + this.processor = new Processor(this.Fr, this, this.config); if (this.config.namespaces) { this.namespaces = {}; for (const name of this.config.namespaces) { diff --git a/src/constraints.js b/src/constraints.js index e84dd6d..15085d6 100644 --- a/src/constraints.js +++ b/src/constraints.js @@ -28,15 +28,10 @@ module.exports = class Constraints { } getPackedExpressionId(id, container, options = {}) { - console.log(Context.expressions); - console.log(options); - console.log(id); - console.log(options.expressions ?? Context.expressions); const res = (options.expressions ?? Context.expressions).getPackedExpressionId(id, container, options); return res; } define(left, right, boundery, sourceRef) { - console.log(left, right); assertLog(left instanceof Expression, left); assertLog(right instanceof Expression, right); if (left.isRuntime()) { @@ -51,7 +46,6 @@ module.exports = class Constraints { console.log('\x1B[31mWARNING: accessing fixed row acces\x1b[0m'); } const id = this.constraints.length; - console.log(right.eval()); if (right.asIntDefault(false) !== 0n) { left.insert('sub', right); } @@ -82,18 +76,15 @@ module.exports = class Constraints { } } dump (packed) { - console.log('CONSTRAINTS'); for (let index = 0; index < this.constraints.length; ++index) { console.log(this.getDebugInfo(index, packed)); } } getDebugInfo(index, packed, options) { const constraint = this.constraints[index]; - console.log(constraint); const eid = constraint.exprId; // const peid = Context.expressions.getPackedExpressionId(eid); const peid = this.getPackedExpressionId(eid, packed, options); - console.log(peid); let info = `INFO ${index}: ${eid} ${peid} ${constraint.sourceRef}` options = options ?? {}; diff --git a/src/context.js b/src/context.js index 78da4ae..90d72f1 100644 --- a/src/context.js +++ b/src/context.js @@ -2,18 +2,21 @@ const {assert} = require("chai"); module.exports = class Context { static _instance = null; - constructor (Fr, processor) { + constructor (Fr, processor, config = {}) { assert(Context._instance === null); Context._instance = this; this.Fr = Fr; this._processor = processor; this.namespace = ''; this.subproof = false; - this.stack = []; - this.config = {debug: {}}; + this.stack = []; + this.config = {debug: {}, ...config}; + console.log(config); + console.log(this.config); this.uses = []; this.subproofName = false; - this.airName = false; + this.airId = false; + this.airN = false; } static get expressions() { return this._instance._processor.expressions; diff --git a/src/expression.js b/src/expression.js index d6d3c39..a8e6f34 100644 --- a/src/expression.js +++ b/src/expression.js @@ -66,17 +66,12 @@ class Expression extends ExpressionItem { } pushStack(e) { - if (!(e instanceof Expression)) { - throw new Error(`pushStack parameter must be an Expression`); - } + assertLog(e instanceof Expression, {e, msg:'pushStack parameter must be an Expression'}); + const count = e.stack.length; for (let index = 0; index < count; ++index) { let stackPos = e.stack[index]; - // if (Debug.active) console.log(stackPos); - // if (Debug.active) e.dumpStackPos(stackPos); let clonedStackPos = this.cloneStackPos(stackPos); - // if (Debug.active) e.dumpStackPos(stackPos); - // if (Debug.active) this.dumpStackPos(clonedStackPos); this.stack.push(clonedStackPos); } return count; @@ -184,47 +179,18 @@ class Expression extends ExpressionItem { // return (this.isAlone() && this.stack[0].operands[0].type === OP_RUNTIME && this.stack[0].operands[0].op === 'reference' ); return (this.isAlone() && this.stack[0].operands[0] instanceof ExpressionItems.ReferenceItem); } - - // OP_VALUE (value) - // OP_ID_REF (id, refType, next) refType = [im,witness,fixed,prover,public,((expression))] At end need to calculate next of expression - // OP_STACK (offset) NOTE: absolute_index = current_index - offset; - // OP_RUNTIME (data) - _set (operand) { if (this.stack.length) { throw new Error(`Set only could be used with empty stack`); } this.stack.push({op: false, operands: [assertExpressionItem(operand.clone())]}); } -/* - setIdReference (id, refType, next) { - assert(typeof refType === 'string'); - this._set({type: OP_ID_REF, id, refType, next}); - } -/* - setValue (value) { - if (typeof value === 'object') { - throw new Error(`object(${value.constructor.name}) as value not allowed`); - } - this._set({type: OP_VALUE, value}); - } - - setRuntime (value) { - if (value.type) { - throw new Error(`setRuntime value has a not allowed type property`); - } - this._set({type: OP_RUNTIME, ...value}); - } -*/ isRuntime () { return this.stack.some(st => this.isRuntimeStackPos(st)); } isRuntimeStackPos(st) { return ((st.op !== false && NATIVE_OPS.indexOf(st.op) < 0) || st.operands.some(operand => operand instanceof ExpressionItems.RuntimeItem)); } -/* isRuntimeOperand(ope) { - return (ope.type === OP_RUNTIME); - }*/ insertOne (op, b = false) { if (Debug.active) console.log(`\x1B[44m======================== INSERT ONE (${op}) =================================\x1B[0m`); if (Debug.active) console.log(util.inspect(b, false, null, true)); @@ -339,106 +305,13 @@ class Expression extends ExpressionItem { console.log(this.toString()); } return res; -/* const res = this.evaluateRuntime(operand, true); - console.log(operand); - console.log(res); - EXIT_HERE;*/ -/* if (!(res instanceof Expression)) { - operand.__value = res; - }*/ } return operand; } - assertInstanced() { - assert(false); - try { - for (let ist = 0; ist < this.stack.length; ++ist) { - const st = this.stack[ist]; - assert(VALID_NATIVE_OPS.includes(st.op), `invalid operation ${st.op} on stackpos ${ist}`); - for (let iope = 0; iope < st.operands.length; ++iope) { - const ope = st.operands[iope]; - const ref = `operand #${iope} of stackpos ${ist}`; - assert([OP_STACK, OP_VALUE, OP_ID_REF].includes(ope.type), `${ref} has invalid type ${ope.type}`); - switch (ope.type) { - case OP_STACK: - assert(typeof ope.offset === 'number', `invalid offset type (${typeof ope.offset}) on ${ref}`); - assert(ope.offset > 0, `invalid offset value (${ope.offset}) on ${ref}`); - break; - - case OP_VALUE: - assert(typeof ope.value === 'bigint', `invalid value type (${typeof ope.offset}) on ${ref}`); - break; - - case OP_ID_REF: - assert(NATIVE_REFS.includes(ope.refType), `invalid refType (${ope.refType}) on ${ref}`) - assert(typeof ope.id === 'number', `invalid ope.id type (${typeof ope.id}) on ${ref}`); - break; - - } - if (ope.indexes) { - const indexesType = typeof ope.indexes; - assert(indexesType === 'array', `${ref} has invalid indexes type ${indexesType}`); - for (let index = 0; index < ope.indexes.length; ++index) { - const indexType = typeof ope.indexes[index]; - assert(indexType === 'number', `${ref} has invalid index[${index}] type ${indexType}`); - } - } - } - } - } catch (e) { - this.dump(); - throw e; - } - } evaluateRuntime(op, deeply = false) { let res = Context.expressions.evalRuntime(op, this, deeply); return res; } - instanceValues() { - assert(false); - /* - for (let se of this.stack) { - for (let index = 0; index < se.operands.length; ++index) { - if (se.operands[index].type !== OP_RUNTIME) continue; - const value = se.operands[index].__value; - if (typeof value === 'bigint') { - se.operands[index] = {type: OP_VALUE, value: value}; - continue; - } - if (typeof value === 'object' && value.type && - ['constant','witness', 'fixed', 'im', 'public', 'expr', 'challenge','subproofvalue', 'proofvalue'].includes(value.type)) { - let ope = {}; - if (value.array) { - // incomplete reference, is a subarray. - ope.type = OP_RUNTIME; - ope.array = value.array; - ope.op = 'idref'; - } else { - ope.type = OP_ID_REF; - ope.array = false; - } - if (typeof value.value === 'undefined' || value.value === null) { - ope.id = value.id; - } else { - ope.id = typeof value.value === 'object' ? value.value.id : value.value; - } - assert(typeof value.type === 'string'); - ope.refType = value.type; - if (value.next) ope.next = value.next; - if (value.prior) ope.next = value.prior; - if (typeof value.row !== 'undefined') { - ope.row = value.row; - } - se.operands[index] = ope; - continue; - } - console.log(value); - console.log(se.operands[index]); -// value.dump(); - throw new Error('Invalid value'); - } - }*/ - } getReference() { if (!this.isAlone()) { throw new Error(`Invalid expression by reference`); @@ -501,13 +374,8 @@ class Expression extends ExpressionItem { if (operand instanceof ExpressionItems.ArrayOf === false) return this; return operand.toArrays(); - // for (const e of res) { - // if (e instanceof Expression) e.dump(); - // else console.log(e); - // } } evalAsValue(options) { -// return this.eval({...options, onlyAsValue: true}); let res = this.eval(options); if (res.isAlone()) { res = res.getAloneOperand(); @@ -555,9 +423,7 @@ class Expression extends ExpressionItem { return results[0]; } - - // console.log([results, st.operands.length, st]); - let values = results[1]; + let values = results[1].slice(0, st.operands.length); for (let operandIndex = 0; operandIndex < st.operands.length; ++operandIndex) { const _operandDebugLabel = `${_debugLabel} ${operandIndex}]`; const operand = st.operands[operandIndex]; @@ -572,28 +438,20 @@ class Expression extends ExpressionItem { values[operandIndex] = this.evaluateStackPos(stackResults, stackIndex - operand.getOffset()); if (Debug.active) console.log(`evaluateStackPos STACK ${_operandDebugLabel} ${values[operandIndex]} ${stackIndex - operand.getOffset()}`, stackResults); } else { - // console.log(operand); values[operandIndex] = operand.eval(options); if (Debug.active) console.log(`evaluateStackPos NO-STACK ${_operandDebugLabel} ${values[operandIndex]}`, operand); } -/* if (options.instance && values[operandIndex] && values[operandIndex] instanceof ExpressionItems.NonRuntimeEvaluableItem === false && - values[operandIndex] instanceof ExpressionItems) - if (options.instance) { - - }*/ } - // console.log(values); - - // console.log([st.op, ...values]); let value = null; if (values.some(value => value instanceof ExpressionItems.NonRuntimeEvaluableItem)) { value = ExpressionItems.NonRuntimeEvaluableItem.get(); } else if (values.some(value => value === null)) { value = null; + this.dump('value=null '+Context.sourceRef); EXIT_HERE; } else if (st.op === false) { value = values[0]; - } else if (values.some(value => value instanceof ExpressionItems.ProofItem)) { + } else if (values.some(value => value.isRuntimeEvaluable() === false)) { value = ExpressionItems.NonRuntimeEvaluableItem.get(); } else { value = this.applyOperation(st.op, values); @@ -830,15 +688,7 @@ class Expression extends ExpressionItem { // optimization to get stackResults, to avoid calculate two times when // insert into stack the expression (1) - if (Debug.active) { - console.log(options); - console.log(operand); - } const result = operand.eval(options); - if (Debug.active) { - console.log(result); - console.log(Context.sourceRef); - } operandResults.push(result); if (options.instance && result !== null) { if (Debug.active) this.dump(`AAAA.IN stpos:${stpos}`); @@ -888,95 +738,6 @@ class Expression extends ExpressionItem { if (e.type === 'witness' && e.type === 'fixed') return false; } } - // this method instance the expression references to include them inside - // TODO: view how these affects to optimization. - instanceExpressions(options) { - EXIT_HERE; -/* let pos = 0; - while (pos < this.stack.length) { - let nextPos = true; - for (let ope of this.stack[pos].operands) { - if (ope.type !== OP_RUNTIME) continue; - console.log(ope); - EXIT_HERE; - if (ope.__value instanceof Expression) { - ope.type = OP_STACK; - const exprToInsert = ope.__value.instance(); - const next = typeof ope.next === 'number' ? ope.next : ope.__next; - if (next) exprToInsert.next(next); - if (isAlone) { - this.stack.pop(); - } - - const stackOffset = this.insertStack(exprToInsert, pos, options); - if (!isAlone) { - ope.offset = stackOffset; - } - nextPos = false; - break; - } - if (typeof ope.__value !== 'undefined' && !(ope.__value instanceof NonRuntimeEvaluable)) continue; - - // TODO: twice evaluations, be carefull double increment evaluations,etc.. - const res = this.evaluateRuntime(ope); - if (res.value && res.value.type === OP_ID_REF) { - ope.type = OP_ID_REF; - ope.refType = res.refType; - ope.id = res.id; - } else if (res instanceof Expression) { - ope.type = OP_STACK; - const exprToInsert = res.instance(); - const next = typeof ope.next === 'number' ? ope.next : ope.__next; - if (next) exprToInsert.next(next); - delete this.stack[0]; - if (isAlone) { - this.stack.pop(); - } - const stackOffset = this.insertStack(exprToInsert, pos, options); - if (!isAlone) { - ope.offset = stackOffset; - } - nextPos = false; - break; - } - } - if (nextPos) ++pos; - }*/ - } - // this method instance the expression references to include them inside - // TODO: view how these affects to optimization. - instanceExpressions(options) { - EXIT_HERE; - // assert(ope.__value instanceof Expression === false); - /* - if (ope.__value instanceof Expression) { - ope.type = OP_STACK; - const exprToInsert = ope.__value.instance(); - const next = typeof ope.next === 'number' ? ope.next : ope.__next; - if (next) exprToInsert.next(next); - ope.offset = this.insertStack(exprToInsert, pos); - nextPos = false; - break; - } - if (typeof ope.__value !== 'undefined' && !(ope.__value instanceof NonRuntimeEvaluable)) continue; - - // TODO: twice evaluations, be carefull double increment evaluations,etc.. - const res = this.evaluateRuntime(ope); - if (res.value && res.value.type === OP_ID_REF) { - ope.type = OP_ID_REF; - ope.refType = res.refType; - ope.id = res.id; - } else if (res instanceof Expression) { - ope.type = OP_STACK; - const exprToInsert = res.instance(); - const next = typeof ope.next === 'number' ? ope.next : ope.__next; - if (next) exprToInsert.next(next); - ope.offset = this.insertStack(exprToInsert, pos); - nextPos = false; - break; - }*/ - } - simplify() { let loop = 0; while (this.stack.length > 0) { @@ -1262,77 +1023,6 @@ class Expression extends ExpressionItem { if (Debug.active) this.dump('PRE-PACK'); return packer.pack(options); } -/* packAlone(container, options) { - return this.expressionPack.packAlone(container, options); - } - pack(container, options) { - return Context.expressions.pack(container, options); - }*/ -/* stackPosPack(container, pos, options) { - const st = this.stack[pos]; - if (st.op === false) { - this.operandPack(container, st.operands[0], pos, options); - return false; - } - for (const ope of st.operands) { - this.operandPack(container, ope, pos, options); - } - switch (st.op) { - case 'mul': - return container.mul(); - - case 'add': - return container.add(); - - case 'sub': - return container.sub(); - - case 'neg': - return container.neg(); - - default: - throw new Error(`Invalid operation ${st.op} on packed expression`); - } - } - - operandPack(container, ope, pos, options) { - if (ope instanceof ExpressionItems.ValueItem) { - container.pushConstant(ope.getValue()); - } - else if (ope instanceof Expression) { - container.pushExpression(Expression.parent.getPackedExpressionId(id, container, options)); - } - else if (ope instanceof ExpressionItems.WitnessCol) { - container.pushWitnessCol(ope.id, ope.next ?? 0, stage ?? 1); // TODO: stage - } - else if (ope instanceof ExpressionItems.FixedCol) { - container.pushFixedCol(ope.id, ope.next ?? 0); - } - else if (ope instanceof ExpressionItems.Public) { - container.pushPublicValue(ope.id); - } - else if (ope instanceof ExpressionItems.Challenge) { - container.pushChallenge(ope.id, stage ?? 1); - } - else if (ope instanceof ExpressionItems.Subproofval) { - container.pushSubproofValue(ope.id); - } - else if (ope instanceof ExpressionItems.Proofval) { - container.pushProofValue(ope.id); - } - else if (ope instanceof ExpressionItems.StackItem) { - // TODO: expression == false; - const eid = this.stackPosPack(container, pos-ope.offset, options); - if (eid !== false) { // eid === false => alone operand - container.pushExpression(eid); - } - } - else { - console.log(ope); - throw new Error(`Invalid reference ${ope.type} on packed expression`); - } - } -*/ resolve() { const res = this.eval(); if (res instanceof Expression) { diff --git a/src/expression_items/expression_item.js b/src/expression_items/expression_item.js index 3126d67..3b6501a 100644 --- a/src/expression_items/expression_item.js +++ b/src/expression_items/expression_item.js @@ -58,8 +58,8 @@ const Debug = require('../debug.js'); class ExpressionItem { static _classToManager = {}; - constructor(debug = {}) { - this.debug = debug; + constructor(options = {}) { + this.options = options; this.indexes = false; this.label = ''; this._ns_ = 'ExpressionItem'; @@ -194,6 +194,10 @@ class ExpressionItem { // default implementation return false; } + isRuntimeEvaluable() { + // default implementation + return true; + } } module.exports = ExpressionItem; \ No newline at end of file diff --git a/src/expression_items/expression_reference.js b/src/expression_items/expression_reference.js index 688979c..b965335 100644 --- a/src/expression_items/expression_reference.js +++ b/src/expression_items/expression_reference.js @@ -1,12 +1,26 @@ -const RuntimeItem = require("./runtime_item.js"); -module.exports = class ExpressionReference extends RuntimeItem { - constructor (id, value, debug = {}) { - super(debug); +const ProofItem = require("./proof_item.js"); +const {assert, assertLog} = require('../assert.js'); +module.exports = class ExpressionReference extends ProofItem { + constructor (id, instance, options = {}) { + super(options); this.id = id; - this.value = value; + this.instance = instance; } getTag() { return 'im'; } - + static createFrom(value, options = {}) { + assertLog(typeof options.id !== 'undefined' && typeof options.instance !== 'undefined', + {value, options, msg: 'ExpressionReference.createFrom need knows id and instance'}); + return new ExpressionReference(options.id, options.instance); + } + cloneInstance(options) { + return new ExpressionReference(this.id, this.instance, this.options); + } + evalInside(options) { + return this; + } + isRuntimeEvaluable() { + return false; + } } diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index beb4c58..7b8b17a 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -5,8 +5,8 @@ const Context = require('../context.js'); const Debug = require('../debug.js'); const ExpressionClass = require('../expression_class.js'); module.exports = class FunctionCall extends RuntimeItem { - constructor (name, args = [], indexes = [], debug = {}) { - super(debug); + constructor (name, args = [], indexes = [], options = {}) { + super(options); this.name = name; if (args instanceof ExpressionList) { if (Debug.active) console.log(util.inspect(args, false, 10, true)); diff --git a/src/expression_items/no_evaluated_item.js b/src/expression_items/no_evaluated_item.js index cc7663b..8d43883 100644 --- a/src/expression_items/no_evaluated_item.js +++ b/src/expression_items/no_evaluated_item.js @@ -16,7 +16,7 @@ class NonEvaluatedItem extends ExpressionItem { eval(options) { return NonEvaluatedItem._singletonInstance;; } - runtimeEvaluable() { + isRuntimeEvaluable() { // not evaluated, but perhaps could be evaluated return true; } diff --git a/src/expression_items/non_runtime_evaluable_item.js b/src/expression_items/non_runtime_evaluable_item.js index 652c688..107473c 100644 --- a/src/expression_items/non_runtime_evaluable_item.js +++ b/src/expression_items/non_runtime_evaluable_item.js @@ -16,7 +16,7 @@ class NonRuntimeEvaluableItem extends ExpressionItem { eval(options) { return NonRuntimeEvaluableItem._singletonInstance;; } - runtimeEvaluable() { + isRuntimeEvaluable() { return false; } } diff --git a/src/expression_items/proof_item.js b/src/expression_items/proof_item.js index 5aa5915..480ed27 100644 --- a/src/expression_items/proof_item.js +++ b/src/expression_items/proof_item.js @@ -26,7 +26,7 @@ module.exports = class ProofItem extends ExpressionItem { eval(options) { return this.clone(); } - runtimeEvaluable() { + isRuntimeEvaluable() { return false; } cloneUpdate(source) { diff --git a/src/expression_items/runtime_item.js b/src/expression_items/runtime_item.js index a37fa3b..5ec076f 100644 --- a/src/expression_items/runtime_item.js +++ b/src/expression_items/runtime_item.js @@ -1,10 +1,10 @@ const LabelRanges = require("../label_ranges.js"); const ExpressionItem = require("./expression_item.js"); module.exports = class RuntimeItem extends ExpressionItem { - constructor(debug = {}) { - super(debug); + constructor(options = {}) { + super(options); } - runtimeEvaluable() { + isRuntimeEvaluable() { return true; } } diff --git a/src/indexable.js b/src/indexable.js index 1673c5f..19e4a7f 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -5,8 +5,9 @@ const ExpressionItem = require('./expression_items/expression_item.js'); const Debug = require('./debug.js'); const Context = require('./context.js'); module.exports = class Indexable { - constructor (type, definitionClass, expressionItemClass, options) { + constructor (type, definitionClass, expressionItemClass, options = {}) { this.expressionItemClass = expressionItemClass ?? false; + this.expressionItemConstClass = options.constClass ?? expressionItemClass; this.definitionClass = definitionClass ?? false; this.values = []; this.type = type; @@ -80,25 +81,34 @@ module.exports = class Indexable { return this.getItem(id, {...properties, const: true}); } // get expression item to add in a expression - getItem(id, properties) { + getItem(id, properties = {}) { let res = this.values[id]; + const isConst = (properties.const && this.expressionItemConstClass); + const itemClass = isConst ? this.expressionItemConstClass : this.expressionItemClass; + if (Debug.active) { + console.log([id, itemClass.name, properties, this.expressionItemConstClass, res]); + console.log([id, itemClass.name, properties, this.expressionItemConstClass, res.constructor ? res.constructor.name :res.name, res.value ? res.value.constructor.name : '', res]); + } + if (isConst && typeof res.getConstItem === 'function') { + return res.getConstItem(); + } if (typeof res.getItem === 'function') { return res.getItem(); } - if (!this.expressionItemClass || res instanceof this.expressionItemClass) { + if (!itemClass || res instanceof itemClass) { return res; } - if (typeof res.value !== 'undefined' && res.value instanceof this.expressionItemClass) { + if (typeof res.value !== 'undefined' && res.value instanceof itemClass) { return res.value.clone(); } if (typeof res.value === 'undefined') { if (this.expressionItemClass.createWithId) { - return new this.expressionItemClass(id); + return new itemClass(id); } - return new this.expressionItemClass(); + return new itemClass(); } - assertLog(typeof this.expressionItemClass.createFrom === 'function', [this.type, this.constructor.name, this.expressionItemClass, res, res.value]); - return this.expressionItemClass.createFrom(res.value); + assertLog(typeof itemClass.createFrom === 'function', [this.type, this.constructor.name, itemClass, res, res.value]); + return itemClass.createFrom(res.value, {id, instance: this}); } getLabel(id, options) { diff --git a/src/pil.js b/src/pil.js index 8bb58b9..939efaf 100755 --- a/src/pil.js +++ b/src/pil.js @@ -11,6 +11,7 @@ const debugConsole = require('./debug_console.js').init(); const argv = require("yargs") .version(version) .usage("pil -o [-P ]") + .alias("e", "exec") .alias("o", "output") .alias("P", "config") .alias("v", "verbose") @@ -36,7 +37,7 @@ async function run() { const fileName = path.basename(fullFileName, ".pil"); const outputFile = typeof(argv.output) === "string" ? argv.output : fileName + ".json"; - const config = typeof(argv.config) === "string" ? JSON.parse(fs.readFileSync(argv.config.trim())) : {}; + let config = typeof(argv.config) === "string" ? JSON.parse(fs.readFileSync(argv.config.trim())) : {}; if (argv.verbose) { config.verbose = true; @@ -45,6 +46,10 @@ async function run() { } } + // only execute + if (argv.exec || argv.output === 'none') { + config.protoOut = false; + } const F = new ffjavascript.F1Field((1n<<64n)-(1n<<32n)+1n ); if (argv.include) { @@ -54,6 +59,7 @@ async function run() { if (argv.includePathFirst) { config.includePathFirst = true; } + console.log(config); const out = await compile(F, fullFileName, null, config); console.log(out); /* diff --git a/src/processor.js b/src/processor.js index c958283..4003c8d 100644 --- a/src/processor.js +++ b/src/processor.js @@ -39,7 +39,7 @@ const util = require('util'); const Debug = require('./debug.js'); module.exports = class Processor { - constructor (Fr, parent) { + constructor (Fr, parent, config = {}) { this.sourceRef = '(processor constructor)'; this.compiler = parent; this.trace = true; @@ -48,7 +48,8 @@ module.exports = class Processor { this.references = new References(); this.scope = new Scope(); this.runtime = new Runtime(); - this.context = new Context(this.Fr, this); + this.context = new Context(this.Fr, this, config); + console.log(config); this.scope.mark('proof'); this.delayedCalls = {}; @@ -65,7 +66,7 @@ module.exports = class Processor { this.strings = new Variables('string', DefinitionItems.StringVariable, ExpressionItems.StringValue); this.references.register('string', this.strings); - this.exprs = new Variables('expr', DefinitionItems.ExpressionVariable, Expression); + this.exprs = new Variables('expr', DefinitionItems.ExpressionVariable, Expression, {constClass: ExpressionItems.ExpressionReference}); this.references.register('expr', this.exprs); // this.lexprs = new Variables('lexpr', Expression); @@ -173,62 +174,19 @@ module.exports = class Processor { this.executeSubproofs(); this.finalProofScope(); this.scope.popInstanceType(); - this.generateOut(); + this.generateProtoOut(); } executeSubproofs() { for (const name of this.subproofs) { this.executeSubproof(name, this.subproofs.get(name)); } } - generateOut() + generateProtoOut() { - //packed.dump(); - // this.constraints.dump(packed); - // this.fixeds.dump(); - - // let proto = new ProtoOut(this.Fr); - // proto.setupPilOut('myFirstPil'); - // let subproofId = 0; - // proto.setSubproofvalues(this.subproofvalues.getPropertyValues(['id', 'aggregateType', 'subproofId'])); + if (Context.config.protoOut === false) return; this.proto.setPublics(this.publics); this.proto.setProofvalues(this.proofvalues); this.proto.setChallenges(this.challenges); - // update challenge stage on expression, only for challenges with open-stage because - // only at end the stage of challenge is set. - // this.proto.updateOpenChallenges(); - - // for (const subproofName of this.subproofs) { - // const subproof = this.subproofs.get(subproofName); - // proto.setSubproof(subproofName, subproof.aggregate); - // let airId = 0; - // for (const airName of subproof.airs) { - // console.log(`SUBPROOF(${subproofName},${airName})`); - // const air = subproof.airs.get(airName); - // const bits = log2(Number(air.rows)); - // proto.setAir(airName, air.rows); - // proto.setFixedCols(air.fixeds); - // proto.setWitnessCols(air.witness); - // // expression: constraint, hint, operand (expression) - // let packed = new PackedExpressions(); - // // this.expressions.pack(packed); - // air.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); - // proto.setConstraints(air.constraints, packed, - // { labelsByType: { - // witness: air.witness.labelRanges, - // fixed: air.fixeds.labelRanges }, - // expressions: air.expressions - // }); - // proto.setSymbolsFromLabels(air.witness.labelRanges, 'witness', {airId, subproofId}); - // proto.setSymbolsFromLabels(air.fixeds.labelRanges, 'fixed', {airId, subproofId}); - // proto.setExpressions(packed); - // proto.addHints(air.hints, packed, { - // subproofId, - // airId - // }); - // ++airId; - // } - // ++subproofId; - // } let packed = new PackedExpressions(); this.globalExpressions.pack(packed); this.proto.setGlobalConstraints(this.globalConstraints, packed); @@ -236,11 +194,6 @@ module.exports = class Processor { this.proto.setGlobalSymbols(this.references); this.proto.encode(); this.proto.saveToFile('tmp/pilout.ptb'); - // stageWidths - // expressions - - // publics - // this.imCols.dump(); } traceLog(text, color = '') { if (!this.trace) return; @@ -303,6 +256,9 @@ module.exports = class Processor { if (params[1] === 'on') Debug.active = true; else if (params[1] === 'off') Debug.active = false; } + if (params[0] === 'exit') { + EXIT_HERE; + } } execProof(st) { this.scope.pushInstanceType('proof'); @@ -686,6 +642,7 @@ module.exports = class Processor { this.context.subproofName = subproofName; // proto.setSubproofvalues(this.subproofvalues.getPropertyValues(['id', 'aggregateType', 'subproofId'])); const subproofId = this.proto.setSubproof(subproofName, subproof.aggregate); + Context.subproofId = this.subproofId; for (const airRows of subproof.rows) { console.log(`BEGIN AIR ${subproofName} (${airRows})`); // #${this.airId}`); this.rows = airRows; @@ -695,7 +652,9 @@ module.exports = class Processor { const airName = subproofName + (subproof.rows.length > 1 ? `_${air.bits}`:''); const airId = this.proto.setAir(airName, airRows); + Context.airId = airId; Context.airName = airName; + subproof.airs.define(airName, air); // TO-DO loop with different rows @@ -728,45 +687,54 @@ module.exports = class Processor { // const subproof = this.subproofs.get(subproofName); // proto.setSubproof(subproofName, subproof.aggregate); - let packed = new PackedExpressions(); - this.proto.setFixedCols(this.fixeds); - this.proto.setWitnessCols(this.witness); - // this.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); - this.expressions.pack(packed, {instances: [this.fixeds, this.witness]}); - this.proto.setConstraints(this.constraints, packed, - { - labelsByType: { - witness: this.witness.labelRanges, - fixed: this.fixeds.labelRanges, - subproofvalue: (id, options) => this.subproofvalues.getRelativeLabel(subproofId, id, options) - }, - expressions: this.expressions - }); - this.proto.setSymbolsFromLabels(this.witness.labelRanges, 'witness', {airId, subproofId}); - this.proto.setSymbolsFromLabels(this.fixeds.labelRanges, 'fixed', {airId, subproofId}); - this.proto.setExpressions(packed); - this.proto.addHints(this.hints, packed, { - subproofId, - airId - }); - // clearing air scope + this.subproofProtoOut(subproofId, airId) + this.clearAirScope(airName); this.constraints = new Constraints(this.Fr, this.expressions); this.scope.popInstanceType(['witness', 'fixed', 'im']); this.context.pop(); console.log(`END AIR ${subproofName} (${airRows}) #${this.airId}`); + Context.airId = false; Context.airName = false; ++this.airId; } this.finalSubproofScope(); - this.proto.setSubproofValues(this.subproofvalues.getAggreationTypesBySubproofId(subproofId)); + if (Context.config.protoOut !== false) { + this.proto.setSubproofValues(this.subproofvalues.getAggreationTypesBySubproofId(subproofId)); + } this.scope.popInstanceType(); this.currentSubproof = false; Context.subproofName = false; this.references.clearScope('subproof'); ++this.subproofId; } + subproofProtoOut(subproofId, airId) { + if (Context.config.protoOut === false) return; + + let packed = new PackedExpressions(); + this.proto.setFixedCols(this.fixeds); + this.proto.setWitnessCols(this.witness); + // this.expressions.pack(packed, {instances: [air.fixeds, air.witness]}); + this.expressions.pack(packed, {instances: [this.fixeds, this.witness]}); + this.proto.setConstraints(this.constraints, packed, + { + labelsByType: { + witness: this.witness.labelRanges, + fixed: this.fixeds.labelRanges, + subproofvalue: (id, options) => this.subproofvalues.getRelativeLabel(subproofId, id, options) + }, + expressions: this.expressions + }); + const info = {airId, subproofId}; + this.proto.setSymbolsFromLabels(this.witness.labelRanges, 'witness', info); + this.proto.setSymbolsFromLabels(this.fixeds.labelRanges, 'fixed', info); + this.proto.setExpressions(packed); + this.proto.addHints(this.hints, packed, { + subproofId, + airId + }); + } finalAirScope() { this.callDelayedFunctions('air', 'final'); } @@ -948,7 +916,6 @@ module.exports = class Processor { assertLog(s.right instanceof Expression, s.right); const left = s.left.instance(); const right = s.right.instance(); - left.dump(); if (scopeType === 'air') { id = this.constraints.define(s.left.instance({simplify: true}), s.right.instance({simplify: true}),false,this.sourceRef); expr = this.constraints.getExpr(id); diff --git a/src/reference.js b/src/reference.js index b051706..f75f952 100644 --- a/src/reference.js +++ b/src/reference.js @@ -159,7 +159,7 @@ class Reference { throw new Error('try to access to index on non-array value'); } if (res === false) { - res = options.const ? this.instance.getConstItem(locator, options) : this.instance.getItem(locator, options); + res = this.const ? this.instance.getConstItem(locator, options) : this.instance.getItem(locator, options); } if (label) res.setLabel(label); diff --git a/src/references.js b/src/references.js index fc9ecca..9ab44f9 100644 --- a/src/references.js +++ b/src/references.js @@ -291,7 +291,6 @@ module.exports = class References { // TODO: if reference is a 'reference' check if name is correct const item = reference.getItem(indexes, {...options, label: reference.name}); - if (options.preDelta) { EXIT_HERE; console.log(typeof tvalue.value); diff --git a/src/variable.js b/src/variable.js index dda1fe9..8d38b0c 100644 --- a/src/variable.js +++ b/src/variable.js @@ -1,10 +1,10 @@ module.exports = class Variable { - constructor (Fr, value, vtype, lengths, debug) { + constructor (Fr, value, vtype, lengths, options) { super(Fr); this.values = []; this.type = vtype; this.lengths = lengths; - this.debug = debug; + this.options = options; this.calculateOffsets(this.lengths); } getValue(indexes) { diff --git a/test/pil2/std2/std_mset_lookup_range.pil b/test/pil2/std2/std_mset_lookup_range.pil index ef75193..7cad09d 100644 --- a/test/pil2/std2/std_mset_lookup_range.pil +++ b/test/pil2/std2/std_mset_lookup_range.pil @@ -250,31 +250,41 @@ private function PIOP_air() { expr LHS = 1; expr RHS1 = 0; + + col witness gsP[gsum_proves_count]; + for (int i = 0; i < gsum_proves_count; i = i + 1) { + gsP[i] === gsum_proves[i]; + } + col witness gsA[gsum_assumes_count]; + for (int i = 0; i < gsum_assumes_count; i = i + 1) { + gsA[i] === gsum_assumes[i]; + } + // for (int i = 0; i < length(gsum_proves); i = i + 1) { for (int i = 0; i < gsum_proves_count; i = i + 1) { - LHS = LHS * gsum_proves[i]; + LHS = LHS * gsP[i]; expr tmp = gsum_proves_sel[i]; // for (int j = 0; j < length(gsum_proves); j = j + 1) { for (int j = 0; j < gsum_proves_count; j = j + 1) { - if (j != i) tmp = tmp * gsum_proves[j]; + if (j != i) tmp = tmp * gsP[j]; } RHS1 = RHS1 + tmp; } - expr RHS2a = LHS; + // expr RHS2a = LHS; + col witness RHS2a; + RHS2a === LHS; expr RHS2b = 0; // for (int i = 0; i < length(gsum_assumes); i = i + 1) { for (int i = 0; i < gsum_assumes_count; i = i + 1) { - LHS = LHS * gsum_assumes[i]; - RHS1 = RHS1 * gsum_assumes[i]; + LHS = LHS * gsA[i]; + RHS1 = RHS1 * gsA[i]; - println(`i:${i}`); expr tmp = gsum_assumes_sel[i]; // for (int j = 0; j < length(gsum_assumes); j = j + 1) { for (int j = 0; j < gsum_assumes_count; j = j + 1) { - if (j != i) tmp = tmp * gsum_assumes[j]; - println(`j:${j}`); + if (j != i) tmp = tmp * gsA[j]; } RHS2b = RHS2b + tmp; } diff --git a/test/pil2/zkevm-etrog/main.pil b/test/pil2/zkevm-etrog/main.pil index 2a71a9d..a8af714 100644 --- a/test/pil2/zkevm-etrog/main.pil +++ b/test/pil2/zkevm-etrog/main.pil @@ -101,6 +101,7 @@ subproof Main(2**23) { col fixed STEP = [0..(N-1)]; // op registers with out of expression // av assumed value, could be op or FREE + // col witness op[NR]; const expr op[NR]; const expr assumeInput[NR]; const expr zeros[NR]; @@ -155,7 +156,12 @@ subproof Main(2**23) { 2**16 * isStack + isStack*SP + 2**17 * isMem + useAddrRel * addrRel + offset; - #pragma debug off + + // op0 check zero + col witness op0Inv; + const expr op0IsZero = 1 - op[0]*op0Inv; + op0IsZero * op[0] === 0; + multiset_assumes(RANGE32_ID, jmpn, [isNeg * 2**32 + op[0], 32]); isNeg * (1 - isNeg) === 0; @@ -164,10 +170,6 @@ subproof Main(2**23) { const expr RCXIsZero = 1 - RCX * RCXInv; RCXIsZero * RCX === 0; - // op0 check zero - col witness op0Inv; - const expr op0IsZero = 1 - op[0]*op0Inv; - op0IsZero * op[0] === 0; // Calculate New State for (int index = 0; index < NR; ++index) { From 4c158605cbc1ab67a41df24b945c3e6237047ef8 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Mon, 19 Feb 2024 16:23:34 +0100 Subject: [PATCH 29/33] WIP --- src/compiler.js | 26 +- src/compiler.org.js | 782 ---- src/definition_items/fixed_col.js | 17 + src/expressions.js | 164 +- src/fixed_cols.js | 23 + src/indexable.js | 18 - src/processor.js | 54 +- src/reference.js | 48 +- src/references.js | 12 +- test/pil2/zkevm-etrog/arith.pil | 2 +- test/pil2/zkevm-etrog/main.pil | 24 +- test/pil2/zkevm-etrog/storage.pil | 58 +- test/pil2/zkevm-etrog/storage_rom.json | 3197 +++++++++++++++++ test/pil2/zkevm-etrog/storage_rom.pil | 48 +- .../pil2/zkevm-etrog/storage_rom_compiled.pil | 317 ++ .../zkevm-etrog/storage_rom_json_to_pil2.js | 94 + test/pil2/zkevm-etrog/tools.pil | 16 + 17 files changed, 3843 insertions(+), 1057 deletions(-) delete mode 100644 src/compiler.org.js create mode 100644 test/pil2/zkevm-etrog/storage_rom.json create mode 100644 test/pil2/zkevm-etrog/storage_rom_compiled.pil create mode 100644 test/pil2/zkevm-etrog/storage_rom_json_to_pil2.js create mode 100644 test/pil2/zkevm-etrog/tools.pil diff --git a/src/compiler.js b/src/compiler.js index 97b5c37..19093c6 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -42,7 +42,7 @@ class Compiler { this.includePaths = (this.config && this.config.includePaths) ? (Array.isArray(this.config.includePaths) ? this.config.includePaths: [this.config.includePaths]): []; this.relativeFileName = ''; } - async compile(fileName, config = {}) { + compile(fileName, config = {}) { const isMain = true; this.config = config; this.initContext(); @@ -59,7 +59,7 @@ class Compiler { this.constants.define(name, this.Fr.e(this.config.defines[name])); } } - let sts = await this.parseSource(fileName, true); + let sts = this.parseSource(fileName, true); this.processor.startExecution(sts); if (config.processorTest) { return this.processor; @@ -132,19 +132,23 @@ console.log('\x1B[93mSTATE '+state+' SYMBOL '+__symbol_info__+" #"+(yylineno + 1 } return parser; } - async parseSource(fileName, isMain = false) { + parseSource(fileName, isMain = false, options = {}) { - const [src, fileDir, fullFileName, relativeFileName] = await this.loadSource(fileName, isMain); + const [_src, fileDir, fullFileName, relativeFileName] = this.loadSource(fileName, isMain. options); + const preSrc = options.preSrc ?? ''; + const postSrc = options.postSrc ?? ''; + const src = preSrc + _src + postSrc; this.relativeFileName = relativeFileName; this.fileDir = fileDir; + const parser = this.instanceParser(src, fullFileName); const sts = parser.parse(src); for (let i=0; i '\x1b['+x+'m' : (x) => ''; - - let isMain; - if (!ctx) { - ctx = { - references: {}, - publics:{}, - nCommitments: 0, - nConstants: 0, - nIm: 0, - nQ: 0, - nPublic: 0, - expressions: [], - polIdentities: [], - plookupIdentities: [], - permutationIdentities: [], - connectionIdentities: [], - namespace: "Global", - constants: {}, - Fr: Fr, - includedFiles: {}, - config, - namespaces: true, - skippedNamespaces: {}, - skippedPols: {}, - includePaths: (config && config.includePaths) ? (Array.isArray(config.includePaths) ? config.includePaths: [config.includePaths]): [] - } - isMain = true; - } else { - isMain = false; - } - - /* config example: - - { - disableUnusedError: true, - namespaces: ['Main', 'Global', 'Rom'], - defines: { N: 2 ** 18 } - } - - */ - - let fullFileName, fileDir, src; - let includePathIndex = 0; - let relativeFileName = ''; - - if (isMain && config && config.compileFromString) { - relativeFileName = fullFileName = "(string)"; - fileDir = ''; - src = fileName; - } - else { - includePaths = [...ctx.includePaths]; - const cwd = ctx.cwd ? ctx.cwd : process.cwd(); - - if (config && config.includePathFirst) { - directIncludePathIndex = includePaths.length; - includePaths.push(cwd); - } - else { - directIncludePathIndex = 0; - includePaths.unshift(cwd); - } - do { - fullFileName = path.resolve(includePaths[includePathIndex], fileName); - if (fs.existsSync(fullFileName)) break; - ++includePathIndex; - } while (includePathIndex < includePaths.length); - - if (includePathIndex != directIncludePathIndex) { - relativeFileName = fileName; - } - fileDir = path.dirname(fullFileName); - src = await fs.promises.readFile(fullFileName, "utf8") + "\n"; - } - const srcLines = src.split(/(?:\r\n|\n|\r)/); - - const myErr = function (str, hash) { - str = fullFileName + " -> " + str; - oldParseError(str, hash); - }; - pil_parser.Parser.prototype.parseError = myErr; - - const parser = new pil_parser.Parser(); - const sts = parser.parse(src); - - let pendingCommands = []; - let lastLineAllowsCommand = false; - - if (isMain && config && config.namespaces) { - ctx.namespaces = {}; - for (const name of config.namespaces) { - ctx.namespaces[name] = 0; - } - } - - if (isMain && config && config.defines && typeof config.defines === 'object') { - for (const name in config.defines) { - ctx.constants[name] = BigInt(config.defines[name]); - } - } - - if (relativeFileName === '') { - if (isMain) { - relativeFileName = path.basename(fullFileName); - ctx.basePath = fileDir; - } else { - if (fullFileName.startsWith(ctx.basePath)) { - relativeFileName = fullFileName.substring(ctx.basePath.length+1); - } else { - relativeFileName = fullFileName; - } - } - } - - for (let i=0; i0) error(s, "command not allowed before include"); - lastLineAllowsCommand = false; - } - continue; - } else if (s.type == "NAMESPACE") { - ctx.namespace = s.namespace; - const se = simplifyExpression(Fr, ctx, s.exp); - if (se.op != "number") error(s, "Size is not constant expression"); - ctx.polDeg = Number(se.value); - continue; - } - - let skip = false; - let poldef = false; - let insideIncludedDomain = false; - const ctxExprLen = ctx.expressions.length; - - try { - checkNamespace(ctx.namespace, ctx); - insideIncludedDomain = true; - if (s.type == "POLCOMMTDECLARATION") { - for (let j=0; j 3) verboseInfo += " ..."; - verboseInfo += ansiColor(0) +'\n'; - } - console.log(`NOTE: ${relativeFileName}:${s.first_line} was ignored${verboseInfo}`); - } - - if (poldef) { - console.log(`adding ${poldef} to exclude`); - ctx.skippedPols[poldef] = true; - } - while (ctxExprLen < ctx.expressions.length) { - ctx.expressions.pop(); - } - } - - if (isMain) { - if (typeof ctx.namespaces === 'object') { - let notFoundNamespaces = Object.keys(ctx.namespaces).filter(namespace => ctx.namespaces[namespace] === 0); - if (notFoundNamespaces.length) { - throw new Error('ERROR: namespaces not found: '+notFoundNamespaces.join(', ')); - } - } - - for (n in ctx.publics) { - if (ctx.publics.hasOwnProperty(n)) { - const pub = ctx.publics[n]; - if (pub.polType == "imP") { - ctx.expressions[pub.polId] = simplifyExpression(Fr, ctx, ctx.expressions[pub.polId] ); - } - } - } - for (let i=0; i2) error(ctx.expressions[i], "Degree greater than 2"); - } - for (let i=0; i2) error(e, "Degre too high"); -} - -function reduceto1(ctx, e) { - if (e.deg<=1) return; - if (e.deg>2) error(e, "Degre too high"); - e.idQ = ctx.nQ++ - e.deg = 1; -} - -// Commitmets -// Qs -// Const -// Im - - -function ctx2json(ctx) { - const out={ - nCommitments: ctx.nCommitments, - nQ: ctx.nQ, - nIm: ctx.nIm, - nConstants: ctx.nConstants, - publics: [], - references: {}, - expressions: [], - polIdentities: [], - plookupIdentities: [], - permutationIdentities: [], - connectionIdentities: [] - }; - - for (n in ctx.references) { - if (ctx.references.hasOwnProperty(n)) { - const ref = ctx.references[n]; - if (ref.isArray) { - out.references[n] = { - type: ref.type, - id: ref.id, - polDeg: ref.polDeg, - isArray: true, - len: ref.len - }; - } else { - out.references[n] = { - type: ref.type, - id: ref.id, - polDeg: ref.polDeg, - isArray: false - }; - } - } - } - - for (n in ctx.publics) { - if (ctx.publics.hasOwnProperty(n)) { - const pub = ctx.publics[n]; - out.publics[pub.id] = pub; - out.publics[pub.id].name = n; - } - } - - for (let i=0; i0)) out.deps = deps; - return out; -} diff --git a/src/definition_items/fixed_col.js b/src/definition_items/fixed_col.js index 03b2bb3..2bfa22d 100644 --- a/src/definition_items/fixed_col.js +++ b/src/definition_items/fixed_col.js @@ -1,4 +1,5 @@ const ProofItem = require("./proof_item.js"); +const Context = require('../context.js'); // const Sequence = require("../sequence.js"); module.exports = class FixedCol extends ProofItem { constructor (id) { @@ -24,10 +25,26 @@ module.exports = class FixedCol extends ProofItem { // REVIEW this.set(value); } + setRowValue(row, value) { + if (this.sequence) { + throw new Error(`setting a row value but assigned a sequence previously ${Context.sourceTag}`); + } + this.values[row] = value; + } + getRowValue(row) { + if (this.sequence) { + throw new Error(`row access with sequence ${Context.sourceTag}`); + } + return this.values[row]; + } set(value) { // REVIEW: cyclic references if (value instanceof Object) { if (this.sequence !== null) { + console.log(value); + console.log(value.asInt()); + console.log(this.sequence); + this.sequence.dump(); EXIT_HERE; } if (this.values.length > 0) { diff --git a/src/expressions.js b/src/expressions.js index 216692b..8a5bd94 100644 --- a/src/expressions.js +++ b/src/expressions.js @@ -62,31 +62,6 @@ module.exports = class Expressions { insert(e) { return this.expressions.push(e) - 1; } - __toString(e) { - console.log(util.inspect(e, false, null, true /* enable colors */)) - } - - // update mode - ____eval(e, fr = false) { - if (e.op in this.operations) { - const operation = this.operations[e.op]; - const [a,b,reduced] = this.evaluateValues(e, operation.args, fr); - if (reduced) { - if (typeof a.value !== 'bigint' || typeof b.value !== 'bigint') { - throw new Error(`ERROR evaluating operation: ${a.value}[${typeof a.value}] ${operation} on ${b.value}[${typeof b.value}]`); - } - return { op: 'number', - value: fr ? operation.handleFr(fr, a.value, b.value) : operation.handle(a.value, b.value) }; - } - if (e.op === 'pow') { - // TODO: check last Scalar. - // return {simplified:true, op: "number", deg:0, value: Fr.toString(Fr.exp(Fr.e(a.value), Scalar.e(b.value))), first_line: e.first_line} - this.error(e, "Exponentiation can only be applied between constants"); - } - return e; - } - return this.router.go([e, fr]); - } checkExpression(e) { if (typeof e === 'undefined' || e.expr || !(e instanceof Expression)) { console.log(e) @@ -97,16 +72,6 @@ module.exports = class Expressions { eval(e) { return this.checkExpression(e).eval(); } - evalOperand(operand, values) { - switch (operand.type) { - case 0: - return BigInt(operand.value); - case 3: - return this.evalRuntime(operand.value); - } - console.log(operand); - EXIT_HERE; - } evalRuntime(operand, expr, deeply) { // TODO: if not runtime evaluable return null or const op = operand.op; @@ -121,108 +86,11 @@ module.exports = class Expressions { return operand.eval(); throw new Error(`Invalid runtime operation ${op}`); } - _evalString(e) { - if (e.template) return Context.processor.evaluateTemplate(e.value); - return e.value; - } - eval2(e, pos, values) { - let st = e.stack[pos]; - let res; - switch (st.op) { - case false: - res = this.evalOperand(st.operands[0], values) - break; - default: - console.log(st); - EXIT_HERE; - } - values[pos] = res; - } - _evalNumber(e, fr) { - return e; - } - _evalCall(e) { - return Context.processor.execCall(e); - } - _evalIdref(e) { - if (e.array) { - return e; - } - return this.evalReferenceValue(Context.references.getIdRefValue(e.refType, e.id)); - } evalReference(e) { const ref = this.evalReferenceValue(e); console.log(ref); EXIT_HERE; } - evalReferenceValue(ref) { - let res = ref; - switch (ref.type) { - case 'fixed': - // DUAL, if access row was a value, if not it's an id - // TODO - if (typeof res.row === 'undefined') { - res = {refType: 'fixed', id: res.id}; - } else { - // e.parent.fixedRowAccess = true; - res = res.value.getValue(res.row); - } - if (ref.next) res.next = ref.next; - break; - case 'challenge': - res = {refType: ref.type, id: ref.id }; - break; - case 'witness': - if (res.value instanceof WitnessCol) { - res = {refType: ref.type, id: res.value.id }; - if (ref.next) res.next = ref.next; - } - break; - case 'public': - case 'proofvalue': - case 'subproofvalue': - res = {refType: ref.type, id: res.id }; - break; - case 'im': - // TODO: review next, prior - res = {...res, value: res.id}; - break; - case 'fe': - res = { op: 'number', value: BigInt(ref.value) }; - break; - case 'constant': - if (!res.array) { - res = (typeof ref.value === 'number' ? BigInt(ref.value) : ref.value); - } - break; - case 'int': - res = (typeof ref.value === 'number' ? BigInt(ref.value) : ref.value); - break; - case 'string': - res = (typeof ref.value === 'string' ? ref.value : ''); - break; - case 'expr': - if (ref.value instanceof Expression) { - res = ref.value.eval(); - if (res instanceof Expression) { - res = res.instance({simplify: true}); - } else if (res instanceof NonRuntimeEvaluable) { - res = ref.value.instance({simplify: true}); - } - } else { - res = ref; - } - break; - - default: - console.log(ref); - throw new Error(`Invalid reference type: ${ref.type}`); - } - return res; - } - _evalReference(operand, expr, deeply) { - return this.evalReferenceValue(this.resolveReference(operand, deeply)); - } evaluateValues(e, valuesCount, fr) { // TODO: check valuesCount const a = this.eval(e.values[0], fr); @@ -252,7 +120,7 @@ module.exports = class Expressions { } return Context.references.getLabel(type, id, options); } - resolveReference(operand, deeply = false) { + _resolveReference(operand, deeply = false) { const names = this.context.getNames(operand.name); let options = {}; @@ -281,20 +149,20 @@ module.exports = class Expressions { } return res; } - getReferenceInfo(e, options) { + _getReferenceInfo(e, options) { const names = this.context.getNames(e.getAloneOperand().name); return Context.references.getTypeInfo(names, e.__indexes, options); } - e2num(e, s, title = '') { + _e2num(e, s, title = '') { DEPRECATED; return this.e2types(e, s, title, ['number','bigint']); } - e2number(e, s, title = '') { + _e2number(e, s, title = '') { DEPRECATED; let res = this.e2types(e, s, title, ['number','bigint'], false); return Number(res); } - e2types(e, s, title, types, toBigInt = true) { + _e2types(e, s, title, types, toBigInt = true) { DEPRECATED; // TODO: review specify PRE/POST on expression conversion ==> refactorize !!! @@ -315,34 +183,16 @@ module.exports = class Expressions { // const res = e.expr && e.expr instanceof Expression ? e.expr.eval() : e; return this.getValueTypes(res, s, title, types, toBigInt); } - getValueTypes(e, s, title, types, toBigInt = true) { + _getValueTypes(e, s, title, types, toBigInt = true) { const etype = typeof e; if (types.includes(etype)) { return toBigInt && etype === 'number' ? BigInt(e) : e; } this.error(s, (title ? ' ':'') + `is not constant expression (${etype}) (2)`); } - getValue(e, s, title = '') { + _getValue(e, s, title = '') { return this.getValueTypes(e, s, title, ['number','bigint','string']); } - e2value(e, s, title = '') { - DEPRECATED; - return this.e2types(e, s, title, ['number','bigint','string']); - } - e2bool(e, s, title = '') { - DEPRECATED; - let res = this.e2types(e, s, title, ['number','bigint','string']); - if (typeof res === 'string') { - return res !== ''; - } - if (typeof res === 'bigint') { - return res != 0n; - } - if (typeof res === 'number') { - return res != 0; - } - EXIT_HERE; - } pack(container, options) { this.packedIds = []; const packer = new ExpressionPacker(); diff --git a/src/fixed_cols.js b/src/fixed_cols.js index b280ff1..0cecec0 100644 --- a/src/fixed_cols.js +++ b/src/fixed_cols.js @@ -1,6 +1,8 @@ const Indexable = require("./indexable.js"); const FixedColItem = require("./expression_items/fixed_col.js"); const FixedCol = require("./definition_items/fixed_col.js"); +const {assert, assertLog} = require('./assert.js'); +const Context = require('./context.js'); module.exports = class FixedCols extends Indexable { constructor () { @@ -9,4 +11,25 @@ module.exports = class FixedCols extends Indexable { getEmptyValue(id) { return new FixedCol(id); } + setRowValue(id, row, value) { + const item = this.get(id); + assertLog(item, {type: this.type, definition: this.definitionClass, id, item}); + if (typeof item.setRowValue !== 'function') { + console.log({type: this.type, definition: this.definitionClass, id, item}); + throw new Error(`Invalid assignation at ${Context.sourceTag}`); + } + item.setRowValue(row, value); + if (this.debug) { + console.log(`SET ${this.constructor.name}.${this.type} @${id} ${value}`); + } + } + getRowValue(id, row) { + const item = this.get(id); + assertLog(item, {type: this.type, definition: this.definitionClass, id, item}); + if (typeof item.getRowValue !== 'function') { + console.log({type: this.type, definition: this.definitionClass, id, item}); + throw new Error(`Invalid access at ${Context.sourceTag}`); + } + return item.getRowValue(row); + } } diff --git a/src/indexable.js b/src/indexable.js index 19e4a7f..da1023a 100644 --- a/src/indexable.js +++ b/src/indexable.js @@ -133,29 +133,11 @@ module.exports = class Indexable { } set(id, value) { const item = this.get(id); - if (Debug.active) console.log(item); - if (Debug.active) console.log(value.constructor.name); - // if (value && typeof value.toString === 'function') console.log(value.toString()); - // else console.log(value); assertLog(item, {type: this.type, definition: this.definitionClass, id, item}); if (typeof item.setValue !== 'function') { throw new Error(`Invalid assignation at ${Context.sourceRef}`); } item.setValue(value); -/* - if (typeof this.cls === 'function') { - if ((value instanceof this.cls) === false) { - if (this.cls.directValue) { - value = new this.cls(value); - } else { - let initValue = value; - value = new this.cls(id); - console.log(value); - value.set(initValue); - } - } - } - this.values[id] = value;*/ if (this.debug) { console.log(`SET ${this.constructor.name}.${this.type} @${id} ${value}`); } diff --git a/src/processor.js b/src/processor.js index 4003c8d..7e78fe7 100644 --- a/src/processor.js +++ b/src/processor.js @@ -53,6 +53,7 @@ module.exports = class Processor { this.scope.mark('proof'); this.delayedCalls = {}; + this.timers = {}; this.airId = 0; this.subproofId = 0; @@ -251,14 +252,33 @@ module.exports = class Processor { } execPragma(st) { const params = st.value.split(/\s+/); - console.log(params); - if (params[0] === 'debug') { - if (params[1] === 'on') Debug.active = true; - else if (params[1] === 'off') Debug.active = false; - } - if (params[0] === 'exit') { - EXIT_HERE; + const instr = params[0] ?? false; + switch (instr) { + case 'debug': + if (params[1] === 'on') Debug.active = true; + else if (params[1] === 'off') Debug.active = false; + break; + case 'exit': + EXIT_HERE; + break; + case 'timer': { + const name = params[1] ?? false; + const action = params[2] ?? 'start'; + if (action === 'start') { + this.timers[name] = process.hrtime(); + } else if (action === 'end') { + const now = process.hrtime(); + const start = this.timers[name] ?? now; + const milliseconds = (now[0] - start[0]) * 1000 + Math.floor((now[1] - start[1])/1000000); + console.log(`=========================> TIMER ${name} ${milliseconds} ms <===============================`); + } + break; + } + case 'debugger': + debugger; + break; } + } execProof(st) { this.scope.pushInstanceType('proof'); @@ -381,13 +401,20 @@ module.exports = class Processor { } execWhile(s) { let index = 0; - while (this.expressions.e2bool(s.condition)) { + let result = false; + while (true) { this.scope.push(); - this.execute(s.statements, `WHILE ${this.sourceRef} I:${index}`); + const whileCond = s.condition.eval().asBool(); + if (!whileCond) { + this.scope.pop(); + break; + } + result = this.execute(s.statements, `WHILE ${this.sourceRef} I:${index}`); ++index; this.scope.pop(); - if (res === false) break; + if (result instanceof BreakCmd) break; } + return result; } execUse(s) { const name = this.expandTemplates(s.name); @@ -539,9 +566,12 @@ module.exports = class Processor { throw new Error(msg); } execInclude(s) { - if (s.contents !== false) { - return this.execute(s.contents); + console.log(s); + if (!s.contents) { + const sts = this.compiler.loadInclude(s, {preSrc: 'subproof __(2**2) {\n', postSrc: '\n};\n'}); + s.contents = sts[0].statements; } + return this.execute(s.contents); } execFunctionDefinition(s) { if (Debug.active) console.log('FUNCTION '+s.funcname); diff --git a/src/reference.js b/src/reference.js index f75f952..c958317 100644 --- a/src/reference.js +++ b/src/reference.js @@ -47,8 +47,14 @@ class Reference { return (indexes.length === 0 || !this.array) ? this.initialized : this.array.isInitialized(indexes); } getId(indexes = []) { - if (Debug.active) console.log(`getId ${this.name} ${Array.isArray(indexes) ? '[' + indexes.join(',') + ']':indexes} ${this.array ? this.array.toDebugString():''}`); - return (indexes.length === 0 || !this.array) ? this.locator : this.array.getLocator(this.locator, indexes); + if (Debug.active) { + console.log(`getId ${this.name} ${Array.isArray(indexes) ? '[' + indexes.join(',') + ']':indexes} ${this.array ? this.array.toDebugString():''}`); + } + if (indexes.length > 0 && !this.array) { + throw new Error(`Accessing to index, but not an array ${this.name} ${Context.sourceTag}`); + } + // return (indexes.length > 0 || this.array) ? this.array.getLocator(this.locator, indexes) : this.locator; + return this.array ? this.array.getLocator(this.locator, indexes) : this.locator; } set (value, indexes = [], options = {}) { if (Debug.active) console.stdebug(`set(${this.name}, [${indexes.join(',')}]`); @@ -87,17 +93,22 @@ class Reference { // called as doInit:true but it's initizalized before throw new Error('value initialized'); } - const id = this.getId(indexes); + const [row, id] = this.getRowAndId(indexes); if (this.const) { // TODO: more info throw new Error(`setting ${this.name} a const element on ${Context.sourceRef}`); } - this.instance.set(id, value); + if (row !== false) this.instance.setRowValue(id, row, value); + else this.instance.set(id, value); } #doInit(value, indexes) { - const id = this.getId(indexes); + const [row, id] = this.getRowAndId(indexes); assert(id !== null); - this.instance.set(id, value); + if (row !== false) { + this.instance.setRowValue(id, row, value); + } else { + this.instance.set(id, value); + } this.markAsInitialized(indexes); } init (value, indexes = [], options = {}) { @@ -113,8 +124,29 @@ class Reference { return [false, 1]; } get (indexes = []) { - return this.instance.get(this.getId(indexes)); + const [row, id] = this.getRowAndId(indexes); + if (row !== false) { + return this.instance.getRowValue(id, row); + } + return this.instance.get(id); } + getRowAndId(indexes = []) { + if (!this.instance.runtimeRows || indexes.length === 0) { + return [false, this.getId(indexes)]; + } + if (!this.array) { + if (indexes.length === 1) { + return [indexes[0], this.getId(indexes.slice(0, -1))]; + } + throw new Error(`Accessing to index, but not an array ${this.name} ${Context.sourceTag}`); + } + if ((this.array.dim + 1) === indexes.length) { + return [row, this.getId(indexes).slice(0,-1)]; + } + // other cases managed by getId because they aren't row access + return [row, this.getId(indexes)]; + } + getItem(indexes, options = {}) { let locator = this.locator; let label = options.label; @@ -153,6 +185,8 @@ class Reference { // parcial access => result a subarray res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator, fromIndex, toIndex)); } + } else if (evaluatedIndexes.length === 1 && this.instance.runtimeRows) { + res = this.instance.getRowValue(locator, evaluatedIndexes[0], options); } else if (evaluatedIndexes.length > 0) { console.log(evaluatedIndexes); console.log(this); diff --git a/src/references.js b/src/references.js index 9ab44f9..344113c 100644 --- a/src/references.js +++ b/src/references.js @@ -428,6 +428,9 @@ module.exports = class References { throw new Error(`not found scope ${explicitContainer}`); } reference = this.references[lname]; + if (explicitContainer === 'air' && !reference) { + reference = this.references[Context.airName+'.'+lname]; + } if (reference && reference.scopeId !== scopeId) { throw new Error(`Not match declaration scope and accessing scope (${containerName}) of ${name}`); } @@ -492,12 +495,17 @@ module.exports = class References { if (reference) break; } if (!reference) { - if (typeof defaultValue !== 'undefined') return defaultValue; + console.log(name); + console.log(nameInfo); + if (typeof defaultValue !== 'undefined') return defaultValue; throw new Exceptions.ReferenceNotFound(names.join(',')); } // constants are visible inside functions - if (this.isVisible(reference) === false) { + if (!nameInfo.absoluteScope && this.isVisible(reference) === false) { + console.log(reference); + console.log(name); + console.log(nameInfo); if (typeof defaultValue !== 'undefined') return defaultValue; throw new Exceptions.ReferenceNotVisible(names.join(',')); } diff --git a/test/pil2/zkevm-etrog/arith.pil b/test/pil2/zkevm-etrog/arith.pil index 437a439..0921b0d 100644 --- a/test/pil2/zkevm-etrog/arith.pil +++ b/test/pil2/zkevm-etrog/arith.pil @@ -25,7 +25,7 @@ */ include "global.pil"; -namespace Arith(%N); +subproof Arith(2**23) { pol constant BYTE2_BIT19; pol constant SEL_BYTE2_BIT19; diff --git a/test/pil2/zkevm-etrog/main.pil b/test/pil2/zkevm-etrog/main.pil index a8af714..240a6e9 100644 --- a/test/pil2/zkevm-etrog/main.pil +++ b/test/pil2/zkevm-etrog/main.pil @@ -10,7 +10,7 @@ // include "padding_kk.pil"; // include "mem.pil"; // include "padding_sha256.pil"; -include "../std2/std_mset_lookup_range.pil" +include "tools.pil" // hash bytes // assumeFREE // BitRange32 @@ -306,7 +306,12 @@ subproof Main(2**23) { col witness sKey[4]; // Aritmethic State Machine - + + int _i = 0; + while (_i < 10) { + println(_i); + _i = _i + 1; + } expr arithC[NR], arithD[NR], arithE[NR]; expr paramA[NR], paramB[NR], paramOp[NR]; for (int i = 0; i < NR; ++i) { @@ -427,18 +432,3 @@ subproof Main(2**23) { cntMemAlign' === cntMemAlign * (1 - L1) + memAlignRD + memAlignWR; } - -function compact_bin_cols(expr cols[]) { - int factor = 1; - expr res = 0; - if (length(cols) > 63) { - // TODO: ERROR - } - // TODO: REPEATED - for (int i = 0; i < length(cols); ++i) { - res = res + factor * cols[i]; - cols[i] * (1 - cols[i]) === 0; - factor = factor * 2; - } - return res; -} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/storage.pil b/test/pil2/zkevm-etrog/storage.pil index ae8cb01..5700e6a 100644 --- a/test/pil2/zkevm-etrog/storage.pil +++ b/test/pil2/zkevm-etrog/storage.pil @@ -1,3 +1,4 @@ +include "tools.pil" include "poseidong.pil"; include "climb_key.pil"; @@ -151,52 +152,13 @@ subproof Storage(2**23) { // Once the work is done, the rest of instructions must be: // if op0 = $n-1 (last instruction of the program) then pc = 0 (jump to the beginning of the program) - /* - code generated with: - node tools/pil_pol_table/bits_compose.js "hash,hashType,latchGet,latchSet,climbRkey,climbSiblingRkey,climbBitN,jmpz,jmp,setHashLeft,setHashRight,setLevel,setNewRoot,setOldRoot,setRkey,setRkeyBit,setSiblingRkey,setSiblingValueHash,setValueHigh,setValueLow,jmpnz,inFree,inNewRoot,inOldRoot,inRkey,inRkeyBit,inSiblingValueHash,inValueLow,inValueHigh,inRotlVh,inLevel" -b - */ - - const expr operation = - 2**0 * hash + 2**1 * hashType + 2**2 * latchGet + 2**3 * latchSet - + 2**4 * climbRkey + 2**5 * climbSiblingRkey + 2**6 * climbBitN + 2**7 * jmpz - + 2**8 * jmp + 2**9 * setHashLeft + 2**10 * setHashRight + 2**11 * setLevel - + 2**12 * setNewRoot + 2**13 * setOldRoot + 2**14 * setRkey + 2**15 * setRkeyBit - + 2**16 * setSiblingRkey + 2**17 * setSiblingValueHash + 2**18 * setValueHigh + 2**19 * setValueLow - + 2**20 * jmpnz + 2**21 * inFree + 2**22 * inNewRoot + 2**23 * inOldRoot - + 2**24 * inRkey + 2**25 * inRkeyBit + 2**26 * inSiblingValueHash + 2**27 * inValueLow - + 2**28 * inValueHigh + 2**29 * inRotlVh + 2**30 * inLevel; - - (1 - hash) * hash === 0; - (1 - hashType) * hashType === 0; - (1 - latchGet) * latchGet === 0; - (1 - latchSet) * latchSet === 0; - (1 - climbRkey) * climbRkey === 0; - (1 - climbSiblingRkey) * climbSiblingRkey === 0; - (1 - climbBitN) * climbBitN === 0; - (1 - jmpz) * jmpz === 0; - (1 - jmp) * jmp === 0; - (1 - setHashLeft) * setHashLeft === 0; - (1 - setHashRight) * setHashRight === 0; - (1 - setLevel) * setLevel === 0; - (1 - setNewRoot) * setNewRoot === 0; - (1 - setOldRoot) * setOldRoot === 0; - (1 - setRkey) * setRkey === 0; - (1 - setRkeyBit) * setRkeyBit === 0; - (1 - setSiblingRkey) * setSiblingRkey === 0; - (1 - setSiblingValueHash) * setSiblingValueHash === 0; - (1 - setValueHigh) * setValueHigh === 0; - (1 - setValueLow) * setValueLow === 0; - (1 - jmpnz) * jmpnz === 0; - (1 - inFree) * inFree === 0; - (1 - inNewRoot) * inNewRoot === 0; - (1 - inOldRoot) * inOldRoot === 0; - (1 - inRkey) * inRkey === 0; - (1 - inRkeyBit) * inRkeyBit === 0; - (1 - inSiblingValueHash) * inSiblingValueHash === 0; - (1 - inValueLow) * inValueLow === 0; - (1 - inValueHigh) * inValueHigh === 0; - (1 - inRotlVh) * inRotlVh === 0; - (1 - inLevel) * inLevel === 0; - - lookup_assumes(STORAGE_ROM_ID, 1, [operation, const0, jmpAddress, pc, inSiblingRkey]); + const expr storageRomFlags = compact_bin_cols ([ + hash, hashType, latchGet, latchSet, climbRkey, climbSiblingRkey, climbBitN, + jmp, jmpz, jmpnz, setHashLeft, setHashRight, setLevel, setNewRoot, setOldRoot, + setRkey, setRkeyBit, setSiblingRkey, setSiblingValueHash, setValueHigh, setValueLow, + inFree, inNewRoot, inOldRoot, inRkey, inRkeyBit, inSiblingValueHash, + inValueLow, inValueHigh, inRotlVh, inLevel]); + + + lookup_assumes(STORAGE_ROM_ID, 1, [storageRomFlags, const0, jmpAddress, pc, inSiblingRkey]); } \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/storage_rom.json b/test/pil2/zkevm-etrog/storage_rom.json new file mode 100644 index 0000000..9b6b354 --- /dev/null +++ b/test/pil2/zkevm-etrog/storage_rom.json @@ -0,0 +1,3197 @@ +{ + "program": [ + { + "CONST": 0, + "setHASH_LEFT": 1, + "setHASH_RIGHT": 1, + "setOLD_ROOT": 1, + "setNEW_ROOT": 1, + "setVALUE_LOW": 1, + "setVALUE_HIGH": 1, + "setSIBLING_VALUE_HASH": 1, + "setRKEY": 1, + "setSIBLING_RKEY": 1, + "setRKEY_BIT": 1, + "setLEVEL": 1, + "line": 4, + "fileName": "storage_sm.zkasm", + "lineStr": " 0 => HASH_LEFT, HASH_RIGHT, OLD_ROOT, NEW_ROOT, VALUE_LOW, VALUE_HIGH, SIBLING_VALUE_HASH, RKEY, SIBLING_RKEY, RKEY_BIT, LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isValueZero", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueIsZero", + "line": 6, + "jmpAddress": 19, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isValueZero()} :JMPNZ(ValueIsZero)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetValueLow", + "params": [] + }, + "inFREE": 1, + "setVALUE_LOW": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueLowIsNonZero", + "line": 7, + "jmpAddress": 11, + "fileName": "storage_sm.zkasm", + "lineStr": " ${GetValueLow()} => VALUE_LOW,VALUE_HIGH :JMPNZ(ValueLowIsNonZero)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueLowIsNonZero", + "line": 8, + "jmpAddress": 11, + "fileName": "storage_sm.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(ValueLowIsNonZero)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueLowIsNonZero", + "line": 9, + "jmpAddress": 11, + "fileName": "storage_sm.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(ValueLowIsNonZero)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueLowIsNonZero", + "line": 10, + "jmpAddress": 11, + "fileName": "storage_sm.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(ValueLowIsNonZero)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetValueHigh", + "params": [] + }, + "inFREE": 1, + "setVALUE_HIGH": 1, + "setNEW_ROOT": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueHighIsNonZero", + "line": 13, + "jmpAddress": 12, + "fileName": "storage_sm.zkasm", + "lineStr": " ${GetValueHigh()} => VALUE_HIGH,NEW_ROOT :JMPNZ(ValueHighIsNonZero)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueHighIsNonZero", + "line": 14, + "jmpAddress": 12, + "fileName": "storage_sm.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(ValueHighIsNonZero)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueHighIsNonZero", + "line": 15, + "jmpAddress": 12, + "fileName": "storage_sm.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(ValueHighIsNonZero)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "ValueHighIsNonZero", + "line": 16, + "jmpAddress": 12, + "fileName": "storage_sm.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(ValueHighIsNonZero)" + }, + { + "jmp": 1, + "jmpAddressLabel": "AssertFails", + "line": 17, + "jmpAddress": 285, + "fileName": "storage_sm.zkasm", + "lineStr": " :JMP(AssertFails)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetValueHigh", + "params": [] + }, + "inFREE": 1, + "setVALUE_HIGH": 1, + "jmp": 1, + "jmpAddressLabel": "ValueIsNonZero", + "line": 20, + "jmpAddress": 14, + "fileName": "storage_sm.zkasm", + "lineStr": " ${GetValueHigh()} => VALUE_HIGH :JMP(ValueIsNonZero)" + }, + { + "inNEW_ROOT": 1, + "setVALUE_HIGH": 1, + "line": 24, + "fileName": "storage_sm.zkasm", + "lineStr": " NEW_ROOT => VALUE_HIGH" + }, + { + "CONST": 0, + "setNEW_ROOT": 1, + "line": 25, + "fileName": "storage_sm.zkasm", + "lineStr": " 0 => NEW_ROOT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isGet", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Get_NonZero", + "line": 29, + "jmpAddress": 43, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isGet()} :JMPNZ(Get_NonZero)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isSetUpdate", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Set_Update", + "line": 30, + "jmpAddress": 60, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isSetUpdate()} :JMPNZ(Set_Update)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isSetInsertFound", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Set_InsertFound", + "line": 31, + "jmpAddress": 88, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isSetInsertFound()} :JMPNZ(Set_InsertFound)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isSetInsertNotFound", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Set_InsertNotFound", + "line": 32, + "jmpAddress": 146, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isSetInsertNotFound()} :JMPNZ(Set_InsertNotFound)" + }, + { + "jmp": 1, + "jmpAddressLabel": "SetAllToZero", + "line": 33, + "jmpAddress": 282, + "fileName": "storage_sm.zkasm", + "lineStr": " :JMP(SetAllToZero)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isGet", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Get_Zero", + "line": 50, + "jmpAddress": 24, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isGet()} :JMPNZ(Get_Zero)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isSetDeleteFound", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Set_DeleteFound", + "line": 51, + "jmpAddress": 169, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isSetDeleteFound()} :JMPNZ(Set_DeleteFound)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isSetDeleteNotFound", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Set_DeleteNotFound", + "line": 52, + "jmpAddress": 240, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isSetDeleteNotFound()} :JMPNZ(Set_DeleteNotFound)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isSetZeroToZero", + "params": [] + }, + "inFREE": 1, + "jmpnz": 1, + "jmpAddressLabel": "Set_ZeroToZero", + "line": 53, + "jmpAddress": 279, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isSetZeroToZero()} :JMPNZ(Set_ZeroToZero)" + }, + { + "jmp": 1, + "jmpAddressLabel": "SetAllToZero", + "line": 54, + "jmpAddress": 282, + "fileName": "storage_sm.zkasm", + "lineStr": " :JMP(SetAllToZero)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "line": 22, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ${GetRkey()} => RKEY" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetIsOld0", + "params": [] + }, + "inFREE": 1, + "jmpz": 1, + "jmpAddressLabel": "GZ_LeafNode", + "line": 24, + "jmpAddress": 27, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ${GetIsOld0()} :JMPZ(GZ_LeafNode)" + }, + { + "jmp": 1, + "jmpAddressLabel": "GZ_IntermediateNode", + "line": 25, + "jmpAddress": 41, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " :JMP(GZ_IntermediateNode)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingValueLow", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 33, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ${GetSiblingValueLow()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingValueHigh", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 34, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ${GetSiblingValueHigh()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 35, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingRkey", + "params": [] + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "line": 37, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ${GetSiblingRkey()} => SIBLING_RKEY" + }, + { + "inVALUE_HIGH": 1, + "setSIBLING_VALUE_HASH": 1, + "line": 40, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " VALUE_HIGH => SIBLING_VALUE_HASH" + }, + { + "inRKEY": 1, + "inSIBLING_RKEY": -1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "GZ_SiblingRKey_RKey_differents", + "line": 46, + "jmpAddress": 37, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " RKEY - SIBLING_RKEY => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "GZ_SiblingRKey_RKey_differents", + "line": 47, + "jmpAddress": 37, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "GZ_SiblingRKey_RKey_differents", + "line": 48, + "jmpAddress": 37, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents)" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "GZ_SiblingRKey_RKey_differents", + "line": 49, + "jmpAddress": 37, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents)" + }, + { + "jmp": 1, + "jmpAddressLabel": "AssertFails", + "line": 52, + "jmpAddress": 285, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " :JMP(AssertFails)" + }, + { + "inSIBLING_VALUE_HASH": 1, + "setVALUE_HIGH": 1, + "line": 57, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " SIBLING_VALUE_HASH => VALUE_HIGH" + }, + { + "inSIBLING_RKEY": 1, + "setHASH_LEFT": 1, + "line": 62, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " SIBLING_RKEY => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 63, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "jmp": 1, + "jmpAddressLabel": "GZ_InitLevel", + "line": 64, + "jmpAddress": 42, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " :JMP(GZ_InitLevel)" + }, + { + "CONST": 0, + "setOLD_ROOT": 1, + "line": 69, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " 0x0 => OLD_ROOT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "jmp": 1, + "jmpAddressLabel": "Get_ClimbUp", + "line": 74, + "jmpAddress": 49, + "fileName": "storage_sm_get_zero.zkasm", + "lineStr": " ${GetLevel()} => LEVEL :JMP(Get_ClimbUp)" + }, + { + "inVALUE_LOW": 1, + "setHASH_LEFT": 1, + "line": 17, + "fileName": "storage_sm_get_non_zero.zkasm", + "lineStr": " VALUE_LOW => HASH_LEFT" + }, + { + "inVALUE_HIGH": 1, + "setHASH_RIGHT": 1, + "line": 18, + "fileName": "storage_sm_get_non_zero.zkasm", + "lineStr": " VALUE_HIGH => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 19, + "fileName": "storage_sm_get_non_zero.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "setHASH_LEFT": 1, + "line": 22, + "fileName": "storage_sm_get_non_zero.zkasm", + "lineStr": " ${GetRkey()} => RKEY, HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 23, + "fileName": "storage_sm_get_non_zero.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "jmp": 1, + "jmpAddressLabel": "Get_ClimbUp", + "line": 26, + "jmpAddress": 49, + "fileName": "storage_sm_get_non_zero.zkasm", + "lineStr": " ${GetLevel()} => LEVEL :JMP(Get_ClimbUp)" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "GCU_Latch", + "line": 10, + "jmpAddress": 58, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " LEVEL :JMPZ(GCU_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 11, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "GCU_SiblingIsRight", + "line": 14, + "jmpAddress": 54, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(GCU_SiblingIsRight)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 19, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "jmp": 1, + "jmpAddressLabel": "GCU_HashAndClimbUp", + "line": 20, + "jmpAddress": 56, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT :JMP(GCU_HashAndClimbUp)" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 25, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 26, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 30, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "Get_ClimbUp", + "line": 33, + "jmpAddress": 49, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(Get_ClimbUp)" + }, + { + "inNEW_ROOT": 1, + "CONST": -1, + "jmpz": 1, + "jmpAddressLabel": "Set_ZeroToZero_GetZero_Return", + "line": 43, + "jmpAddress": 280, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " NEW_ROOT - 1 :JMPZ(Set_ZeroToZero_GetZero_Return)" + }, + { + "latchGet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 46, + "jmpAddress": 0, + "fileName": "storage_sm_get_climb_up.zkasm", + "lineStr": " :LATCH_GET, JMP(Run)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "line": 17, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetRkey()} => RKEY" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetOldValueLow", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 21, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetOldValueLow()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetOldValueHigh", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 22, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetOldValueHigh()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 23, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "inRKEY": 1, + "setHASH_LEFT": 1, + "line": 26, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " RKEY => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 27, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "inVALUE_LOW": 1, + "setHASH_LEFT": 1, + "line": 32, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " VALUE_LOW => HASH_LEFT" + }, + { + "inVALUE_HIGH": 1, + "setHASH_RIGHT": 1, + "line": 33, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " VALUE_HIGH => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 34, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "inRKEY": 1, + "setHASH_LEFT": 1, + "line": 37, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " RKEY => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 38, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => NEW_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "line": 43, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetLevel()} => LEVEL" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SU_Latch", + "line": 48, + "jmpAddress": 87, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " LEVEL :JMPZ(SU_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 49, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SU_SiblingIsRight", + "line": 52, + "jmpAddress": 81, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SU_SiblingIsRight)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 57, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 58, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 59, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 62, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT ; Sibling hash is already in HASH_LEFT, since previous hash" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 63, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SU_ClimbTree", + "line": 66, + "jmpAddress": 72, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SU_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 71, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 72, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 73, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 76, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT ; Sibling hash is already in HASH_RIGHT, since previous hash" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 77, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SU_ClimbTree", + "line": 80, + "jmpAddress": 72, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SU_ClimbTree)" + }, + { + "latchSet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 86, + "jmpAddress": 0, + "fileName": "storage_sm_set_update.zkasm", + "lineStr": " :LATCH_SET, JMP(Run)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingValueLow", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 26, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetSiblingValueLow()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingValueHigh", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 27, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetSiblingValueHigh()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_VALUE_HASH": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 28, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_VALUE_HASH, HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingRkey", + "params": [] + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "line": 31, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetSiblingRkey()} => SIBLING_RKEY" + }, + { + "inSIBLING_RKEY": 1, + "setHASH_LEFT": 1, + "line": 32, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " SIBLING_RKEY => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 33, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "inVALUE_LOW": 1, + "setHASH_LEFT": 1, + "line": 36, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " VALUE_LOW => HASH_LEFT" + }, + { + "inVALUE_HIGH": 1, + "setHASH_RIGHT": 1, + "line": 37, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " VALUE_HIGH => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 38, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "setHASH_LEFT": 1, + "line": 41, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetRkey()} => RKEY, HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 42, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "line": 47, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetLevel()} => LEVEL" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 53, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SIF_SiblingIsRight1", + "line": 56, + "jmpAddress": 107, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SIF_SiblingIsRight1) ; If next key bit is zero, then sibling is right (sibling's next key bit is 1)" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 61, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 62, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 63, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 66, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 1, + "jmp": 1, + "jmpAddressLabel": "SIF_ClimbBranch", + "line": 67, + "jmpAddress": 112, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N, JMP(SIF_ClimbBranch)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 72, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 73, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 74, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 77, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 1, + "line": 78, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetTopOfBranch", + "params": [] + }, + "inFREE": 1, + "jmpz": 1, + "jmpAddressLabel": "SIF_StartOldRoot", + "line": 82, + "jmpAddress": 125, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetTopOfBranch()} :JMPZ(SIF_StartOldRoot) ; If we are at the top of the branch, then go to SIF_StartOldRoot" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 84, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SIF_SiblingIsRight2", + "line": 87, + "jmpAddress": 120, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SIF_SiblingIsRight2)" + }, + { + "CONST": 0, + "setHASH_LEFT": 1, + "line": 92, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " 0x0 => HASH_LEFT" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 93, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 94, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 97, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SIF_ClimbBranch", + "line": 98, + "jmpAddress": 112, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbBranch)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 103, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "CONST": 0, + "setHASH_RIGHT": 1, + "line": 104, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " 0x0 => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 105, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 108, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SIF_ClimbBranch", + "line": 109, + "jmpAddress": 112, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbBranch)" + }, + { + "inSIBLING_RKEY": 1, + "setHASH_LEFT": 1, + "line": 113, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " SIBLING_RKEY => HASH_LEFT" + }, + { + "inSIBLING_VALUE_HASH": 1, + "setHASH_RIGHT": 1, + "line": 114, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " SIBLING_VALUE_HASH => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 115, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SIF_Latch", + "line": 120, + "jmpAddress": 145, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " LEVEL :JMPZ(SIF_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 121, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SIF_SiblingIsRight3", + "line": 124, + "jmpAddress": 138, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SIF_SiblingIsRight3)" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 129, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 130, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 131, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 134, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 135, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 138, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SIF_ClimbTree", + "line": 139, + "jmpAddress": 128, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 144, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 145, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 146, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 149, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 150, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 153, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SIF_ClimbTree", + "line": 154, + "jmpAddress": 128, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbTree)" + }, + { + "latchSet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 160, + "jmpAddress": 0, + "fileName": "storage_sm_set_insert_found.zkasm", + "lineStr": " :LATCH_SET, JMP(Run)" + }, + { + "inVALUE_LOW": 1, + "setHASH_LEFT": 1, + "line": 19, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " VALUE_LOW => HASH_LEFT" + }, + { + "inVALUE_HIGH": 1, + "setHASH_RIGHT": 1, + "line": 20, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " VALUE_HIGH => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 22, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "setHASH_LEFT": 1, + "line": 25, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " ${GetRkey()} => RKEY, HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 26, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "line": 31, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " ${GetLevel()} => LEVEL" + }, + { + "CONST": 0, + "setOLD_ROOT": 1, + "line": 37, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " 0x0 => OLD_ROOT" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SINF_Latch", + "line": 42, + "jmpAddress": 168, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " LEVEL :JMPZ(SINF_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 43, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SINF_SiblingIsRight3", + "line": 46, + "jmpAddress": 162, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SINF_SiblingIsRight3)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 51, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 52, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 54, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 57, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 58, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SINF_ClimbTree", + "line": 61, + "jmpAddress": 153, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SINF_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 66, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 67, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 68, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 71, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 72, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SINF_ClimbTree", + "line": 75, + "jmpAddress": 153, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SINF_ClimbTree)" + }, + { + "latchSet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 81, + "jmpAddress": 0, + "fileName": "storage_sm_set_insert_not_found.zkasm", + "lineStr": " :LATCH_SET, JMP(Run)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetOldValueLow", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 22, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetOldValueLow()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetOldValueHigh", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 23, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetOldValueHigh()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 24, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "setHASH_LEFT": 1, + "line": 27, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetRkey()} => RKEY, HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 28, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingValueLow", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 32, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetSiblingValueLow()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingValueHigh", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 33, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetSiblingValueHigh()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_VALUE_HASH": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 34, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => SIBLING_VALUE_HASH, HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingRkey", + "params": [] + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "setHASH_LEFT": 1, + "line": 37, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetSiblingRkey()} => SIBLING_RKEY, HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 38, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "line": 49, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetLevel()} => LEVEL" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 56, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_SiblingIsRight1", + "line": 59, + "jmpAddress": 187, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight1)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 64, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 65, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 66, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 68, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 1, + "jmp": 1, + "jmpAddressLabel": "SDF_ClimbBranch", + "line": 72, + "jmpAddress": 192, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N, JMP(SDF_ClimbBranch)" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 77, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 78, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 79, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 82, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 1, + "line": 86, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetTopOfBranch", + "params": [] + }, + "inFREE": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_StartNewRoot", + "line": 94, + "jmpAddress": 202, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetTopOfBranch()} :JMPZ(SDF_StartNewRoot)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 96, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_SiblingIsRight2", + "line": 99, + "jmpAddress": 197, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight2)" + }, + { + "CONST": 0, + "setHASH_LEFT": 1, + "line": 108, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " 0x0 => HASH_LEFT" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "jmp": 1, + "jmpAddressLabel": "SDF_SiblingClimbKey2", + "line": 109, + "jmpAddress": 199, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT :JMP(SDF_SiblingClimbKey2)" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 114, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "CONST": 0, + "setHASH_RIGHT": 1, + "line": 115, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " 0x0 => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 118, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 120, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setSIBLING_RKEY": 1, + "climbRkey": 0, + "climbSiblingRkey": 1, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDF_ClimbBranch", + "line": 121, + "jmpAddress": 192, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SDF_ClimbBranch)" + }, + { + "inSIBLING_RKEY": 1, + "setHASH_LEFT": 1, + "line": 128, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " SIBLING_RKEY => HASH_LEFT" + }, + { + "inSIBLING_VALUE_HASH": 1, + "setHASH_RIGHT": 1, + "line": 129, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " SIBLING_VALUE_HASH => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 130, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH1" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_Latch", + "line": 136, + "jmpAddress": 239, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " LEVEL :JMPZ(SDF_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 138, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "setHASH_RIGHT": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "SDF_SiblingHashIsNotZero", + "line": 142, + "jmpAddress": 212, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT, HASH_RIGHT, VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ;VH[0]" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "SDF_SiblingHashIsNotZero", + "line": 143, + "jmpAddress": 212, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ; VH[3]" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "SDF_SiblingHashIsNotZero", + "line": 144, + "jmpAddress": 212, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ; VH[2]" + }, + { + "inROTL_VH": 1, + "setVALUE_HIGH": 1, + "jmpnz": 1, + "jmpAddressLabel": "SDF_SiblingHashIsNotZero", + "line": 145, + "jmpAddress": 212, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ROTL_VH => VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ; VH[1]" + }, + { + "jmp": 1, + "jmpAddressLabel": "AssertFails", + "line": 147, + "jmpAddress": 285, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " :JMP(AssertFails)" + }, + { + "CONST": 0, + "setVALUE_HIGH": 1, + "line": 150, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " 0 => VALUE_HIGH" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_SiblingIsRight3", + "line": 154, + "jmpAddress": 219, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight3)" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 164, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 165, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 168, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 169, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDF_ClimbTree", + "line": 172, + "jmpAddress": 224, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDF_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 178, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 179, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 182, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 183, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "line": 186, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_Latch", + "line": 194, + "jmpAddress": 239, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " LEVEL :JMPZ(SDF_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 195, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SDF_SiblingIsRight4", + "line": 198, + "jmpAddress": 233, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight4)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 203, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 204, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 205, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 208, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 209, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDF_ClimbTree", + "line": 212, + "jmpAddress": 224, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDF_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 217, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 218, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 219, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 222, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 223, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDF_ClimbTree", + "line": 226, + "jmpAddress": 224, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDF_ClimbTree)" + }, + { + "latchSet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 232, + "jmpAddress": 0, + "fileName": "storage_sm_set_delete_found.zkasm", + "lineStr": " :LATCH_SET, JMP(Run)" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetOldValueLow", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 20, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetOldValueLow()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetOldValueHigh", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 21, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetOldValueHigh()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 22, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetRkey", + "params": [] + }, + "inFREE": 1, + "setRKEY": 1, + "setHASH_LEFT": 1, + "line": 25, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetRkey()} => RKEY, HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 1, + "line": 26, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH1" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetLevel", + "params": [] + }, + "inFREE": 1, + "setLEVEL": 1, + "line": 31, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetLevel()} => LEVEL" + }, + { + "CONST": 0, + "setNEW_ROOT": 1, + "setVALUE_LOW": 1, + "setVALUE_HIGH": 1, + "line": 36, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " 0x0 => NEW_ROOT, VALUE_LOW, VALUE_HIGH" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SDNF_Latch", + "line": 39, + "jmpAddress": 278, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " LEVEL :JMPZ(SDNF_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 40, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingLeftChildHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 45, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetSiblingLeftChildHash()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingRightChildHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 46, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetSiblingRightChildHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "setHASH_RIGHT": 1, + "hash": 1, + "hashType": 0, + "line": 47, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => HASH_LEFT, HASH_RIGHT :HASH0" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SDNF_SiblingIsRight3", + "line": 49, + "jmpAddress": 258, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDNF_SiblingIsRight3)" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 54, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 57, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 60, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 61, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDNF_ClimbTree", + "line": 64, + "jmpAddress": 263, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 70, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 71, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 74, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 75, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDNF_ClimbTree", + "line": 78, + "jmpAddress": 263, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree)" + }, + { + "inLEVEL": 1, + "jmpz": 1, + "jmpAddressLabel": "SDNF_Latch", + "line": 83, + "jmpAddress": 278, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " LEVEL :JMPZ(SDNF_Latch)" + }, + { + "inLEVEL": 1, + "CONST": -1, + "setLEVEL": 1, + "line": 84, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " LEVEL - 1 => LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetNextKeyBit", + "params": [] + }, + "inFREE": 1, + "setRKEY_BIT": 1, + "jmpz": 1, + "jmpAddressLabel": "SDNF_SiblingIsRight4", + "line": 86, + "jmpAddress": 272, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDNF_SiblingIsRight4)" + }, + { + "inNEW_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 91, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " NEW_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_LEFT": 1, + "line": 92, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 93, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_RIGHT": 1, + "line": 96, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " OLD_ROOT => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 97, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDNF_ClimbTree", + "line": 100, + "jmpAddress": 263, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree)" + }, + { + "inNEW_ROOT": 1, + "setHASH_LEFT": 1, + "line": 105, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " NEW_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "GetSiblingHash", + "params": [] + }, + "inFREE": 1, + "setHASH_RIGHT": 1, + "line": 106, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " ${GetSiblingHash()} => HASH_RIGHT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setNEW_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 107, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => NEW_ROOT :HASH0" + }, + { + "inOLD_ROOT": 1, + "setHASH_LEFT": 1, + "line": 110, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " OLD_ROOT => HASH_LEFT" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setOLD_ROOT": 1, + "hash": 1, + "hashType": 0, + "line": 111, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => OLD_ROOT :HASH0" + }, + { + "freeInTag": { + "op": "" + }, + "inFREE": 1, + "setRKEY": 1, + "climbRkey": 1, + "climbSiblingRkey": 0, + "climbBitN": 0, + "jmp": 1, + "jmpAddressLabel": "SDNF_ClimbTree", + "line": 114, + "jmpAddress": 263, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree)" + }, + { + "latchSet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 120, + "jmpAddress": 0, + "fileName": "storage_sm_set_delete_not_found.zkasm", + "lineStr": " :LATCH_SET, JMP(Run)" + }, + { + "CONST": 1, + "setNEW_ROOT": 1, + "jmp": 1, + "jmpAddressLabel": "Get_Zero", + "line": 6, + "jmpAddress": 24, + "fileName": "storage_sm_set_zero_to_zero.zkasm", + "lineStr": " 1 => NEW_ROOT :JMP(Get_Zero)" + }, + { + "inOLD_ROOT": 1, + "setNEW_ROOT": 1, + "line": 10, + "fileName": "storage_sm_set_zero_to_zero.zkasm", + "lineStr": " OLD_ROOT => NEW_ROOT" + }, + { + "latchSet": 1, + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 14, + "jmpAddress": 0, + "fileName": "storage_sm_set_zero_to_zero.zkasm", + "lineStr": " :LATCH_SET, JMP(Run)" + }, + { + "CONST": 0, + "setHASH_LEFT": 1, + "setHASH_RIGHT": 1, + "setOLD_ROOT": 1, + "setNEW_ROOT": 1, + "setVALUE_LOW": 1, + "setVALUE_HIGH": 1, + "setSIBLING_VALUE_HASH": 1, + "setRKEY": 1, + "setSIBLING_RKEY": 1, + "setRKEY_BIT": 1, + "setLEVEL": 1, + "line": 68, + "fileName": "storage_sm.zkasm", + "lineStr": " 0 => HASH_LEFT, HASH_RIGHT, OLD_ROOT, NEW_ROOT, VALUE_LOW, VALUE_HIGH, SIBLING_VALUE_HASH, RKEY, SIBLING_RKEY, RKEY_BIT, LEVEL" + }, + { + "freeInTag": { + "op": "functionCall", + "funcName": "isAlmostEndPolynomial", + "params": [] + }, + "inFREE": 1, + "jmpz": 1, + "jmpAddressLabel": "NotEndPol", + "line": 72, + "jmpAddress": 283, + "fileName": "storage_sm.zkasm", + "lineStr": " ${isAlmostEndPolynomial()} :JMPZ(NotEndPol)" + }, + { + "jmp": 1, + "jmpAddressLabel": "Run", + "line": 75, + "jmpAddress": 0, + "fileName": "storage_sm.zkasm", + "lineStr": " :JMP(Run)" + }, + { + "jmp": 1, + "jmpAddressLabel": "AssertFails", + "line": 79, + "jmpAddress": 285, + "fileName": "storage_sm.zkasm", + "lineStr": " :JMP(AssertFails)" + } + ], + "labels": { + "Run": 0, + "ValueLowIsNonZero": 11, + "ValueHighIsNonZero": 12, + "ValueIsNonZero": 14, + "ValueIsZero": 19, + "Get_Zero": 24, + "GZ_Zero": 24, + "GZ_LeafNode": 27, + "GZ_SiblingRKey_RKey_differents": 37, + "GZ_IntermediateNode": 41, + "GZ_InitLevel": 42, + "Get_NonZero": 43, + "Get_ClimbUp": 49, + "GCU_SiblingIsLeft": 52, + "GCU_SiblingIsRight": 54, + "GCU_HashAndClimbUp": 56, + "GCU_Latch": 58, + "Set_Update": 60, + "SU_InitLevel": 71, + "SU_ClimbTree": 72, + "SU_SiblingIsLeft": 75, + "SU_SiblingIsRight": 81, + "SU_Latch": 87, + "Set_InsertFound": 88, + "SIF_InitLevel": 99, + "SIF_FirstIntermediateNode": 100, + "SIF_SiblingIsLeft1": 102, + "SIF_SiblingIsRight1": 107, + "SIF_ClimbBranch": 112, + "SIF_SiblingIsLeft2": 115, + "SIF_SiblingIsRight2": 120, + "SIF_StartOldRoot": 125, + "SIF_ClimbTree": 128, + "SIF_SiblingIsLeft3": 131, + "SIF_SiblingIsRight3": 138, + "SIF_Latch": 145, + "Set_InsertNotFound": 146, + "SINF_InitLevel": 151, + "SINF_StartOldRoot": 152, + "SINF_ClimbTree": 153, + "SINF_SiblingIsLeft3": 156, + "SINF_SiblingIsRight3": 162, + "SINF_Latch": 168, + "Set_DeleteFound": 169, + "SDF_InitLevel": 179, + "SDF_FirstIntermediateNode": 180, + "SDF_SiblingIsLeft1": 182, + "SDF_SiblingIsRight1": 187, + "SDF_ClimbBranch": 192, + "SDF_SiblingIsLeft2": 195, + "SDF_SiblingIsRight2": 197, + "SDF_SiblingClimbKey2": 199, + "SDF_StartNewRoot": 202, + "SDF_SiblingHashIsNotZero": 212, + "SDF_SiblingIsLeft3": 214, + "SDF_SiblingIsRight3": 219, + "SDF_ClimbTree": 224, + "SDF_SiblingIsLeft4": 227, + "SDF_SiblingIsRight4": 233, + "SDF_Latch": 239, + "Set_DeleteNotFound": 240, + "SDNF_InitLevel": 245, + "SDNF_SiblingIsLeft3": 253, + "SDNF_SiblingIsRight3": 258, + "SDNF_ClimbTree": 263, + "SDNF_SiblingIsLeft4": 266, + "SDNF_SiblingIsRight4": 272, + "SDNF_Latch": 278, + "Set_ZeroToZero": 279, + "Set_ZeroToZero_GetZero_Return": 280, + "SetAllToZero": 282, + "NotEndPol": 283, + "AssertFails": 285 + } +} diff --git a/test/pil2/zkevm-etrog/storage_rom.pil b/test/pil2/zkevm-etrog/storage_rom.pil index fc87249..0d5811d 100644 --- a/test/pil2/zkevm-etrog/storage_rom.pil +++ b/test/pil2/zkevm-etrog/storage_rom.pil @@ -1,13 +1,57 @@ +include "tools.pil" const int STORAGE_ROM_ID = 10; subproof StorageRom(2**16) { - col fixed OPERATION; + col fixed ROM_FLAGS; col fixed CONST0; col fixed JMP_ADDRESS; col fixed LINE; col fixed IN_SIBLING_RKEY; + + include "storage_rom_compiled.pil"; - lookup_proves(STORAGE_ROM_ID, 1, [OPERATION, CONST0, JMP_ADDRESS, LINE, IN_SIBLING_RKEY]); + fillWithLastSourceLine(); + lookup_proves(STORAGE_ROM_ID, 1, [LINE, ROM_FLAGS, CONST0, JMP_ADDRESS, IN_SIBLING_RKEY]); } +private function source(int line, int flags, int const0, int jmpAddress, int inSiblingRkey) { + container air.source { + int lastLine; + } + air.source.lastLine = line; + air.LINE[line] = line; + air.ROM_FLAGS[line] = flags; + air.CONST0[line] = const0; + air.JMP_ADDRESS[line] = jmpAddress; + air.IN_SIBLING_RKEY[line] = inSiblingRkey; +} + +private function fillWithLastSourceLine() { + int rline = air.source.lastLine; + int line = rline + 1; + // #pragma debugger + /* while (line < N) { + air.LINE[line] = air.LINE[rline]; + air.ROM_FLAGS[line] = air.ROM_FLAGS[rline]; + air.CONST0[line] = air.CONST0[rline]; + air.JMP_ADDRESS[line] = air.JMP_ADDRESS[rline]; + air.IN_SIBLING_RKEY[line] = air.IN_SIBLING_RKEY[rline]; + line = line + 1; + }*/ + const int _LINE = air.LINE[rline]; + const int _ROM_FLAGS = air.ROM_FLAGS[rline]; + const int _CONST0 = air.CONST0[rline]; + const int _JMP_ADDRESS = air.JMP_ADDRESS[rline]; + const int _IN_SIBLING_RKEY = air.IN_SIBLING_RKEY[rline]; + #pragma timer t1 start + while (line < N) { + air.LINE[line] = _LINE; + air.ROM_FLAGS[line] = _ROM_FLAGS; + air.CONST0[line] = _CONST0; + air.JMP_ADDRESS[line] = _JMP_ADDRESS; + air.IN_SIBLING_RKEY[line] = _IN_SIBLING_RKEY; + line = line + 1; + } + #pragma timer t1 end +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/storage_rom_compiled.pil b/test/pil2/zkevm-etrog/storage_rom_compiled.pil new file mode 100644 index 0000000..4aa78d7 --- /dev/null +++ b/test/pil2/zkevm-etrog/storage_rom_compiled.pil @@ -0,0 +1,317 @@ + source( 0,0x001FFC00, 0,0,0); // #4 0 => HASH_LEFT, HASH_RIGHT, OLD_ROOT, NEW_ROOT, VALUE_LOW, VALUE_HIGH, SIBLING_VALUE_HASH, RKEY, SIBLING_RKEY, RKEY_BIT, LEVEL # flags = setHASH_LEFT, setHASH_RIGHT, setLEVEL, setNEW_ROOT, setOLD_ROOT, setRKEY, setRKEY_BIT, setSIBLING_RKEY, setSIBLING_VALUE_HASH, setVALUE_HIGH, setVALUE_LOW + source( 1,0x00200200, 0,0,0); // #6 ${isValueZero()} :JMPNZ(ValueIsZero) # flags = jmpnz, inFREE + source( 2,0x00380200, 0,0,0); // #7 ${GetValueLow()} => VALUE_LOW,VALUE_HIGH :JMPNZ(ValueLowIsNonZero) # flags = jmpnz, setVALUE_HIGH, setVALUE_LOW, inFREE + source( 3,0x20080200, 0,0,0); // #8 ROTL_VH => VALUE_HIGH :JMPNZ(ValueLowIsNonZero) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 4,0x20080200, 0,0,0); // #9 ROTL_VH => VALUE_HIGH :JMPNZ(ValueLowIsNonZero) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 5,0x20080200, 0,0,0); // #10 ROTL_VH => VALUE_HIGH :JMPNZ(ValueLowIsNonZero) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 6,0x00282200, 0,0,0); // #13 ${GetValueHigh()} => VALUE_HIGH,NEW_ROOT :JMPNZ(ValueHighIsNonZero) # flags = jmpnz, setNEW_ROOT, setVALUE_HIGH, inFREE + source( 7,0x20080200, 0,0,0); // #14 ROTL_VH => VALUE_HIGH :JMPNZ(ValueHighIsNonZero) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 8,0x20080200, 0,0,0); // #15 ROTL_VH => VALUE_HIGH :JMPNZ(ValueHighIsNonZero) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 9,0x20080200, 0,0,0); // #16 ROTL_VH => VALUE_HIGH :JMPNZ(ValueHighIsNonZero) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 10,0x00000080, 0,0,0); // #17 :JMP(AssertFails) # flags = jmp + source( 11,0x00280080, 0,0,0); // #20 ${GetValueHigh()} => VALUE_HIGH :JMP(ValueIsNonZero) # flags = jmp, setVALUE_HIGH, inFREE + source( 12,0x00480000, 0,0,0); // #24 NEW_ROOT => VALUE_HIGH # flags = setVALUE_HIGH, inNEW_ROOT + source( 13,0x00002000, 0,0,0); // #25 0 => NEW_ROOT # flags = setNEW_ROOT + source( 14,0x00200200, 0,0,0); // #29 ${isGet()} :JMPNZ(Get_NonZero) # flags = jmpnz, inFREE + source( 15,0x00200200, 0,0,0); // #30 ${isSetUpdate()} :JMPNZ(Set_Update) # flags = jmpnz, inFREE + source( 16,0x00200200, 0,0,0); // #31 ${isSetInsertFound()} :JMPNZ(Set_InsertFound) # flags = jmpnz, inFREE + source( 17,0x00200200, 0,0,0); // #32 ${isSetInsertNotFound()} :JMPNZ(Set_InsertNotFound) # flags = jmpnz, inFREE + source( 18,0x00000080, 0,0,0); // #33 :JMP(SetAllToZero) # flags = jmp + source( 19,0x00200200, 0,0,0); // #50 ${isGet()} :JMPNZ(Get_Zero) # flags = jmpnz, inFREE + source( 20,0x00200200, 0,0,0); // #51 ${isSetDeleteFound()} :JMPNZ(Set_DeleteFound) # flags = jmpnz, inFREE + source( 21,0x00200200, 0,0,0); // #52 ${isSetDeleteNotFound()} :JMPNZ(Set_DeleteNotFound) # flags = jmpnz, inFREE + source( 22,0x00200200, 0,0,0); // #53 ${isSetZeroToZero()} :JMPNZ(Set_ZeroToZero) # flags = jmpnz, inFREE + source( 23,0x00000080, 0,0,0); // #54 :JMP(SetAllToZero) # flags = jmp + + // storage_sm_get_zero.zkasm + + source( 24,0x00208000, 0,0,0); // #22 ${GetRkey()} => RKEY # flags = setRKEY, inFREE + source( 25,0x00200100, 0,0,0); // #24 ${GetIsOld0()} :JMPZ(GZ_LeafNode) # flags = jmpz, inFREE + source( 26,0x00000080, 0,0,0); // #25 :JMP(GZ_IntermediateNode) # flags = jmp + source( 27,0x00200400, 0,0,0); // #33 ${GetSiblingValueLow()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source( 28,0x00200800, 0,0,0); // #34 ${GetSiblingValueHigh()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source( 29,0x00200801, 0,0,0); // #35 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source( 30,0x00220000, 0,0,0); // #37 ${GetSiblingRkey()} => SIBLING_RKEY # flags = setSIBLING_RKEY, inFREE + source( 31,0x10040000, 0,0,0); // #40 VALUE_HIGH => SIBLING_VALUE_HASH # flags = setSIBLING_VALUE_HASH, inVALUE_HIGH + source( 32,0x01080200, 0,0,0); // #46 RKEY - SIBLING_RKEY => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents) # flags = jmpnz, setVALUE_HIGH, inRKEY + source( 33,0x20080200, 0,0,0); // #47 ROTL_VH => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 34,0x20080200, 0,0,0); // #48 ROTL_VH => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 35,0x20080200, 0,0,0); // #49 ROTL_VH => VALUE_HIGH :JMPNZ(GZ_SiblingRKey_RKey_differents) # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source( 36,0x00000080, 0,0,0); // #52 :JMP(AssertFails) # flags = jmp + source( 37,0x04080000, 0,0,0); // #57 SIBLING_VALUE_HASH => VALUE_HIGH # flags = setVALUE_HIGH, inSIBLING_VALUE_HASH + source( 38,0x00000400, 0,0,0); // #62 SIBLING_RKEY => HASH_LEFT # flags = setHASH_LEFT + source( 39,0x00204003, 0,0,0); // #63 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source( 40,0x00000080, 0,0,0); // #64 :JMP(GZ_InitLevel) # flags = jmp + source( 41,0x00004000, 0,0,0); // #69 0x0 => OLD_ROOT # flags = setOLD_ROOT + source( 42,0x00201080, 0,0,0); // #74 ${GetLevel()} => LEVEL :JMP(Get_ClimbUp) # flags = jmp, setLEVEL, inFREE + + // storage_sm_get_non_zero.zkasm + + source( 43,0x08000400, 0,0,0); // #17 VALUE_LOW => HASH_LEFT # flags = setHASH_LEFT, inVALUE_LOW + source( 44,0x10000800, 0,0,0); // #18 VALUE_HIGH => HASH_RIGHT # flags = setHASH_RIGHT, inVALUE_HIGH + source( 45,0x00200801, 0,0,0); // #19 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source( 46,0x00208400, 0,0,0); // #22 ${GetRkey()} => RKEY, HASH_LEFT # flags = setHASH_LEFT, setRKEY, inFREE + source( 47,0x00204003, 0,0,0); // #23 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source( 48,0x00201080, 0,0,0); // #26 ${GetLevel()} => LEVEL :JMP(Get_ClimbUp) # flags = jmp, setLEVEL, inFREE + + // storage_sm_get_climb_up.zkasm + + source( 49,0x40000100, 0,0,0); // #10 LEVEL :JMPZ(GCU_Latch) # flags = jmpz, inLEVEL + source( 50,0x40001000,-1,0,0); // #11 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source( 51,0x00210100, 0,0,0); // #14 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(GCU_SiblingIsRight) # flags = jmpz, setRKEY_BIT, inFREE + source( 52,0x00200400, 0,0,0); // #19 ${GetSiblingHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source( 53,0x00800880, 0,0,0); // #20 OLD_ROOT => HASH_RIGHT :JMP(GCU_HashAndClimbUp) # flags = jmp, setHASH_RIGHT, inOLD_ROOT + source( 54,0x00800400, 0,0,0); // #25 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source( 55,0x00200800, 0,0,0); // #26 ${GetSiblingHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source( 56,0x00204001, 0,0,0); // #30 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source( 57,0x00208090, 0,0,0); // #33 $ => RKEY :CLIMB_RKEY, JMP(Get_ClimbUp) # flags = climbRkey, jmp, setRKEY, inFREE + source( 58,0x00400100,-1,0,0); // #43 NEW_ROOT - 1 :JMPZ(Set_ZeroToZero_GetZero_Return) # flags = jmpz, inNEW_ROOT + source( 59,0x00000084, 0,0,0); // #46 :LATCH_GET, JMP(Run) # flags = latchGet, jmp + + // storage_sm_set_update.zkasm + + source( 60,0x00208000, 0,0,0); // #17 ${GetRkey()} => RKEY # flags = setRKEY, inFREE + source( 61,0x00200400, 0,0,0); // #21 ${GetOldValueLow()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source( 62,0x00200800, 0,0,0); // #22 ${GetOldValueHigh()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source( 63,0x00200801, 0,0,0); // #23 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source( 64,0x01000400, 0,0,0); // #26 RKEY => HASH_LEFT # flags = setHASH_LEFT, inRKEY + source( 65,0x00204003, 0,0,0); // #27 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source( 66,0x08000400, 0,0,0); // #32 VALUE_LOW => HASH_LEFT # flags = setHASH_LEFT, inVALUE_LOW + source( 67,0x10000800, 0,0,0); // #33 VALUE_HIGH => HASH_RIGHT # flags = setHASH_RIGHT, inVALUE_HIGH + source( 68,0x00200801, 0,0,0); // #34 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source( 69,0x01000400, 0,0,0); // #37 RKEY => HASH_LEFT # flags = setHASH_LEFT, inRKEY + source( 70,0x00202003, 0,0,0); // #38 $ => NEW_ROOT :HASH1 # flags = hash, hashType, setNEW_ROOT, inFREE + source( 71,0x00201000, 0,0,0); // #43 ${GetLevel()} => LEVEL # flags = setLEVEL, inFREE + source( 72,0x40000100, 0,0,0); // #48 LEVEL :JMPZ(SU_Latch) # flags = jmpz, inLEVEL + source( 73,0x40001000,-1,0,0); // #49 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source( 74,0x00210100, 0,0,0); // #52 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SU_SiblingIsRight) # flags = jmpz, setRKEY_BIT, inFREE + source( 75,0x00200400, 0,0,0); // #57 ${GetSiblingHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source( 76,0x00400800, 0,0,0); // #58 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source( 77,0x00202001, 0,0,0); // #59 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source( 78,0x00800800, 0,0,0); // #62 OLD_ROOT => HASH_RIGHT ; Sibling hash is already in HASH_LEFT, since previous hash # flags = setHASH_RIGHT, inOLD_ROOT + source( 79,0x00204001, 0,0,0); // #63 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source( 80,0x00208090, 0,0,0); // #66 $ => RKEY :CLIMB_RKEY, JMP(SU_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source( 81,0x00400400, 0,0,0); // #71 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source( 82,0x00200800, 0,0,0); // #72 ${GetSiblingHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source( 83,0x00202001, 0,0,0); // #73 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source( 84,0x00800400, 0,0,0); // #76 OLD_ROOT => HASH_LEFT ; Sibling hash is already in HASH_RIGHT, since previous hash # flags = setHASH_LEFT, inOLD_ROOT + source( 85,0x00204001, 0,0,0); // #77 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source( 86,0x00208090, 0,0,0); // #80 $ => RKEY :CLIMB_RKEY, JMP(SU_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source( 87,0x00000088, 0,0,0); // #86 :LATCH_SET, JMP(Run) # flags = latchSet, jmp + + // storage_sm_set_insert_found.zkasm + + source( 88,0x00200400, 0,0,0); // #26 ${GetSiblingValueLow()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source( 89,0x00200800, 0,0,0); // #27 ${GetSiblingValueHigh()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source( 90,0x00240801, 0,0,0); // #28 $ => SIBLING_VALUE_HASH, HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, setSIBLING_VALUE_HASH, inFREE + source( 91,0x00220000, 0,0,0); // #31 ${GetSiblingRkey()} => SIBLING_RKEY # flags = setSIBLING_RKEY, inFREE + source( 92,0x00000400, 0,0,0); // #32 SIBLING_RKEY => HASH_LEFT # flags = setHASH_LEFT + source( 93,0x00204003, 0,0,0); // #33 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source( 94,0x08000400, 0,0,0); // #36 VALUE_LOW => HASH_LEFT # flags = setHASH_LEFT, inVALUE_LOW + source( 95,0x10000800, 0,0,0); // #37 VALUE_HIGH => HASH_RIGHT # flags = setHASH_RIGHT, inVALUE_HIGH + source( 96,0x00200801, 0,0,0); // #38 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source( 97,0x00208400, 0,0,0); // #41 ${GetRkey()} => RKEY, HASH_LEFT # flags = setHASH_LEFT, setRKEY, inFREE + source( 98,0x00202003, 0,0,0); // #42 $ => NEW_ROOT :HASH1 # flags = hash, hashType, setNEW_ROOT, inFREE + source( 99,0x00201000, 0,0,0); // #47 ${GetLevel()} => LEVEL # flags = setLEVEL, inFREE + source(100,0x40001000,-1,0,0); // #53 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(101,0x00210100, 0,0,0); // #56 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SIF_SiblingIsRight1) ; If next key bit is zero, then sibling is right (sibling's next key bit is 1) # flags = jmpz, setRKEY_BIT, inFREE + source(102,0x00800400, 0,0,0); // #61 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(103,0x00400800, 0,0,0); // #62 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(104,0x00202001, 0,0,0); // #63 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(105,0x00208010, 0,0,0); // #66 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(106,0x002200E0, 0,0,0); // #67 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N, JMP(SIF_ClimbBranch) # flags = climbSiblingRkey, climbBitN, jmp, setSIBLING_RKEY, inFREE + source(107,0x00400400, 0,0,0); // #72 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(108,0x00800800, 0,0,0); // #73 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(109,0x00202001, 0,0,0); // #74 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(110,0x00208010, 0,0,0); // #77 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(111,0x00220060, 0,0,0); // #78 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N # flags = climbSiblingRkey, climbBitN, setSIBLING_RKEY, inFREE + source(112,0x00200100, 0,0,0); // #82 ${GetTopOfBranch()} :JMPZ(SIF_StartOldRoot) ; If we are at the top of the branch, then go to SIF_StartOldRoot # flags = jmpz, inFREE + source(113,0x40001000,-1,0,0); // #84 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(114,0x00210100, 0,0,0); // #87 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SIF_SiblingIsRight2) # flags = jmpz, setRKEY_BIT, inFREE + source(115,0x00000400, 0,0,0); // #92 0x0 => HASH_LEFT # flags = setHASH_LEFT + source(116,0x00400800, 0,0,0); // #93 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(117,0x00202001, 0,0,0); // #94 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(118,0x00208010, 0,0,0); // #97 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(119,0x002200A0, 0,0,0); // #98 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbBranch) # flags = climbSiblingRkey, jmp, setSIBLING_RKEY, inFREE + source(120,0x00400400, 0,0,0); // #103 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(121,0x00000800, 0,0,0); // #104 0x0 => HASH_RIGHT # flags = setHASH_RIGHT + source(122,0x00202001, 0,0,0); // #105 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(123,0x00208010, 0,0,0); // #108 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(124,0x002200A0, 0,0,0); // #109 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbBranch) # flags = climbSiblingRkey, jmp, setSIBLING_RKEY, inFREE + source(125,0x00000400, 0,0,0); // #113 SIBLING_RKEY => HASH_LEFT # flags = setHASH_LEFT + source(126,0x04000800, 0,0,0); // #114 SIBLING_VALUE_HASH => HASH_RIGHT # flags = setHASH_RIGHT, inSIBLING_VALUE_HASH + source(127,0x00204003, 0,0,0); // #115 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source(128,0x40000100, 0,0,0); // #120 LEVEL :JMPZ(SIF_Latch) # flags = jmpz, inLEVEL + source(129,0x40001000,-1,0,0); // #121 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(130,0x00210100, 0,0,0); // #124 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SIF_SiblingIsRight3) # flags = jmpz, setRKEY_BIT, inFREE + source(131,0x00400800, 0,0,0); // #129 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(132,0x00200400, 0,0,0); // #130 ${GetSiblingHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(133,0x00202001, 0,0,0); // #131 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(134,0x00800800, 0,0,0); // #134 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(135,0x00204001, 0,0,0); // #135 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(136,0x00208010, 0,0,0); // #138 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(137,0x002200A0, 0,0,0); // #139 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbTree) # flags = climbSiblingRkey, jmp, setSIBLING_RKEY, inFREE + source(138,0x00400400, 0,0,0); // #144 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(139,0x00200800, 0,0,0); // #145 ${GetSiblingHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(140,0x00202001, 0,0,0); // #146 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(141,0x00800400, 0,0,0); // #149 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(142,0x00204001, 0,0,0); // #150 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(143,0x00208010, 0,0,0); // #153 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(144,0x002200A0, 0,0,0); // #154 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SIF_ClimbTree) # flags = climbSiblingRkey, jmp, setSIBLING_RKEY, inFREE + source(145,0x00000088, 0,0,0); // #160 :LATCH_SET, JMP(Run) # flags = latchSet, jmp + + // storage_sm_set_insert_not_found.zkasm + + source(146,0x08000400, 0,0,0); // #19 VALUE_LOW => HASH_LEFT # flags = setHASH_LEFT, inVALUE_LOW + source(147,0x10000800, 0,0,0); // #20 VALUE_HIGH => HASH_RIGHT # flags = setHASH_RIGHT, inVALUE_HIGH + source(148,0x00200801, 0,0,0); // #22 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source(149,0x00208400, 0,0,0); // #25 ${GetRkey()} => RKEY, HASH_LEFT # flags = setHASH_LEFT, setRKEY, inFREE + source(150,0x00202003, 0,0,0); // #26 $ => NEW_ROOT :HASH1 # flags = hash, hashType, setNEW_ROOT, inFREE + source(151,0x00201000, 0,0,0); // #31 ${GetLevel()} => LEVEL # flags = setLEVEL, inFREE + source(152,0x00004000, 0,0,0); // #37 0x0 => OLD_ROOT # flags = setOLD_ROOT + source(153,0x40000100, 0,0,0); // #42 LEVEL :JMPZ(SINF_Latch) # flags = jmpz, inLEVEL + source(154,0x40001000,-1,0,0); // #43 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(155,0x00210100, 0,0,0); // #46 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SINF_SiblingIsRight3) # flags = jmpz, setRKEY_BIT, inFREE + source(156,0x00200400, 0,0,0); // #51 ${GetSiblingHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(157,0x00400800, 0,0,0); // #52 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(158,0x00202001, 0,0,0); // #54 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(159,0x00800800, 0,0,0); // #57 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(160,0x00204001, 0,0,0); // #58 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(161,0x00208090, 0,0,0); // #61 $ => RKEY :CLIMB_RKEY, JMP(SINF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(162,0x00400400, 0,0,0); // #66 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(163,0x00200800, 0,0,0); // #67 ${GetSiblingHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(164,0x00202001, 0,0,0); // #68 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(165,0x00800400, 0,0,0); // #71 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(166,0x00204001, 0,0,0); // #72 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(167,0x00208090, 0,0,0); // #75 $ => RKEY :CLIMB_RKEY, JMP(SINF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(168,0x00000088, 0,0,0); // #81 :LATCH_SET, JMP(Run) # flags = latchSet, jmp + + // storage_sm_set_delete_found.zkasm + + source(169,0x00200400, 0,0,0); // #22 ${GetOldValueLow()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(170,0x00200800, 0,0,0); // #23 ${GetOldValueHigh()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(171,0x00200801, 0,0,0); // #24 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source(172,0x00208400, 0,0,0); // #27 ${GetRkey()} => RKEY, HASH_LEFT # flags = setHASH_LEFT, setRKEY, inFREE + source(173,0x00204003, 0,0,0); // #28 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source(174,0x00200400, 0,0,0); // #32 ${GetSiblingValueLow()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(175,0x00200800, 0,0,0); // #33 ${GetSiblingValueHigh()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(176,0x00240801, 0,0,0); // #34 $ => SIBLING_VALUE_HASH, HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, setSIBLING_VALUE_HASH, inFREE + source(177,0x00220400, 0,0,0); // #37 ${GetSiblingRkey()} => SIBLING_RKEY, HASH_LEFT # flags = setHASH_LEFT, setSIBLING_RKEY, inFREE + source(178,0x00202003, 0,0,0); // #38 $ => NEW_ROOT :HASH1 # flags = hash, hashType, setNEW_ROOT, inFREE + source(179,0x00201000, 0,0,0); // #49 ${GetLevel()} => LEVEL # flags = setLEVEL, inFREE + source(180,0x40001000,-1,0,0); // #56 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(181,0x00210100, 0,0,0); // #59 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight1) # flags = jmpz, setRKEY_BIT, inFREE + source(182,0x00400400, 0,0,0); // #64 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(183,0x00800800, 0,0,0); // #65 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(184,0x00204001, 0,0,0); // #66 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(185,0x00208010, 0,0,0); // #68 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(186,0x002200E0, 0,0,0); // #72 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N, JMP(SDF_ClimbBranch) # flags = climbSiblingRkey, climbBitN, jmp, setSIBLING_RKEY, inFREE + source(187,0x00800400, 0,0,0); // #77 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(188,0x00400800, 0,0,0); // #78 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(189,0x00204001, 0,0,0); // #79 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(190,0x00208010, 0,0,0); // #82 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(191,0x00220060, 0,0,0); // #86 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY_N # flags = climbSiblingRkey, climbBitN, setSIBLING_RKEY, inFREE + source(192,0x00200100, 0,0,0); // #94 ${GetTopOfBranch()} :JMPZ(SDF_StartNewRoot) # flags = jmpz, inFREE + source(193,0x40001000,-1,0,0); // #96 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(194,0x00210100, 0,0,0); // #99 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight2) # flags = jmpz, setRKEY_BIT, inFREE + source(195,0x00000400, 0,0,0); // #108 0x0 => HASH_LEFT # flags = setHASH_LEFT + source(196,0x00800880, 0,0,0); // #109 OLD_ROOT => HASH_RIGHT :JMP(SDF_SiblingClimbKey2) # flags = jmp, setHASH_RIGHT, inOLD_ROOT + source(197,0x00800400, 0,0,0); // #114 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(198,0x00000800, 0,0,0); // #115 0x0 => HASH_RIGHT # flags = setHASH_RIGHT + source(199,0x00204001, 0,0,0); // #118 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(200,0x00208010, 0,0,0); // #120 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(201,0x002200A0, 0,0,0); // #121 $ => SIBLING_RKEY :CLIMB_SIBLING_RKEY, JMP(SDF_ClimbBranch) # flags = climbSiblingRkey, jmp, setSIBLING_RKEY, inFREE + source(202,0x00000400, 0,0,0); // #128 SIBLING_RKEY => HASH_LEFT # flags = setHASH_LEFT + source(203,0x04000800, 0,0,0); // #129 SIBLING_VALUE_HASH => HASH_RIGHT # flags = setHASH_RIGHT, inSIBLING_VALUE_HASH + source(204,0x00202003, 0,0,0); // #130 $ => NEW_ROOT :HASH1 # flags = hash, hashType, setNEW_ROOT, inFREE + source(205,0x40000100, 0,0,0); // #136 LEVEL :JMPZ(SDF_Latch) # flags = jmpz, inLEVEL + source(206,0x40001000,-1,0,0); // #138 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(207,0x00280E00, 0,0,0); // #142 ${GetSiblingHash()} => HASH_LEFT, HASH_RIGHT, VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ;VH[0] # flags = jmpnz, setHASH_LEFT, setHASH_RIGHT, setVALUE_HIGH, inFREE + source(208,0x20080200, 0,0,0); // #143 ROTL_VH => VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ; VH[3] # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source(209,0x20080200, 0,0,0); // #144 ROTL_VH => VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ; VH[2] # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source(210,0x20080200, 0,0,0); // #145 ROTL_VH => VALUE_HIGH :JMPNZ(SDF_SiblingHashIsNotZero) ; VH[1] # flags = jmpnz, setVALUE_HIGH, inROTL_VH + source(211,0x00000080, 0,0,0); // #147 :JMP(AssertFails) # flags = jmp + source(212,0x00080000, 0,0,0); // #150 0 => VALUE_HIGH # flags = setVALUE_HIGH + source(213,0x00210100, 0,0,0); // #154 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight3) # flags = jmpz, setRKEY_BIT, inFREE + source(214,0x00400800, 0,0,0); // #164 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(215,0x00202001, 0,0,0); // #165 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(216,0x00800800, 0,0,0); // #168 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(217,0x00204001, 0,0,0); // #169 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(218,0x00208090, 0,0,0); // #172 $ => RKEY :CLIMB_RKEY, JMP(SDF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(219,0x00400400, 0,0,0); // #178 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(220,0x00202001, 0,0,0); // #179 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(221,0x00800400, 0,0,0); // #182 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(222,0x00204001, 0,0,0); // #183 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(223,0x00208010, 0,0,0); // #186 $ => RKEY :CLIMB_RKEY # flags = climbRkey, setRKEY, inFREE + source(224,0x40000100, 0,0,0); // #194 LEVEL :JMPZ(SDF_Latch) # flags = jmpz, inLEVEL + source(225,0x40001000,-1,0,0); // #195 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(226,0x00210100, 0,0,0); // #198 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDF_SiblingIsRight4) # flags = jmpz, setRKEY_BIT, inFREE + source(227,0x00200400, 0,0,0); // #203 ${GetSiblingHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(228,0x00400800, 0,0,0); // #204 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(229,0x00202001, 0,0,0); // #205 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(230,0x00800800, 0,0,0); // #208 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(231,0x00204001, 0,0,0); // #209 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(232,0x00208090, 0,0,0); // #212 $ => RKEY :CLIMB_RKEY, JMP(SDF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(233,0x00400400, 0,0,0); // #217 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(234,0x00200800, 0,0,0); // #218 ${GetSiblingHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(235,0x00202001, 0,0,0); // #219 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(236,0x00800400, 0,0,0); // #222 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(237,0x00204001, 0,0,0); // #223 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(238,0x00208090, 0,0,0); // #226 $ => RKEY :CLIMB_RKEY, JMP(SDF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(239,0x00000088, 0,0,0); // #232 :LATCH_SET, JMP(Run) # flags = latchSet, jmp + + // storage_sm_set_delete_not_found.zkasm + + source(240,0x00200400, 0,0,0); // #20 ${GetOldValueLow()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(241,0x00200800, 0,0,0); // #21 ${GetOldValueHigh()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(242,0x00200801, 0,0,0); // #22 $ => HASH_RIGHT :HASH0 # flags = hash, setHASH_RIGHT, inFREE + source(243,0x00208400, 0,0,0); // #25 ${GetRkey()} => RKEY, HASH_LEFT # flags = setHASH_LEFT, setRKEY, inFREE + source(244,0x00204003, 0,0,0); // #26 $ => OLD_ROOT :HASH1 # flags = hash, hashType, setOLD_ROOT, inFREE + source(245,0x00201000, 0,0,0); // #31 ${GetLevel()} => LEVEL # flags = setLEVEL, inFREE + source(246,0x00182000, 0,0,0); // #36 0x0 => NEW_ROOT, VALUE_LOW, VALUE_HIGH # flags = setNEW_ROOT, setVALUE_HIGH, setVALUE_LOW + source(247,0x40000100, 0,0,0); // #39 LEVEL :JMPZ(SDNF_Latch) # flags = jmpz, inLEVEL + source(248,0x40001000,-1,0,0); // #40 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(249,0x00200400, 0,0,0); // #45 ${GetSiblingLeftChildHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(250,0x00200800, 0,0,0); // #46 ${GetSiblingRightChildHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(251,0x00200C01, 0,0,0); // #47 $ => HASH_LEFT, HASH_RIGHT :HASH0 # flags = hash, setHASH_LEFT, setHASH_RIGHT, inFREE + source(252,0x00210100, 0,0,0); // #49 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDNF_SiblingIsRight3) # flags = jmpz, setRKEY_BIT, inFREE + source(253,0x00400800, 0,0,0); // #54 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(254,0x00202001, 0,0,0); // #57 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(255,0x00800800, 0,0,0); // #60 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(256,0x00204001, 0,0,0); // #61 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(257,0x00208090, 0,0,0); // #64 $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(258,0x00400400, 0,0,0); // #70 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(259,0x00202001, 0,0,0); // #71 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(260,0x00800400, 0,0,0); // #74 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(261,0x00204001, 0,0,0); // #75 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(262,0x00208090, 0,0,0); // #78 $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(263,0x40000100, 0,0,0); // #83 LEVEL :JMPZ(SDNF_Latch) # flags = jmpz, inLEVEL + source(264,0x40001000,-1,0,0); // #84 LEVEL - 1 => LEVEL # flags = setLEVEL, inLEVEL + source(265,0x00210100, 0,0,0); // #86 ${GetNextKeyBit()} => RKEY_BIT :JMPZ(SDNF_SiblingIsRight4) # flags = jmpz, setRKEY_BIT, inFREE + source(266,0x00400800, 0,0,0); // #91 NEW_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inNEW_ROOT + source(267,0x00200400, 0,0,0); // #92 ${GetSiblingHash()} => HASH_LEFT # flags = setHASH_LEFT, inFREE + source(268,0x00202001, 0,0,0); // #93 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(269,0x00800800, 0,0,0); // #96 OLD_ROOT => HASH_RIGHT # flags = setHASH_RIGHT, inOLD_ROOT + source(270,0x00204001, 0,0,0); // #97 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(271,0x00208090, 0,0,0); // #100 $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(272,0x00400400, 0,0,0); // #105 NEW_ROOT => HASH_LEFT # flags = setHASH_LEFT, inNEW_ROOT + source(273,0x00200800, 0,0,0); // #106 ${GetSiblingHash()} => HASH_RIGHT # flags = setHASH_RIGHT, inFREE + source(274,0x00202001, 0,0,0); // #107 $ => NEW_ROOT :HASH0 # flags = hash, setNEW_ROOT, inFREE + source(275,0x00800400, 0,0,0); // #110 OLD_ROOT => HASH_LEFT # flags = setHASH_LEFT, inOLD_ROOT + source(276,0x00204001, 0,0,0); // #111 $ => OLD_ROOT :HASH0 # flags = hash, setOLD_ROOT, inFREE + source(277,0x00208090, 0,0,0); // #114 $ => RKEY :CLIMB_RKEY, JMP(SDNF_ClimbTree) # flags = climbRkey, jmp, setRKEY, inFREE + source(278,0x00000088, 0,0,0); // #120 :LATCH_SET, JMP(Run) # flags = latchSet, jmp + + // storage_sm_set_zero_to_zero.zkasm + + source(279,0x00002080, 1,0,0); // #6 1 => NEW_ROOT :JMP(Get_Zero) # flags = jmp, setNEW_ROOT + source(280,0x00802000, 0,0,0); // #10 OLD_ROOT => NEW_ROOT # flags = setNEW_ROOT, inOLD_ROOT + source(281,0x00000088, 0,0,0); // #14 :LATCH_SET, JMP(Run) # flags = latchSet, jmp + + // storage_sm.zkasm + + source(282,0x001FFC00, 0,0,0); // #68 0 => HASH_LEFT, HASH_RIGHT, OLD_ROOT, NEW_ROOT, VALUE_LOW, VALUE_HIGH, SIBLING_VALUE_HASH, RKEY, SIBLING_RKEY, RKEY_BIT, LEVEL # flags = setHASH_LEFT, setHASH_RIGHT, setLEVEL, setNEW_ROOT, setOLD_ROOT, setRKEY, setRKEY_BIT, setSIBLING_RKEY, setSIBLING_VALUE_HASH, setVALUE_HIGH, setVALUE_LOW + source(283,0x00200100, 0,0,0); // #72 ${isAlmostEndPolynomial()} :JMPZ(NotEndPol) # flags = jmpz, inFREE + source(284,0x00000080, 0,0,0); // #75 :JMP(Run) # flags = jmp + source(285,0x00000080, 0,0,0); // #79 :JMP(AssertFails) # flags = jmp + diff --git a/test/pil2/zkevm-etrog/storage_rom_json_to_pil2.js b/test/pil2/zkevm-etrog/storage_rom_json_to_pil2.js new file mode 100644 index 0000000..6530c36 --- /dev/null +++ b/test/pil2/zkevm-etrog/storage_rom_json_to_pil2.js @@ -0,0 +1,94 @@ +const fs = require('fs'); +const { F1Field } = require("ffjavascript"); + +const Fr = new F1Field("0xFFFFFFFF00000001"); + +const INT_MIN = -(2n ** 32n) + 1n; +const INT_MAX = (2n ** 32n) - 1n; + +const ROM_FLAGS = ['hash', 'hashType', 'latchGet', 'latchSet', 'climbRkey', 'climbSiblingRkey', 'climbBitN', + 'jmp', 'jmpz', 'jmpnz', 'setHASH_LEFT', 'setHASH_RIGHT', 'setLEVEL', 'setNEW_ROOT', 'setOLD_ROOT', + 'setRKEY', 'setRKEY_BIT', 'setSIBLING_RKEY', 'setSIBLING_VALUE_HASH', 'setVALUE_HIGH', 'setVALUE_LOW', + 'inFREE', 'inNEW_ROOT', 'inOLD_ROOT', 'inRKEY', 'inRKEY_BIT', 'inSIBLING_VALUE_HASH', + 'inVALUE_LOW', 'inVALUE_HIGH', 'inROTL_VH', 'inLEVEL']; + +function loadStorageRom(StorageRomFile) { + // Init rom from file + const rawdata = fs.readFileSync(StorageRomFile); + const json = JSON.parse(rawdata); + const rom = json.program; + const JMP_ADDRESS_MAX = BigInt(rom.length - 1); + const FLAGS_DIGITS = Math.ceil(ROM_FLAGS.length / 4); + + let data = []; + let previousFileName = false; + for (let line = 0; line < rom.length; line++) { + const l = rom[line]; + + const CONST0 = typeof l.CONST === 'undefined' ? 0n : BigInt(l.CONST); + if (CONST0 && (CONST0 > INT_MAX || CONST0 < INT_MIN)) { + throw new Error(`Invalid value for CONST ${CONST0} on ${l.fileName}:${l.line}`); + } + + const JMP_ADDRESS = typeof l.JMP_ADDRESS === 'undefined' ? 0n : BigInt(l.JMP_ADDRESS); + if (JMP_ADDRESS && (JMP_ADDRESS > JMP_ADDRESS_MAX || JMP_ADDRESS < 0n)) { + throw new Error(`Invalid value for JMP_ADDRESS ${JMP_ADDRESS} on ${l.fileName}:${l.line}`); + } + + const IN_SIBLING_RKEY = typeof l.IN_SIBLING_RKEY === 'undefined' ? 0n : BigInt(l.IN_SIBLING_RKEY); + if (IN_SIBLING_RKEY && (IN_SIBLING_RKEY > INT_MAX || IN_SIBLING_RKEY < INT_MIN)) { + throw new Error(`Invalid value for IN_SIBLING_RKEY ${CONST0} on ${l.fileName}:${l.line}`); + } + + let flags = 0n; + let activeFlags = []; + let factor = 1n; + for (const flag of ROM_FLAGS) { + const bit = typeof l[flag] === 'undefined' ? 0n : BigInt(l[flag]); + if (bit !== 0n && bit !== 1n) { + throw new Error(`Invalid value for ${flag} ${bit} on ${l.fileName}:${l.line}`); + } + if (bit) activeFlags.push(flag); + flags += bit * factor; + factor = factor * 2n; + } + const extraLn = (previousFileName !== false && previousFileName !== l.fileName) ? '\n':''; + previousFileName = l.fileName; + + // [LINE, ROM_FLAGS, CONST0, JMP_ADDRESS, IN_SIBLING_RKEY]); + data.push({values: [line, '0x'+flags.toString(16).toUpperCase().padStart(FLAGS_DIGITS, '0'), CONST0, JMP_ADDRESS, IN_SIBLING_RKEY], source:l.fileName, line: l.line, linestr: l.lineStr.trimEnd(), extraLn, flags: activeFlags.join(', ')}); + } + let widths = data.length ? data[0].values.map(x => 0) : []; + let sourceWidth = 0; + let lineWidth = 0; + let lineStrWidth = 0; + let flagsWidth = 0; + for (let ldata of data) { + ldata.values = ldata.values.map(x => typeof x === 'string' ? x : x.toString()); + widths = widths.map((w, i) => w > ldata.values[i].length ? w : ldata.values[i].length); + sourceWidth = sourceWidth > ldata.source.length ? sourceWidth : ldata.source.length; + const _line = ldata.line.toString(); + lineWidth = lineWidth > _line.length ? lineWidth : _line.length; + lineStrWidth = lineStrWidth > ldata.linestr.length ? lineStrWidth : ldata.linestr.length; + flagsWidth = flagsWidth > ldata.flags.length ? flagsWidth : ldata.flags.length; + } + let lines = ''; + /* + const lineWidth = data.length.toString().length; + for (let index = 0; index < data.length; ++index) { + const ldata = data[index]; + if (ldata.extraLn) lines += '\n'; + const line = index.toString().padStart(lineWidth); + lines += `\t[LINE[${line}], ROM_FLAGS[${line}], CONST0[${line}], JMP_ADDRESS[${line}], IN_SIBLING_RKEY[${line}]] = [` + ldata.values.map((x,i) => x.padStart(widths[i])).join() + ']; // ' + ldata.source.padEnd(sourceWidth) + ' ' + ldata.linestr + '\n'; + } + */ + const twidths = widths.reduce((t,x) => t+x, 0) + 10 + widths.length - 1; + for (let index = 0; index < data.length; ++index) { + const ldata = data[index]; + if (ldata.extraLn) lines += '\n\t'+' '.repeat(twidths) + '// '+ ldata.source + '\n\n'; + lines += `\tsource(` + ldata.values.map((x,i) => x.padStart(widths[i])).join() + '); // #' + ldata.line.toString().padEnd(lineWidth) + ' ' + ldata.linestr.padEnd(lineStrWidth) + ' # flags = ' + ldata.flags + '\n'; + } + console.log(lines); +} + +loadStorageRom(__dirname + '/storage_rom.json'); diff --git a/test/pil2/zkevm-etrog/tools.pil b/test/pil2/zkevm-etrog/tools.pil new file mode 100644 index 0000000..ced2560 --- /dev/null +++ b/test/pil2/zkevm-etrog/tools.pil @@ -0,0 +1,16 @@ +include "../std2/std_mset_lookup_range.pil" + +function compact_bin_cols(expr cols[]) { + int factor = 1; + expr res = 0; + if (length(cols) > 63) { + // TODO: ERROR + } + // TODO: REPEATED + for (int i = 0; i < length(cols); ++i) { + res = res + factor * cols[i]; + cols[i] * (1 - cols[i]) === 0; + factor = factor * 2; + } + return res; +} \ No newline at end of file From d2a5cb464d5f04088d11456e641070c69e2b5202 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Wed, 21 Feb 2024 07:16:38 +0100 Subject: [PATCH 30/33] clean obsolete pils, add README with pil info and fix some compilers bugs --- src/builtin/error.js | 7 +- src/context.js | 5 +- src/definition_items/fixed_col.js | 2 +- src/processor.js | 11 +- src/reference.js | 14 +- test/pil2/zkevm-etrog/README.md | 28 ++ test/pil2/zkevm-etrog/arith.pil | 389 ++++++------------ test/pil2/zkevm-etrog/binary.pil | 2 +- test/pil2/zkevm-etrog/binary_lib.pil | 118 ------ test/pil2/zkevm-etrog/binary_one_row.pil | 2 +- test/pil2/zkevm-etrog/binary_ops_table.pil | 2 +- test/pil2/zkevm-etrog/bits2field.pil | 13 - test/pil2/zkevm-etrog/bits2field_sha256.pil | 13 - test/pil2/zkevm-etrog/climb_key.pil | 4 +- test/pil2/zkevm-etrog/climb_key_table.pil | 2 +- test/pil2/zkevm-etrog/config.pil | 1 - test/pil2/zkevm-etrog/global.pil | 23 -- test/pil2/zkevm-etrog/keccakf.pil | 51 ++- test/pil2/zkevm-etrog/keccakf_table.pil | 24 ++ test/pil2/zkevm-etrog/main.pil | 55 +-- test/pil2/zkevm-etrog/mem_align.pil | 3 +- test/pil2/zkevm-etrog/padding_sha256bit.pil | 19 +- test/pil2/zkevm-etrog/rom.pil | 58 +-- test/pil2/zkevm-etrog/sha256f.pil | 46 ++- test/pil2/zkevm-etrog/sha256f_table.pil | 54 +++ test/pil2/zkevm-etrog/storage.pil | 2 +- test/pil2/zkevm-etrog/storage_rom.pil | 4 +- .../{ => tools}/storage_rom_json_to_pil2.js | 0 28 files changed, 385 insertions(+), 567 deletions(-) create mode 100644 test/pil2/zkevm-etrog/README.md delete mode 100644 test/pil2/zkevm-etrog/binary_lib.pil delete mode 100644 test/pil2/zkevm-etrog/bits2field.pil delete mode 100644 test/pil2/zkevm-etrog/bits2field_sha256.pil delete mode 100644 test/pil2/zkevm-etrog/config.pil delete mode 100644 test/pil2/zkevm-etrog/global.pil create mode 100644 test/pil2/zkevm-etrog/keccakf_table.pil create mode 100644 test/pil2/zkevm-etrog/sha256f_table.pil rename test/pil2/zkevm-etrog/{ => tools}/storage_rom_json_to_pil2.js (100%) diff --git a/src/builtin/error.js b/src/builtin/error.js index c55ae03..abbcbf3 100644 --- a/src/builtin/error.js +++ b/src/builtin/error.js @@ -27,9 +27,8 @@ module.exports = class Error extends Function { caller = e.stack.split('\n').slice(1).join('\n'); } console.log(caller);*/ - console.log(Context.sourceRef); - console.log(`\x1B[1;35mERROR ${mapInfo.join(' ')}\x1B[0m`); - EXIT_HERE; - return new IntValue(0n); + const msg = mapInfo.join(' '); + console.log(`\x1B[1;35mERROR ${msg}\x1B[0m`); + throw new Error(`ERROR: ${msg} at ${Context.sourceRef}`); } } diff --git a/src/context.js b/src/context.js index 90d72f1..8bd1c26 100644 --- a/src/context.js +++ b/src/context.js @@ -11,13 +11,14 @@ module.exports = class Context { this.subproof = false; this.stack = []; this.config = {debug: {}, ...config}; - console.log(config); - console.log(this.config); this.uses = []; this.subproofName = false; this.airId = false; this.airN = false; } + static get config() { + return this._instance.config; + } static get expressions() { return this._instance._processor.expressions; } diff --git a/src/definition_items/fixed_col.js b/src/definition_items/fixed_col.js index 2bfa22d..59d09fc 100644 --- a/src/definition_items/fixed_col.js +++ b/src/definition_items/fixed_col.js @@ -33,7 +33,7 @@ module.exports = class FixedCol extends ProofItem { } getRowValue(row) { if (this.sequence) { - throw new Error(`row access with sequence ${Context.sourceTag}`); + return this.sequence.getValue(row); } return this.values[row]; } diff --git a/src/processor.js b/src/processor.js index 7e78fe7..51dcd95 100644 --- a/src/processor.js +++ b/src/processor.js @@ -138,7 +138,7 @@ module.exports = class Processor { this.builtIn = {}; for (const filename of filenames) { if (!filename.endsWith('.js')) continue; - if (this.context.config.debug.builtInLoad) { + if (Context.config.debug.builtInLoad) { console.log(`Loading builtin ${filename}.....`); } if (Debug.active) console.log(filename); @@ -244,7 +244,7 @@ module.exports = class Processor { } res = this[method](st); } catch (e) { - console.log([Expression.constructor.name]); + // console.log([Expression.constructor.name]); console.log("EXCEPTION ON "+st.debug+" ("+this.callstack.join(' > ')+")"); throw e; } @@ -449,6 +449,9 @@ module.exports = class Processor { let index = 0; // while (this.expressions.e2bool(s.condition)) { while (true) { + if (index % 10000 === 0 && index) { + console.log(`inside FOR ${this.sourceRef} index:${index}`); + } const loopCond = s.condition.eval().asBool(); if (Debug.active) console.log('FOR.CONDITION', loopCond, s.condition.toString(), s.condition); if (!loopCond) break; @@ -730,7 +733,7 @@ module.exports = class Processor { ++this.airId; } this.finalSubproofScope(); - if (Context.config.protoOut !== false) { + if (!Context.config.protoOut) { this.proto.setSubproofValues(this.subproofvalues.getAggreationTypesBySubproofId(subproofId)); } this.scope.popInstanceType(); @@ -740,7 +743,7 @@ module.exports = class Processor { ++this.subproofId; } subproofProtoOut(subproofId, airId) { - if (Context.config.protoOut === false) return; + if (!Context.config.protoOut) return; let packed = new PackedExpressions(); this.proto.setFixedCols(this.fixeds); diff --git a/src/reference.js b/src/reference.js index c958317..4a788f7 100644 --- a/src/reference.js +++ b/src/reference.js @@ -2,9 +2,9 @@ const {assert, assertLog} = require('./assert.js'); const MultiArray = require("./multi_array.js"); const ArrayOf = require('./expression_items/array_of.js'); const RangeIndex = require('./expression_items/range_index.js'); +const IntValue = require('./expression_items/int_value.js'); const Context = require('./context.js'); const Debug = require('./debug.js'); - /** * @property {MultiArray} array */ @@ -186,18 +186,22 @@ class Reference { res = new ArrayOf(this.type, this.array.createSubArray(evaluatedIndexes, locator, fromIndex, toIndex)); } } else if (evaluatedIndexes.length === 1 && this.instance.runtimeRows) { - res = this.instance.getRowValue(locator, evaluatedIndexes[0], options); + res = this.instance.getRowValue(locator, evaluatedIndexes[0], options); } else if (evaluatedIndexes.length > 0) { console.log(evaluatedIndexes); console.log(this); throw new Error('try to access to index on non-array value'); } + if (typeof res === 'bigint' || typeof res === 'number') { + res = new IntValue(res); + } if (res === false) { res = this.const ? this.instance.getConstItem(locator, options) : this.instance.getItem(locator, options); } - - if (label) res.setLabel(label); - else res.setLabel('___'); + + if (label) { + res.setLabel(label); + } else res.setLabel('___'); return res; } diff --git a/test/pil2/zkevm-etrog/README.md b/test/pil2/zkevm-etrog/README.md new file mode 100644 index 0000000..0f2c5ea --- /dev/null +++ b/test/pil2/zkevm-etrog/README.md @@ -0,0 +1,28 @@ +Migration of zkevm pils to current version using vadcops. +|ID|subproof|pil2|tools|executor|notes| +|---|----|----|-----|----|----| +|1|main|90%|N/A|0%|| +|2|rom|80%|0%||tool: zkasm => pil| +|4|mem|90%|| +|5|mem_align|80%|| +|6|range_32|50%|| +|10|arith|30%|||pending equation generation and last features added (alias free,diff points)| +|20|binary|95%|| +|20|binary (one_row)|95%|||| +|21|binary_ops_table|95%|N/A|N/A|| +|40-42|padding_pg||| +|45|poseidong|95%|| +|50-52|padding_kk||| +|55|padding_kkbit||| +|56|keccakf||0%||tool: script/circuit => pil| +|57|keccakf_table||| +||bits2field|N/A|||integrated inside keccakf +|60-62|padding_sha256||| +|65|padding_sha256bit||| +|66|sha256f|80%|0%||tool: script/circuit => pil| +|67|sha256f_table||| +||bits2field_sha256|N/A|||integrated inside sha256f +|90|storage|95%|||| +|91|storage_rom|95%|95%|N/A|tool: zkasm => pil| +|92|climb_key|95%|||| +|93|climb_key_table|95%|100%|N/A|tool: validate/generate constants| diff --git a/test/pil2/zkevm-etrog/arith.pil b/test/pil2/zkevm-etrog/arith.pil index 0921b0d..9d20d12 100644 --- a/test/pil2/zkevm-etrog/arith.pil +++ b/test/pil2/zkevm-etrog/arith.pil @@ -23,33 +23,17 @@ and p2 refers to the base field order of: · BN254: 0x3064 4E72 E131 A029 B850 45B6 8181 585D 9781 6A91 6871 CA8D 3C20 8C16 D87C FD47 */ -include "global.pil"; +include "tools.pil"; subproof Arith(2**23) { - pol constant BYTE2_BIT19; - pol constant SEL_BYTE2_BIT19; - pol constant GL_SIGNED_22BITS; + col witness x1_y1; // clocks(cl) 0..15 => x1[15-cl] 16..31 => y1[31-cl] + col witness x2_y2; // clocks(cl) 0..15 => x2[15-cl] 16..31 => y2[31-cl] + col witness x2_y3; // clocks(cl) 0..15 => x3[15-cl] 16..31 => y3[31-cl] + col witness s2_q0; // clocks(cl) 0..15 => s[15-cl] 16..31 => q0[31-cl] + col witness q1_q2; // clocks(cl) 0..15 => q1[15-cl] 16..31 => q2[31-cl] - pol commit x1[16]; - pol commit y1[16]; - pol commit x2[16]; - pol commit y2[16]; - pol commit x3[16]; - pol commit y3[16]; - - pol commit s[16]; - pol commit q0[16]; - pol commit q1[16]; - pol commit q2[16]; - - pol commit resultEq0; - pol commit resultEq1; - pol commit resultEq2; - - resultEq0 * (1 - resultEq0) = 0; - resultEq1 * (1 - resultEq1) = 0; - resultEq2 * (1 - resultEq2) = 0; + col fixed C16OF32 = [1:16,0:16]...; // FEATURE: // · Verify that the x1,x2 are different when adding different elliptic curve points (EQ1,EQ3,EQ4). @@ -59,20 +43,17 @@ subproof Arith(2**23) { // In the first 16 clocks of 32-clock cycle we have: x2[0]-x1[0], x2[1]-x1[1], ..., x2[15]-x1[15] // In the last 16 clocks of 32-clock cycle we set all values to 0. - pol xDeltaChunk = x2[0]*Global.CLK32[0] + x2[1]*Global.CLK32[1] + x2[2]*Global.CLK32[2] + x2[3]*Global.CLK32[3] + x2[4]*Global.CLK32[4] + x2[5]*Global.CLK32[5] + x2[6]*Global.CLK32[6] + x2[7]*Global.CLK32[7] - + x2[8]*Global.CLK32[8] + x2[9]*Global.CLK32[9] + x2[10]*Global.CLK32[10] + x2[11]*Global.CLK32[11] + x2[12]*Global.CLK32[12] + x2[13]*Global.CLK32[13] + x2[14]*Global.CLK32[14] + x2[15]*Global.CLK32[15] - - x1[0]*Global.CLK32[0] - x1[1]*Global.CLK32[1] - x1[2]*Global.CLK32[2] - x1[3]*Global.CLK32[3] - x1[4]*Global.CLK32[4] - x1[5]*Global.CLK32[5] - x1[6]*Global.CLK32[6] - x1[7]*Global.CLK32[7] - - x1[8]*Global.CLK32[8] - x1[9]*Global.CLK32[9] - x1[10]*Global.CLK32[10] - x1[11]*Global.CLK32[11] - x1[12]*Global.CLK32[12] - x1[13]*Global.CLK32[13] - x1[14]*Global.CLK32[14] - x1[15]*Global.CLK32[15]; + const expr xDeltaChunk = (xy2 - xy1) * C16OF32; // Inverse of current xDeltaChunk. Used to verify that xDeltaChunk is ≠ 0, i.e., when x1[i] ≠ x2[i]. // This inverse only needs to be calculated one time by cycle. - pol commit xDeltaChunkInverse; + col witness xDeltaChunkInverse; // Intermediate pol to indicate that x1 is different from x2 in the current chunk. // IMPORTANT: xChunkDifferent == 1 ==> x1[i] ≠ x2[i] // xChunkDifferent == 0 does not imply anything, x1[i] ≠ x2[i] or x1[i] == x2[i]. // xChunkDifferent was binary, only when xDeltaChunkInverse === inv(xDeltaChunk), its value is 1. - pol xChunkDifferent = xDeltaChunk * xDeltaChunkInverse; + const expr xChunkDifferent = xDeltaChunk * xDeltaChunkInverse; // Important, binary constraint xChunkDifferent * (1 - xChunkDifferent) = 0; @@ -89,7 +70,7 @@ subproof Arith(2**23) { // it's calculated. // xAreDifferent is used to indicate that in current clock we knows that x1 and x2 are different - pol commit xAreDifferent; + const witness xAreDifferent; // Binary constraint xAreDifferent * (1 - xAreDifferent) = 0; @@ -263,11 +244,11 @@ subproof Arith(2**23) { // valueLtPrime indicates whether, at this point, we know that the value is smaller than the prime. // If selEq[3],selEq[4],selEq[5],selEq[6] = 0, it must be 0. - pol commit valueLtPrime; + col witness valueLtPrime; // chunkLtPrime indicates whether the current value chunk is smaller than the prime chunk. // If selEq[3],selEq[4],selEq[5],selEq[6] = 0 or valueLtPrime = 1, it must be 0. - pol commit chunkLtPrime; + col witness chunkLtPrime; // binary constraints chunkLtPrime * (1 - chunkLtPrime) = 0; @@ -281,32 +262,52 @@ subproof Arith(2**23) { // This constraint is applied when one of selEq[3],selEq[4],selEq[5],selEq[6] equals 1. (valueLtPrime' - selEq[3] - selEq[4] - selEq[5] - selEq[6]) * (Global.CLK32[15] + Global.CLK32[31]) = 0; - pol constant RANGE_SEL; // 0:2**16, - // 1:2**16-1,0 - // 2:2**16-2,0:2 - // 3:2**16-976,0:976 - // 4:2**16-977,0:977 - // ----------------------------------------------------------------------- - // 5:2**16-53147,0:53147 16:2**16-47688,0:47688 27:2**16-13682,0:13682 - // 6:2**16-53146,0:53146 17:2**16-32382,0:32382 28:2**16-13681,0:13681 - // 7:2**16-45453,0:45453 18:2**16-32381,0:32381 29:2**16-50143,0:50143 - // 8:2**16-45452,0:45452 19:2**16-42914,0:42914 30:2**16-50142,0:50142 - // 9:2**16-7886,0:7886 20:2**16-42913,0:42913 31:2**16-29673,0:29673 - // 10:2**16-7885,0:7885 21:2**16-26750,0:26750 32:2**16-29672,0:29672 - // 11:2**16-24534,0:24534 22:2**16-26749,0:26749 33:2**16-10115,0:10115 - // 12:2**16-24533,0:24533 23:2**16-38254,0:38254 34:2**16-10114,0:10114 - // 13:2**16-18351,0:18351 24:2**16-38253,0:38253 35:2**16-696,0:696 - // 14:2**16-18350,0:18350 25:2**16-38798,0:38798 36:2**16-695,0:695 - // 15:2**16-47689,0:47689 26:2**16-38797,0:38797 - + col fixed RANGE_SEL = [0:2**16], + [1:2**16-1,0], + [2:2**16-2,0:2], + [3:2**16-976,0:97], + [4:2**16-977,0:97], + [5:2**16-53147,0:53147], + [6:2**16-53146,0:53146], + [7:2**16-45453,0:45453], + [8:2**16-45452,0:45452], + [9:2**16-7886,0:7886], + [10:2**16-7885,0:7885], + [11:2**16-24534,0:24534], + [12:2**16-24533,0:24533], + [13:2**16-18351,0:18351], + [14:2**16-18350,0:18350], + [15:2**16-47689,0:47689], + [16:2**16-47688,0:476887], + [17:2**16-32382,0:323828], + [18:2**16-32381,0:323819], + [19:2**16-42914,0:429140], + [20:2**16-42913,0:429131], + [21:2**16-26750,0:267502], + [22:2**16-26749,0:267493], + [23:2**16-38254,0:382544], + [24:2**16-38253,0:382535], + [25:2**16-38798,0:387986], + [26:2**16-38797,0:3879], + [27:2**16-13682,0:1368], + [28:2**16-13681,0:1368], + [29:2**16-50143,0:5014], + [30:2**16-50142,0:5014], + [31:2**16-29673,0:2967], + [32:2**16-29672,0:2967], + [33:2**16-10115,0:1011], + [34:2**16-10114,0:1011], + [35:2**16-696,0:69], + [36:2**16-695,0:69]...; + // range to be looked up for each chunk and for each prime - pol pRangeSecp256k1 = (Global.CLK32[13] + Global.CLK32[29] + 3 * (Global.CLK32[15] + Global.CLK32[31]) + chunkLtPrime) * selEq[3]; - pol pRangeBN254 = (5 * (Global.CLK32[0] + Global.CLK32[16]) + 7 * (Global.CLK32[1] + Global.CLK32[17]) + 9 * (Global.CLK32[2] + Global.CLK32[18]) - + 11 * (Global.CLK32[3] + Global.CLK32[19]) + 13 * (Global.CLK32[4] + Global.CLK32[20]) + 15 * (Global.CLK32[5] + Global.CLK32[21]) - + 17 * (Global.CLK32[6] + Global.CLK32[22]) + 19 * (Global.CLK32[7] + Global.CLK32[23]) + 21 * (Global.CLK32[8] + Global.CLK32[24]) - + 23 * (Global.CLK32[9] + Global.CLK32[25]) + 25 * (Global.CLK32[10] + Global.CLK32[26]) + 27 * (Global.CLK32[11] + Global.CLK32[27]) - + 29 * (Global.CLK32[12] + Global.CLK32[28]) + 31 * (Global.CLK32[13] + Global.CLK32[29]) + 33 * (Global.CLK32[14] + Global.CLK32[30]) - + 35 * (Global.CLK32[15] + Global.CLK32[31]) + chunkLtPrime) * (selEq[4] + selEq[5] + selEq[6]); + const expr pRangeSecp256k1 = (Global.CLK32[13] + Global.CLK32[29] + 3 * (Global.CLK32[15] + Global.CLK32[31]) + chunkLtPrime) * selEq[3]; + const expr pRangeBN254 = (5 * (Global.CLK32[0] + Global.CLK32[16]) + 7 * (Global.CLK32[1] + Global.CLK32[17]) + 9 * (Global.CLK32[2] + Global.CLK32[18]) + + 11 * (Global.CLK32[3] + Global.CLK32[19]) + 13 * (Global.CLK32[4] + Global.CLK32[20]) + 15 * (Global.CLK32[5] + Global.CLK32[21]) + + 17 * (Global.CLK32[6] + Global.CLK32[22]) + 19 * (Global.CLK32[7] + Global.CLK32[23]) + 21 * (Global.CLK32[8] + Global.CLK32[24]) + + 23 * (Global.CLK32[9] + Global.CLK32[25]) + 25 * (Global.CLK32[10] + Global.CLK32[26]) + 27 * (Global.CLK32[11] + Global.CLK32[27]) + + 29 * (Global.CLK32[12] + Global.CLK32[28]) + 31 * (Global.CLK32[13] + Global.CLK32[29]) + 33 * (Global.CLK32[14] + Global.CLK32[30]) + + 35 * (Global.CLK32[15] + Global.CLK32[31]) + chunkLtPrime) * (selEq[4] + selEq[5] + selEq[6]); // lookup with RANGE_SEL as first column and BYTE2 as second column {(pRangeSecp256k1 + pRangeBN254) * (1 - valueLtPrime), x3[15]*Global.CLK32[0] + x3[14]*Global.CLK32[1] + x3[13]*Global.CLK32[2] + x3[12]*Global.CLK32[3] + x3[11]*Global.CLK32[4] + x3[10]*Global.CLK32[5] + x3[9]*Global.CLK32[6] + x3[8]*Global.CLK32[7] @@ -314,217 +315,14 @@ subproof Arith(2**23) { + y3[15]*Global.CLK32[16] + y3[14]*Global.CLK32[17] + y3[13]*Global.CLK32[18] + y3[12]*Global.CLK32[19] + y3[11]*Global.CLK32[20] + y3[10]*Global.CLK32[21] + y3[9]*Global.CLK32[22] + y3[8]*Global.CLK32[23] + y3[7]*Global.CLK32[24] + y3[6]*Global.CLK32[25] + y3[5]*Global.CLK32[26] + y3[4]*Global.CLK32[27] + y3[3]*Global.CLK32[28] + y3[2]*Global.CLK32[29] + y3[1]*Global.CLK32[30] + y3[0]*Global.CLK32[31]} in {RANGE_SEL, Global.BYTE2}; - /**** - * - * LATCH POLS: x1,y1,x2,y2,x3,y3,s,q0,q1,q2 - * - *****/ - - x1[0]' * (1-Global.CLK32[31]) = x1[0] * (1-Global.CLK32[31]); - x1[1]' * (1-Global.CLK32[31]) = x1[1] * (1-Global.CLK32[31]); - x1[2]' * (1-Global.CLK32[31]) = x1[2] * (1-Global.CLK32[31]); - x1[3]' * (1-Global.CLK32[31]) = x1[3] * (1-Global.CLK32[31]); - x1[4]' * (1-Global.CLK32[31]) = x1[4] * (1-Global.CLK32[31]); - x1[5]' * (1-Global.CLK32[31]) = x1[5] * (1-Global.CLK32[31]); - x1[6]' * (1-Global.CLK32[31]) = x1[6] * (1-Global.CLK32[31]); - x1[7]' * (1-Global.CLK32[31]) = x1[7] * (1-Global.CLK32[31]); - x1[8]' * (1-Global.CLK32[31]) = x1[8] * (1-Global.CLK32[31]); - x1[9]' * (1-Global.CLK32[31]) = x1[9] * (1-Global.CLK32[31]); - x1[10]' * (1-Global.CLK32[31]) = x1[10] * (1-Global.CLK32[31]); - x1[11]' * (1-Global.CLK32[31]) = x1[11] * (1-Global.CLK32[31]); - x1[12]' * (1-Global.CLK32[31]) = x1[12] * (1-Global.CLK32[31]); - x1[13]' * (1-Global.CLK32[31]) = x1[13] * (1-Global.CLK32[31]); - x1[14]' * (1-Global.CLK32[31]) = x1[14] * (1-Global.CLK32[31]); - x1[15]' * (1-Global.CLK32[31]) = x1[15] * (1-Global.CLK32[31]); - - - y1[0]' * (1-Global.CLK32[31]) = y1[0] * (1-Global.CLK32[31]); - y1[1]' * (1-Global.CLK32[31]) = y1[1] * (1-Global.CLK32[31]); - y1[2]' * (1-Global.CLK32[31]) = y1[2] * (1-Global.CLK32[31]); - y1[3]' * (1-Global.CLK32[31]) = y1[3] * (1-Global.CLK32[31]); - y1[4]' * (1-Global.CLK32[31]) = y1[4] * (1-Global.CLK32[31]); - y1[5]' * (1-Global.CLK32[31]) = y1[5] * (1-Global.CLK32[31]); - y1[6]' * (1-Global.CLK32[31]) = y1[6] * (1-Global.CLK32[31]); - y1[7]' * (1-Global.CLK32[31]) = y1[7] * (1-Global.CLK32[31]); - y1[8]' * (1-Global.CLK32[31]) = y1[8] * (1-Global.CLK32[31]); - y1[9]' * (1-Global.CLK32[31]) = y1[9] * (1-Global.CLK32[31]); - y1[10]' * (1-Global.CLK32[31]) = y1[10] * (1-Global.CLK32[31]); - y1[11]' * (1-Global.CLK32[31]) = y1[11] * (1-Global.CLK32[31]); - y1[12]' * (1-Global.CLK32[31]) = y1[12] * (1-Global.CLK32[31]); - y1[13]' * (1-Global.CLK32[31]) = y1[13] * (1-Global.CLK32[31]); - y1[14]' * (1-Global.CLK32[31]) = y1[14] * (1-Global.CLK32[31]); - y1[15]' * (1-Global.CLK32[31]) = y1[15] * (1-Global.CLK32[31]); - - - x2[0]' * (1-Global.CLK32[31]) = x2[0] * (1-Global.CLK32[31]); - x2[1]' * (1-Global.CLK32[31]) = x2[1] * (1-Global.CLK32[31]); - x2[2]' * (1-Global.CLK32[31]) = x2[2] * (1-Global.CLK32[31]); - x2[3]' * (1-Global.CLK32[31]) = x2[3] * (1-Global.CLK32[31]); - x2[4]' * (1-Global.CLK32[31]) = x2[4] * (1-Global.CLK32[31]); - x2[5]' * (1-Global.CLK32[31]) = x2[5] * (1-Global.CLK32[31]); - x2[6]' * (1-Global.CLK32[31]) = x2[6] * (1-Global.CLK32[31]); - x2[7]' * (1-Global.CLK32[31]) = x2[7] * (1-Global.CLK32[31]); - x2[8]' * (1-Global.CLK32[31]) = x2[8] * (1-Global.CLK32[31]); - x2[9]' * (1-Global.CLK32[31]) = x2[9] * (1-Global.CLK32[31]); - x2[10]' * (1-Global.CLK32[31]) = x2[10] * (1-Global.CLK32[31]); - x2[11]' * (1-Global.CLK32[31]) = x2[11] * (1-Global.CLK32[31]); - x2[12]' * (1-Global.CLK32[31]) = x2[12] * (1-Global.CLK32[31]); - x2[13]' * (1-Global.CLK32[31]) = x2[13] * (1-Global.CLK32[31]); - x2[14]' * (1-Global.CLK32[31]) = x2[14] * (1-Global.CLK32[31]); - x2[15]' * (1-Global.CLK32[31]) = x2[15] * (1-Global.CLK32[31]); - - - y2[0]' * (1-Global.CLK32[31]) = y2[0] * (1-Global.CLK32[31]); - y2[1]' * (1-Global.CLK32[31]) = y2[1] * (1-Global.CLK32[31]); - y2[2]' * (1-Global.CLK32[31]) = y2[2] * (1-Global.CLK32[31]); - y2[3]' * (1-Global.CLK32[31]) = y2[3] * (1-Global.CLK32[31]); - y2[4]' * (1-Global.CLK32[31]) = y2[4] * (1-Global.CLK32[31]); - y2[5]' * (1-Global.CLK32[31]) = y2[5] * (1-Global.CLK32[31]); - y2[6]' * (1-Global.CLK32[31]) = y2[6] * (1-Global.CLK32[31]); - y2[7]' * (1-Global.CLK32[31]) = y2[7] * (1-Global.CLK32[31]); - y2[8]' * (1-Global.CLK32[31]) = y2[8] * (1-Global.CLK32[31]); - y2[9]' * (1-Global.CLK32[31]) = y2[9] * (1-Global.CLK32[31]); - y2[10]' * (1-Global.CLK32[31]) = y2[10] * (1-Global.CLK32[31]); - y2[11]' * (1-Global.CLK32[31]) = y2[11] * (1-Global.CLK32[31]); - y2[12]' * (1-Global.CLK32[31]) = y2[12] * (1-Global.CLK32[31]); - y2[13]' * (1-Global.CLK32[31]) = y2[13] * (1-Global.CLK32[31]); - y2[14]' * (1-Global.CLK32[31]) = y2[14] * (1-Global.CLK32[31]); - y2[15]' * (1-Global.CLK32[31]) = y2[15] * (1-Global.CLK32[31]); - - - x3[0]' * (1-Global.CLK32[31]) = x3[0] * (1-Global.CLK32[31]); - x3[1]' * (1-Global.CLK32[31]) = x3[1] * (1-Global.CLK32[31]); - x3[2]' * (1-Global.CLK32[31]) = x3[2] * (1-Global.CLK32[31]); - x3[3]' * (1-Global.CLK32[31]) = x3[3] * (1-Global.CLK32[31]); - x3[4]' * (1-Global.CLK32[31]) = x3[4] * (1-Global.CLK32[31]); - x3[5]' * (1-Global.CLK32[31]) = x3[5] * (1-Global.CLK32[31]); - x3[6]' * (1-Global.CLK32[31]) = x3[6] * (1-Global.CLK32[31]); - x3[7]' * (1-Global.CLK32[31]) = x3[7] * (1-Global.CLK32[31]); - x3[8]' * (1-Global.CLK32[31]) = x3[8] * (1-Global.CLK32[31]); - x3[9]' * (1-Global.CLK32[31]) = x3[9] * (1-Global.CLK32[31]); - x3[10]' * (1-Global.CLK32[31]) = x3[10] * (1-Global.CLK32[31]); - x3[11]' * (1-Global.CLK32[31]) = x3[11] * (1-Global.CLK32[31]); - x3[12]' * (1-Global.CLK32[31]) = x3[12] * (1-Global.CLK32[31]); - x3[13]' * (1-Global.CLK32[31]) = x3[13] * (1-Global.CLK32[31]); - x3[14]' * (1-Global.CLK32[31]) = x3[14] * (1-Global.CLK32[31]); - x3[15]' * (1-Global.CLK32[31]) = x3[15] * (1-Global.CLK32[31]); - - - y3[0]' * (1-Global.CLK32[31]) = y3[0] * (1-Global.CLK32[31]); - y3[1]' * (1-Global.CLK32[31]) = y3[1] * (1-Global.CLK32[31]); - y3[2]' * (1-Global.CLK32[31]) = y3[2] * (1-Global.CLK32[31]); - y3[3]' * (1-Global.CLK32[31]) = y3[3] * (1-Global.CLK32[31]); - y3[4]' * (1-Global.CLK32[31]) = y3[4] * (1-Global.CLK32[31]); - y3[5]' * (1-Global.CLK32[31]) = y3[5] * (1-Global.CLK32[31]); - y3[6]' * (1-Global.CLK32[31]) = y3[6] * (1-Global.CLK32[31]); - y3[7]' * (1-Global.CLK32[31]) = y3[7] * (1-Global.CLK32[31]); - y3[8]' * (1-Global.CLK32[31]) = y3[8] * (1-Global.CLK32[31]); - y3[9]' * (1-Global.CLK32[31]) = y3[9] * (1-Global.CLK32[31]); - y3[10]' * (1-Global.CLK32[31]) = y3[10] * (1-Global.CLK32[31]); - y3[11]' * (1-Global.CLK32[31]) = y3[11] * (1-Global.CLK32[31]); - y3[12]' * (1-Global.CLK32[31]) = y3[12] * (1-Global.CLK32[31]); - y3[13]' * (1-Global.CLK32[31]) = y3[13] * (1-Global.CLK32[31]); - y3[14]' * (1-Global.CLK32[31]) = y3[14] * (1-Global.CLK32[31]); - y3[15]' * (1-Global.CLK32[31]) = y3[15] * (1-Global.CLK32[31]); - - - s[0]' * (1-Global.CLK32[31]) = s[0] * (1-Global.CLK32[31]); - s[1]' * (1-Global.CLK32[31]) = s[1] * (1-Global.CLK32[31]); - s[2]' * (1-Global.CLK32[31]) = s[2] * (1-Global.CLK32[31]); - s[3]' * (1-Global.CLK32[31]) = s[3] * (1-Global.CLK32[31]); - s[4]' * (1-Global.CLK32[31]) = s[4] * (1-Global.CLK32[31]); - s[5]' * (1-Global.CLK32[31]) = s[5] * (1-Global.CLK32[31]); - s[6]' * (1-Global.CLK32[31]) = s[6] * (1-Global.CLK32[31]); - s[7]' * (1-Global.CLK32[31]) = s[7] * (1-Global.CLK32[31]); - s[8]' * (1-Global.CLK32[31]) = s[8] * (1-Global.CLK32[31]); - s[9]' * (1-Global.CLK32[31]) = s[9] * (1-Global.CLK32[31]); - s[10]' * (1-Global.CLK32[31]) = s[10] * (1-Global.CLK32[31]); - s[11]' * (1-Global.CLK32[31]) = s[11] * (1-Global.CLK32[31]); - s[12]' * (1-Global.CLK32[31]) = s[12] * (1-Global.CLK32[31]); - s[13]' * (1-Global.CLK32[31]) = s[13] * (1-Global.CLK32[31]); - s[14]' * (1-Global.CLK32[31]) = s[14] * (1-Global.CLK32[31]); - s[15]' * (1-Global.CLK32[31]) = s[15] * (1-Global.CLK32[31]); - - - q0[0]' * (1-Global.CLK32[31]) = q0[0] * (1-Global.CLK32[31]); - q0[1]' * (1-Global.CLK32[31]) = q0[1] * (1-Global.CLK32[31]); - q0[2]' * (1-Global.CLK32[31]) = q0[2] * (1-Global.CLK32[31]); - q0[3]' * (1-Global.CLK32[31]) = q0[3] * (1-Global.CLK32[31]); - q0[4]' * (1-Global.CLK32[31]) = q0[4] * (1-Global.CLK32[31]); - q0[5]' * (1-Global.CLK32[31]) = q0[5] * (1-Global.CLK32[31]); - q0[6]' * (1-Global.CLK32[31]) = q0[6] * (1-Global.CLK32[31]); - q0[7]' * (1-Global.CLK32[31]) = q0[7] * (1-Global.CLK32[31]); - q0[8]' * (1-Global.CLK32[31]) = q0[8] * (1-Global.CLK32[31]); - q0[9]' * (1-Global.CLK32[31]) = q0[9] * (1-Global.CLK32[31]); - q0[10]' * (1-Global.CLK32[31]) = q0[10] * (1-Global.CLK32[31]); - q0[11]' * (1-Global.CLK32[31]) = q0[11] * (1-Global.CLK32[31]); - q0[12]' * (1-Global.CLK32[31]) = q0[12] * (1-Global.CLK32[31]); - q0[13]' * (1-Global.CLK32[31]) = q0[13] * (1-Global.CLK32[31]); - q0[14]' * (1-Global.CLK32[31]) = q0[14] * (1-Global.CLK32[31]); - q0[15]' * (1-Global.CLK32[31]) = q0[15] * (1-Global.CLK32[31]); - - - q1[0]' * (1-Global.CLK32[31]) = q1[0] * (1-Global.CLK32[31]); - q1[1]' * (1-Global.CLK32[31]) = q1[1] * (1-Global.CLK32[31]); - q1[2]' * (1-Global.CLK32[31]) = q1[2] * (1-Global.CLK32[31]); - q1[3]' * (1-Global.CLK32[31]) = q1[3] * (1-Global.CLK32[31]); - q1[4]' * (1-Global.CLK32[31]) = q1[4] * (1-Global.CLK32[31]); - q1[5]' * (1-Global.CLK32[31]) = q1[5] * (1-Global.CLK32[31]); - q1[6]' * (1-Global.CLK32[31]) = q1[6] * (1-Global.CLK32[31]); - q1[7]' * (1-Global.CLK32[31]) = q1[7] * (1-Global.CLK32[31]); - q1[8]' * (1-Global.CLK32[31]) = q1[8] * (1-Global.CLK32[31]); - q1[9]' * (1-Global.CLK32[31]) = q1[9] * (1-Global.CLK32[31]); - q1[10]' * (1-Global.CLK32[31]) = q1[10] * (1-Global.CLK32[31]); - q1[11]' * (1-Global.CLK32[31]) = q1[11] * (1-Global.CLK32[31]); - q1[12]' * (1-Global.CLK32[31]) = q1[12] * (1-Global.CLK32[31]); - q1[13]' * (1-Global.CLK32[31]) = q1[13] * (1-Global.CLK32[31]); - q1[14]' * (1-Global.CLK32[31]) = q1[14] * (1-Global.CLK32[31]); - q1[15]' * (1-Global.CLK32[31]) = q1[15] * (1-Global.CLK32[31]); - - - q2[0]' * (1-Global.CLK32[31]) = q2[0] * (1-Global.CLK32[31]); - q2[1]' * (1-Global.CLK32[31]) = q2[1] * (1-Global.CLK32[31]); - q2[2]' * (1-Global.CLK32[31]) = q2[2] * (1-Global.CLK32[31]); - q2[3]' * (1-Global.CLK32[31]) = q2[3] * (1-Global.CLK32[31]); - q2[4]' * (1-Global.CLK32[31]) = q2[4] * (1-Global.CLK32[31]); - q2[5]' * (1-Global.CLK32[31]) = q2[5] * (1-Global.CLK32[31]); - q2[6]' * (1-Global.CLK32[31]) = q2[6] * (1-Global.CLK32[31]); - q2[7]' * (1-Global.CLK32[31]) = q2[7] * (1-Global.CLK32[31]); - q2[8]' * (1-Global.CLK32[31]) = q2[8] * (1-Global.CLK32[31]); - q2[9]' * (1-Global.CLK32[31]) = q2[9] * (1-Global.CLK32[31]); - q2[10]' * (1-Global.CLK32[31]) = q2[10] * (1-Global.CLK32[31]); - q2[11]' * (1-Global.CLK32[31]) = q2[11] * (1-Global.CLK32[31]); - q2[12]' * (1-Global.CLK32[31]) = q2[12] * (1-Global.CLK32[31]); - q2[13]' * (1-Global.CLK32[31]) = q2[13] * (1-Global.CLK32[31]); - q2[14]' * (1-Global.CLK32[31]) = q2[14] * (1-Global.CLK32[31]); - q2[15]' * (1-Global.CLK32[31]) = q2[15] * (1-Global.CLK32[31]); - - - /**** - * - * RANGE CHECK x1,y1,x2,y2,s,q0,q1,q2 - * - *****/ - - x1[0]*Global.CLK32[0] + x1[1]*Global.CLK32[1] + x1[2]*Global.CLK32[2] + x1[3]*Global.CLK32[3] + x1[4]*Global.CLK32[4] + x1[5]*Global.CLK32[5] + x1[6]*Global.CLK32[6] + x1[7]*Global.CLK32[7] - + x1[8]*Global.CLK32[8] + x1[9]*Global.CLK32[9] + x1[10]*Global.CLK32[10] + x1[11]*Global.CLK32[11] + x1[12]*Global.CLK32[12] + x1[13]*Global.CLK32[13] + x1[14]*Global.CLK32[14] + x1[15]*Global.CLK32[15] - + y1[0]*Global.CLK32[16] + y1[1]*Global.CLK32[17] + y1[2]*Global.CLK32[18] + y1[3]*Global.CLK32[19] + y1[4]*Global.CLK32[20] + y1[5]*Global.CLK32[21] + y1[6]*Global.CLK32[22] + y1[7]*Global.CLK32[23] - + y1[8]*Global.CLK32[24] + y1[9]*Global.CLK32[25] + y1[10]*Global.CLK32[26] + y1[11]*Global.CLK32[27] + y1[12]*Global.CLK32[28] + y1[13]*Global.CLK32[29] + y1[14]*Global.CLK32[30] + y1[15]*Global.CLK32[31] in Global.BYTE2; + // x1'i2nX(0,3) - x2[0]*Global.CLK32[0] + x2[1]*Global.CLK32[1] + x2[2]*Global.CLK32[2] + x2[3]*Global.CLK32[3] + x2[4]*Global.CLK32[4] + x2[5]*Global.CLK32[5] + x2[6]*Global.CLK32[6] + x2[7]*Global.CLK32[7] - + x2[8]*Global.CLK32[8] + x2[9]*Global.CLK32[9] + x2[10]*Global.CLK32[10] + x2[11]*Global.CLK32[11] + x2[12]*Global.CLK32[12] + x2[13]*Global.CLK32[13] + x2[14]*Global.CLK32[14] + x2[15]*Global.CLK32[15] - + y2[0]*Global.CLK32[16] + y2[1]*Global.CLK32[17] + y2[2]*Global.CLK32[18] + y2[3]*Global.CLK32[19] + y2[4]*Global.CLK32[20] + y2[5]*Global.CLK32[21] + y2[6]*Global.CLK32[22] + y2[7]*Global.CLK32[23] - + y2[8]*Global.CLK32[24] + y2[9]*Global.CLK32[25] + y2[10]*Global.CLK32[26] + y2[11]*Global.CLK32[27] + y2[12]*Global.CLK32[28] + y2[13]*Global.CLK32[29] + y2[14]*Global.CLK32[30] + y2[15]*Global.CLK32[31] in Global.BYTE2; - - s[0]*Global.CLK32[0] + s[1]*Global.CLK32[1] + s[2]*Global.CLK32[2] + s[3]*Global.CLK32[3] + s[4]*Global.CLK32[4] + s[5]*Global.CLK32[5] + s[6]*Global.CLK32[6] + s[7]*Global.CLK32[7] - + s[8]*Global.CLK32[8] + s[9]*Global.CLK32[9] + s[10]*Global.CLK32[10] + s[11]*Global.CLK32[11] + s[12]*Global.CLK32[12] + s[13]*Global.CLK32[13] + s[14]*Global.CLK32[14] + s[15]*Global.CLK32[15] - + q0[0]*Global.CLK32[16] + q0[1]*Global.CLK32[17] + q0[2]*Global.CLK32[18] + q0[3]*Global.CLK32[19] + q0[4]*Global.CLK32[20] + q0[5]*Global.CLK32[21] + q0[6]*Global.CLK32[22] + q0[7]*Global.CLK32[23] - + q0[8]*Global.CLK32[24] + q0[9]*Global.CLK32[25] + q0[10]*Global.CLK32[26] + q0[11]*Global.CLK32[27] + q0[12]*Global.CLK32[28] + q0[13]*Global.CLK32[29] + q0[14]*Global.CLK32[30] + q1[0]*Global.CLK32[31] in Global.BYTE2; - - {Global.CLK32[29] + Global.CLK32[30] + Global.CLK32[31], q1[1]*Global.CLK32[0] + q1[2]*Global.CLK32[1] + q1[3]*Global.CLK32[2] + q1[4]*Global.CLK32[3] + q1[5]*Global.CLK32[4] + q1[6]*Global.CLK32[5] + q1[7]*Global.CLK32[6] + q1[8]*Global.CLK32[7] - + q1[9]*Global.CLK32[8] + q1[10]*Global.CLK32[9] + q1[11]*Global.CLK32[10] + q1[12]*Global.CLK32[11] + q1[13]*Global.CLK32[12] + q1[14]*Global.CLK32[13] + q2[0]*Global.CLK32[14] + q2[1]*Global.CLK32[15] - + q2[2]*Global.CLK32[16] + q2[3]*Global.CLK32[17] + q2[4]*Global.CLK32[18] + q2[5]*Global.CLK32[19] + q2[6]*Global.CLK32[20] + q2[7]*Global.CLK32[21] + q2[8]*Global.CLK32[22] + q2[9]*Global.CLK32[23] - + q2[10]*Global.CLK32[24] + q2[11]*Global.CLK32[25] + q2[12]*Global.CLK32[26] + q2[13]*Global.CLK32[27] + q2[14]*Global.CLK32[28] + q0[15]*Global.CLK32[29] + q1[15]*Global.CLK32[30] + q2[15]*Global.CLK32[31]} in {SEL_BYTE2_BIT19, BYTE2_BIT19}; + range_check(x1_y1, 0, 2**16-1); + range_check(x2_y2, 0, 2**16-1); + range_check(x3_y3, 0, 2**16-1); + // TODO q0 range check 22 bits !!! + range_check(s_q0, 0, 2**16-1); + range_check(q1_q2, 0, 2**22-1); /******* * @@ -532,9 +330,13 @@ subproof Arith(2**23) { * *******/ - pol eq0_0 = - (x1[0] * y1[0]) - + x2[0] - y3[0]; + // pol eq0_0 = + // (x1[0] * y1[0]) + // + x2[0] - y3[0]; + + const expr eq0_0 = + (x1_y1'(i2nX(0,0)) * x1_y1'(i2nY(0,0))) + + x2_y2'(i2nX(0,0)) * x3_y3'(i2nY(0,0)); pol eq0_1 = (x1[0] * y1[1]) + @@ -4446,3 +4248,50 @@ subproof Arith(2**23) { selEq[5] * (eq8 + carry[2]) = selEq[5] * carry[2]' * 2**16; selEq[6] * (eq9 + carry[1]) = selEq[6] * carry[1]' * 2**16; selEq[6] * (eq10 + carry[2]) = selEq[6] * carry[2]' * 2**16; +} + +// xy x15 x14 x13 x12 x11 x10 x9 x8 x7 x6 x5 x4 x3 x2 x1 x0 y15 y14 y13 y12 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 +// cl0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 +// cl1 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 +// cl2 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 +// cl3 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 +// cl4 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 +// cl5 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 +// cl6 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 +// cl7 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 +// cl8 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 +// cl9 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 +// cl10 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +// cl11 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +// cl12 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 +// cl13 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +// cl14 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 +// cl15 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +// cl16 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +// cl17 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +// cl18 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 +// cl19 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 +// cl20 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 +// cl21 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 +// cl22 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 +// cl23 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 +// cl24 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 +// cl25 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 +// cl26 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 +// cl27 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 +// cl28 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 +// cl29 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 +// cl30 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 +// cl31 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 +// +// rindex = 15 - index + + +private function i2nX(int index, int clock):int { + return (15 - index) - clock; +} + + +private function i2nY(int index, int clock):int { + return (15 - index) - clock + 16; +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/binary.pil b/test/pil2/zkevm-etrog/binary.pil index a7860ee..3b55b27 100644 --- a/test/pil2/zkevm-etrog/binary.pil +++ b/test/pil2/zkevm-etrog/binary.pil @@ -22,7 +22,7 @@ // 16 │ 2 │ 8 + 4*16 = 76 │ 152 │ 3 │ // 32 │ 1 │ 8 + 4*32 = 136 │ 136 │ 2 │ -const int BINARY_ID = 1; +const int BINARY_ID = 20; subproof aggregate Binary(2**21, 2**23, 2**25) { diff --git a/test/pil2/zkevm-etrog/binary_lib.pil b/test/pil2/zkevm-etrog/binary_lib.pil deleted file mode 100644 index 5b0b3f1..0000000 --- a/test/pil2/zkevm-etrog/binary_lib.pil +++ /dev/null @@ -1,118 +0,0 @@ -// PIL State Machine that compute 256 bits operations: -// -// ADD (OP:0) -// SUB (OP:1) -// LT (OP:2) -// SLT (OP:3) -// EQ (OP:4) -// AND (OP:5) -// OR (OP:6) -// XOR (OP:7) -// LT4 (OP:8) -// ADC (OP:9) - -const int BINARY_ID = 1; - -instance Binary(id: ID, rows: 2**23, bytes: 32); -instance Binary(id, rows, bytes); - -subproof aggregate Binary(id = BINARY_ID, rows = 2**23, bytesPerRow = 4, bits = 256) { - N = rows; - - assert(isPowOfTwo(rows)); - assert(bytes % 2 == 0); - assert(bits % 8 == 0); - assert(bits % (8 * bytesPerRow) == 0); - - const int ONE_ROW = bits == (8 * bytesPerRow); - const int BYTES_PER_ROW = bits/(8 * bytesPerRow); - - - col witness freeInA[bytesPerRow], freeInB[bytesPerRow], freeInC[bytesPerRow]; - col witness op; - col witness carry[bytesPerRow]; - col witness result; - - if (!ONE_ROW) { - col fixed RESET = [1,0:(BYTES_PER_ROW-1)]...; - - // RESET 1,0,0...0,0|1,0,0...0,0|1,0,.... - // result 0,0,0...0,1|0,0,0...0,1|0,0,.... - // 'result 1,0,0...0,0|1,0,0...0,0|1,0,.... - (1 - RESET) * 'result = 0; - - (opcode - 'opcode) * (1 - RESET) === 0; - cIn' === cOut * (1 - RESET' + reset4 * CLK_64_BITS); - } - result * (1 - result) = 0; - - for (int index = 0; index < length(carry); index += 1) { - carry[index] * (1 - carry[index]) === 0; - } - - col witness previousAreLt4; - col witness usePreviousAreLt4; - col witness reset4; - col witness useCarry; - - previousAreLt4 * (1 - previousAreLt4) === 0; - usePreviousAreLt4 * (1 - usePreviousAreLt4) === 0; - reset4 * (1 - reset4) === 0; - useCarry * (1 - useCarry) === 0; - cOut * (1 - cOut) === 0; - - // RESET = Global.CLK32[0] + Global.CLK32[16]; - - - // LT4_PROPAGATE (polynomial made up of constant, binary and disjoint polynomials, therefore it's a constant and binary polynomial) - // - // Each 4 clocks this sm has processed 8 bytes = 64 bits, last clock isn't relevant last clock cOut is ignored because: - // · last cout = 0 => means LT4 = 0 (if the last chunk of a isn't lower than the last of b then we are done). - // · last cout = 1 => means last a chunk is less than b, in this path result only deepends of ge4 value. - - const expr LT4_PROPAGATE = /* NO 0-2,3 */ Global.CLK32[4] + Global.CLK32[5] + Global.CLK32[6] + /* NO 7 */ + Global.CLK32[8] + Global.CLK32[9] - + Global.CLK32[10] + /* NO 11 */ + Global.CLK32[12] + Global.CLK32[13] + Global.CLK32[14] + Global.CLK32[15] - /* NO 16-18,19 */ + Global.CLK32[20] + Global.CLK32[21] + Global.CLK32[22] + /* NO 23 */ + Global.CLK32[24] + Global.CLK32[25] - + Global.CLK32[26] + /* NO 27 */ + Global.CLK32[28] + Global.CLK32[29] + Global.CLK32[30] + Global.CLK32[31]; - - previousAreLt4' === (Global.CLK32[3] + Global.CLK32[19]) * cOut + previousAreLt4 * (LT4_PROPAGATE + (Global.CLK32[7] + Global.CLK32[11] + Global.CLK32[23] + Global.CLK32[27]) * cOut); - - lCout' === cOut + usePreviousAreLt4 * (previousAreLt4 - cOut); - lOpcode' === opcode; - - // P_FLAGS = cOut + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4 - // In even byte clocks, useCarry = usePreviousAreLt4 = 0 and cOut = cMiddle, therefore P_FLAGS = cMiddle + 8 * reset4 - - const int LAST_INDEX = bytesPerRow - 1; - for (int index = 0; index < LAST_INDEX; index += 1) { - lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[ 0, opcode, freeInA[index], freeInB[index], carry[index], freeInC[index], carry[index + 1] + 8 * reset4]); - } - lookup_assumes(BINARY_OPS_TABLE_ID ,1 ,[result', opcode, freeInA[LAST_INDEX], freeInB[LAST_INDEX], carry[LAST_INDEX], freeInC[LAST_INDEX], carry[LAST_INDEX+1] + 2 * useCarry + 4 * usePreviousAreLt4 + 8 * reset4]); - - useCarry * usePreviousAreLt4 === 0; - - expr a,b,c; - for (int clk = 0; clk < 4; clk += 1 ) { - for (int index = 0; index < 4; index += ) { - a += freeInA[] - } - } - // - // a === freeInA[0] + 2**8 * freeInA[1] + 2**16 * freeInA[2] + 2**24 * freeInA[3]; - // b === freeInB[0] + 2**8 * freeInB[1] + 2**16 * freeInB[2] + 2**24 * freeInB[3]; - - // TODO: verify on each 8 clocks - // c === useCarry * cOut + usePreviousAreLt4 * previousAreLt + (1 - useCarry - usePreviousAreLt4) * (freeInC[0] + 2**8 * freeInC[1] + 2**16 * freeInC[2] + 2**24 * freeInC[3]); - - // In the last byte, when useCarry or usePreviousAreLt4 are 1, the value of c[0] needs to change - // to result (0 or 1). In the first clock, freeInC must be changed to match with the lookup - // because lookup is a static table (has a 0 for comparators), but useCarry or - // usePreviousAreLt4 are dynamic. Otherwise, useCarry and usePreviousAreLt4 are enabled only in the last byte - // (verified lookup only enabled when P_LAST = 1). - - // In the last byte, only FACTOR[7] is active, and freeInC only affects to c[7]'. - - pol c7Temp = c[7] * (1 - RESET) + freeInC[0] * FACTOR[7] + 256 * freeInC[1] * FACTOR[7]; - c[7]' = (1 - useCarry - usePreviousAreLt4) * c7Temp; -} - diff --git a/test/pil2/zkevm-etrog/binary_one_row.pil b/test/pil2/zkevm-etrog/binary_one_row.pil index 22b5835..a0c7500 100644 --- a/test/pil2/zkevm-etrog/binary_one_row.pil +++ b/test/pil2/zkevm-etrog/binary_one_row.pil @@ -36,7 +36,7 @@ // 16 │ 2 │ 8 + 4*16 = 76 │ 152 │ 16 │ 3 │ // 32 │ 1 │ 8 + 4*32 = 136 │ 136 │ 32 │ 2 │ -const int BINARY_ID = 1; +const int BINARY_ID = 20; subproof aggregate Binary(2**21, 2**23, 2**25) { diff --git a/test/pil2/zkevm-etrog/binary_ops_table.pil b/test/pil2/zkevm-etrog/binary_ops_table.pil index 3ca8a04..817e1a0 100644 --- a/test/pil2/zkevm-etrog/binary_ops_table.pil +++ b/test/pil2/zkevm-etrog/binary_ops_table.pil @@ -10,7 +10,7 @@ // XOR (OP:7) // LT4 (OP:8) -const int BINARY_OPS_TABLE_ID = 1; +const int BINARY_OPS_TABLE_ID = 21; subproof aggregate BinaryOpsTable(2**23) { diff --git a/test/pil2/zkevm-etrog/bits2field.pil b/test/pil2/zkevm-etrog/bits2field.pil deleted file mode 100644 index cba76c0..0000000 --- a/test/pil2/zkevm-etrog/bits2field.pil +++ /dev/null @@ -1,13 +0,0 @@ -include "keccakf.pil"; - -namespace Bits2Field(%N); - pol constant FieldLatch; // [0:44,1] - pol constant Factor; // 1,2,4,8,...,2**43 - - pol commit bit; - pol commit field44; - - field44' = (1-FieldLatch)*field44 + bit*Factor; - bit *(1-bit) = 0; - - FieldLatch*(field44 - KeccakF.a44) = 0; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/bits2field_sha256.pil b/test/pil2/zkevm-etrog/bits2field_sha256.pil deleted file mode 100644 index 1d39599..0000000 --- a/test/pil2/zkevm-etrog/bits2field_sha256.pil +++ /dev/null @@ -1,13 +0,0 @@ -include "sha256f.pil"; - -namespace Bits2FieldSha256(%N); - pol constant FieldLatch; // [0:6,1] - pol constant Factor; // 1,2,4,8,...,2**10 - - pol commit bit; - pol commit packField; - - packField' = (1-FieldLatch)*packField + bit'*Factor'; - bit *(1-bit) = 0; - - FieldLatch*(packField - Sha256F.input[0]) = 0; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/climb_key.pil b/test/pil2/zkevm-etrog/climb_key.pil index bab1d13..06a255d 100644 --- a/test/pil2/zkevm-etrog/climb_key.pil +++ b/test/pil2/zkevm-etrog/climb_key.pil @@ -1,4 +1,4 @@ -const int CLIMB_KEY_ID = 10; +const int CLIMB_KEY_ID = 92; // ClimbKey // @@ -10,7 +10,7 @@ const int CLIMB_KEY_ID = 10; // usage: // multiset_assumes(CLIMB_KEY_ID, selector, [keyIn[0], keyIn[1], keyIn[2], keyIn[3], level, bit, keyOut[0], keyOut[1], keyOut[2], keyOut[3]]); -subproof ClimbKey(2**16, 2**20) { +subproof ClimbKey(2**16) { // keyIn goldilock with 4 input keys, one by clock (CLK[i]: keyIn = keyIn[i]) col witness keyIn; diff --git a/test/pil2/zkevm-etrog/climb_key_table.pil b/test/pil2/zkevm-etrog/climb_key_table.pil index 192062d..b63f74d 100644 --- a/test/pil2/zkevm-etrog/climb_key_table.pil +++ b/test/pil2/zkevm-etrog/climb_key_table.pil @@ -1,5 +1,5 @@ -const int CLIMB_KEY_TABLE_ID = 10; +const int CLIMB_KEY_TABLE_ID = 93; subproof ClimbKeyTable(2**21) { diff --git a/test/pil2/zkevm-etrog/config.pil b/test/pil2/zkevm-etrog/config.pil deleted file mode 100644 index 1a40364..0000000 --- a/test/pil2/zkevm-etrog/config.pil +++ /dev/null @@ -1 +0,0 @@ -constant %N = 2**23; \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/global.pil b/test/pil2/zkevm-etrog/global.pil deleted file mode 100644 index e2cff71..0000000 --- a/test/pil2/zkevm-etrog/global.pil +++ /dev/null @@ -1,23 +0,0 @@ -namespace Global(%N); - constant %GL_H = 0xFFFFFFFF; - constant %GL_L = 0x00000001; - - pol constant L1; // 1, 0, 0, 0, 0, - pol constant LLAST; // 0,0,0,0,0, ...., 0, 1 - pol constant BYTE; - pol constant BYTE_2A; - pol constant BYTE2; - pol constant CLK32[32]; // [0] = 1, 0:31 (cyclic) - // [1] = 0, 1, 0:30 (cyclic) - // [7] = 0:31, 1 (cyclic) - - pol constant BYTE_FACTOR[8]; // [0] = 1,256,256**2,256**3, 0:28 (cyclic) - // [1] = 0:4, 1,256,256**2,256**3, 0:24 (cyclic) - // [7] = 0:28, 1,256,256**2,256**3 (cyclic) - - /////// Constant Polynomials - pol constant STEP; // 0, 1, 2, 3, ...... N-1 - - // STEP32 = 0,1,2,...,30,31,0,1,2,... - pol constant STEP32; // [0..32] - diff --git a/test/pil2/zkevm-etrog/keccakf.pil b/test/pil2/zkevm-etrog/keccakf.pil index 5ffeb62..8d0c988 100644 --- a/test/pil2/zkevm-etrog/keccakf.pil +++ b/test/pil2/zkevm-etrog/keccakf.pil @@ -1,21 +1,44 @@ -include "global.pil"; +include "tools.pil" +include "keccakf_table.pil" +const int KECCAKF_ID = 56 -namespace KeccakF(%N); +subproof KeccakF(2**23) { - pol constant ConnA, ConnB, ConnC, GateType, kGateType, kA, kB, kC; - pol commit a[4], b[4], c[4]; + const int bits = 11; + const int chunks = 4; - pol a44 = a[3] * 2**33 + a[2] * 2**22 + a[1] * 2**11 + a[0]; - pol b44 = b[3] * 2**33 + b[2] * 2**22 + b[1] * 2**11 + b[0]; - pol c44 = c[3] * 2**33 + c[2] * 2**22 + c[1] * 2**11 + c[0]; + col fixed GATE_TYPE; + col witness in1Chunk[chunks], in2Chunk[chunks], outChunk[chunks]; + + const int FACTOR = 2**bits; + expr _in1,_in2,_out; + for (int chunk = chunks - 1; chunk >= 0; chunk -= 1) { + lookup_assumes(KECCAKF_TABLE_ID, 1, [GATE_TYPE, in1Chunk[chunk], in2Chunk[chunk], outChunk[chunk]]); + _in1 = _in1 * FACTOR + in1Chunk[chunk]; + _in2 = _in2 * FACTOR + in2Chunk[chunk]; + _out = _out * FACTOR + outChunk[chunk]; + } + const expr in1 = _in1; + const expr in2 = _in2; + const expr out = _out; - {a44, b44, c44} connect {ConnA, ConnB, ConnC}; + col fixed FIELD_LATCH = [0:44,1]...; + col fixed L1 = [1,0...]; + col witness bit; - { GateType, a[0], b[0], c[0] } in { kGateType, kA, kB, kC } ; - { GateType, a[1], b[1], c[1] } in { kGateType, kA, kB, kC } ; - { GateType, a[2], b[2], c[2] } in { kGateType, kA, kB, kC } ; - { GateType, a[3], b[3], c[3] } in { kGateType, kA, kB, kC } ; + expr bitToField = 0; + for (int index = 0; index < bits; ++index) { + bitToField += (bits - index - 1)'bit * 2**index; + } - Global.L1 * a44 = 0; - Global.L1 * (2**44-1-b44) = 0; \ No newline at end of file + bit *(1-bit) === 0; + FIELD_LATCH * (bitToField - in1) === 0; + + // TODO: connections + // col constant ConnA, ConnB, ConnC, GateType; + // {in1, in2, out} connect {ConnA, ConnB, ConnC}; + + L1 * in1 === 0; // [L1] in1 == 0000...0000 + L1 (2**(bits*chunks)-1-in2) === 0; // [L1] in2 == 1111...1111 +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/keccakf_table.pil b/test/pil2/zkevm-etrog/keccakf_table.pil new file mode 100644 index 0000000..7bb7cd2 --- /dev/null +++ b/test/pil2/zkevm-etrog/keccakf_table.pil @@ -0,0 +1,24 @@ +const int KECCAKF_TABLE_ID = 57 + +subproof KeccakFTable(2**23) { + const int bits = 11; + const int TO = (2**bits) - 1; + const int MASK = (2**bits) - 1; + const int TO2 = 2 * TO; + + col fixed GATE_TYPE = [0,1]...; + col fixed IN1 = [0:TO2..TO:TO2]...; + col fixed IN2 = [0:2..TO:2]...; + col fixed OUT; + // col fixed OUT = [IN1^IN2,(IN1^MASK) & IN2]...; + + for (int irow = 0; irow < N; irow = irow + 2) { + OUT[irow] = IN1[irow] ^ IN2[irow]; + OUT[irow+1] = (IN1[irow+1] ^ MASK) & IN2[irow+1]; + } + // GATE_TYPE: 1 bits + // IN1: 11 bits + // IN2: 11 bits + // TOTAL: 23 bits + lookup_proves(KECCAKF_TABLE_ID, 1, [GATE_TYPE, IN1, IN2, OUT]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/main.pil b/test/pil2/zkevm-etrog/main.pil index 240a6e9..77d9ff6 100644 --- a/test/pil2/zkevm-etrog/main.pil +++ b/test/pil2/zkevm-etrog/main.pil @@ -1,6 +1,5 @@ -// include "config.pil"; -// include "global.pil"; -// include "rom.pil"; +include "tools.pil" +include "rom.pil" // include "mem_align.pil"; // include "arith.pil"; // include "binary.pil"; @@ -10,29 +9,27 @@ // include "padding_kk.pil"; // include "mem.pil"; // include "padding_sha256.pil"; -include "tools.pil" // hash bytes // assumeFREE // BitRange32 // memAlign // freeBits - -const int ARITH_ID = 1; -const int BINARY_ID = 2; -const int MEM_ALIGN_ID = 3; +// TODO: only to compile alone +const int ARITH_ID = 10; +const int BINARY_ID = 20; +const int MEM_ALIGN_ID = 5; const int MEMORY_ID = 4; -const int PADDING_KK_HASH_ID = 5; -const int PADDING_KK_LEN_DIGEST_ID = 6; -const int PADDING_PG_DIGEST_ID = 7; -const int PADDING_PG_HASH_ID = 8; -const int PADDING_PG_LEN_ID = 9; -const int PADDING_SHA256_HASH_ID = 10; -const int PADDING_SHA256_LEN_DIGEST_ID = 11; -const int POSEIDON_G_ID = 12; -const int RANGE32_ID = 13; -const int ROM_ID = 14; -const int STORAGE_ID = 15; +const int PADDING_KK_HASH_ID = 50; +const int PADDING_KK_LEN_DIGEST_ID = 51; +const int PADDING_PG_HASH_ID = 40; +const int PADDING_PG_DIGEST_ID = 41; +const int PADDING_PG_LEN_ID = 42; +const int PADDING_SHA256_HASH_ID = 60; +const int PADDING_SHA256_LEN_DIGEST_ID = 61; +const int POSEIDON_G_ID = 45; +const int RANGE32_ID = 6; +const int STORAGE_ID = 90; const int BINARY_OP_LT4 = 8; @@ -288,19 +285,12 @@ subproof Main(2**23) { setGAS, setHASHPOS, setPC, setRCX, setRR, setSP, setSR]); - multiset_assumes(ROM_ID, 1, [...CONST, inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, - inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR, inRCX, ind, indRR, - inCntArith, inCntBinary, inCntKeccakF, inCntSha256F, - inCntMemAlign, inCntPaddingPG, inCntPoseidonG, - romFlags, offset, incStack, binOp, arithOp, hashBytes, - jmpAddr, elseAddr, zkPC]); - - // multiset_proves(ROM_ID, 1, [...CONST, IN_A, IN_B, IN_C, IN_ROTL_C, IN_D, IN_E, IN_SR, IN_FREE, IN_FREE0, - // IN_CTX, IN_SP, IN_PC, IN_GAS, IN_HASHPOS, IN_STEP, IN_RR, IN_RCX, IND, IND_RR, - // IN_CNT_ARITH, IN_CNT_BINARY, IN_CNT_KECCAK_F, IN_CNT_SHA_256_F, - // IN_CNT_MEM_ALIGN, IN_CNT_PADDING_PG, IN_CNT_POSEIDON_G, - // ROM_FLAGS, OFFSET, INC_STACK, BIN_OP, ARITH_OP, HASH_BYTES, - // JMP_ADDR, ELSE_ADDR, LINE]); + lookup_assumes(ROM_ID, 1, [...CONST, inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, + inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR, inRCX, ind, indRR, + inCntArith, inCntBinary, inCntKeccakF, inCntSha256F, + inCntMemAlign, inCntPaddingPG, inCntPoseidonG, + romFlags, offset, incStack, binOp, arithOp, hashBytes, + jmpAddr, elseAddr, zkPC]); col witness sKeyI[4]; col witness sKey[4]; @@ -426,7 +416,6 @@ subproof Main(2**23) { // MemAlign - // memAlign RD multiset_assumes(MEM_ALIGN_ID, memAlignRD, [0, C[0], ...A, ...B, ...assumeInput, ...zeros, ...zeros]); multiset_assumes(MEM_ALIGN_ID, memAlignWR, [1, C[0], ...A, ...B, ...assumeInput, ...D, ...E]); diff --git a/test/pil2/zkevm-etrog/mem_align.pil b/test/pil2/zkevm-etrog/mem_align.pil index 4741f99..6fd892e 100644 --- a/test/pil2/zkevm-etrog/mem_align.pil +++ b/test/pil2/zkevm-etrog/mem_align.pil @@ -1,5 +1,4 @@ -// subair MemAlign(2**20, 2**23, 2**26) -namespace MemAlign:: { +subproof MemAlign() { /* * OPERATIONS diff --git a/test/pil2/zkevm-etrog/padding_sha256bit.pil b/test/pil2/zkevm-etrog/padding_sha256bit.pil index 00d7720..3f92fe0 100644 --- a/test/pil2/zkevm-etrog/padding_sha256bit.pil +++ b/test/pil2/zkevm-etrog/padding_sha256bit.pil @@ -90,8 +90,22 @@ include "bits2field_sha256.pil"; -namespace PaddingSha256Bit(%N); - pol commit s1, s2; +subproof PaddingSha256Bit(2**23) { + const int bits = 7 + + col fixed FIELD_LATCH = [0:6,1]...; + col witness bit; + + expr bitToField = 0; + for (int index = 0; index < bits; ++index) { + bitToField += (bits - index - 1)'bit * 2**index; + } + + bit *(1-bit) === 0; + FIELD_LATCH * (bitToField - input[0]) === 0; + + + col witness s1, s2; // Input connection rBit -> 1 1 0 1 0 1 1 1 X // Fr8 -> 128 64 32 16 8 4 2 1 0 @@ -137,3 +151,4 @@ namespace PaddingSha256Bit(%N); {s1, s2, Bits2FieldSha256.bit} connect {ConnS1, ConnS2, ConnBits2FieldBit} + diff --git a/test/pil2/zkevm-etrog/rom.pil b/test/pil2/zkevm-etrog/rom.pil index a81480d..c0a0aac 100644 --- a/test/pil2/zkevm-etrog/rom.pil +++ b/test/pil2/zkevm-etrog/rom.pil @@ -1,43 +1,25 @@ -namespace Rom(%N); +const int ROM_ID = 2; - pol constant CONST0; - pol constant CONST1; - pol constant CONST2; - pol constant CONST3; - pol constant CONST4; - pol constant CONST5; - pol constant CONST6; - pol constant CONST7; - pol constant offset; +subproof Rom(2**12) { - pol constant inA, inB, inC, inROTL_C, inD, inE, inSR, inFREE, inFREE0, inCTX, inSP, inPC, inGAS, inHASHPOS, inSTEP, inRR ,inRCX; - pol constant inCntArith, inCntBinary, inCntKeccakF, inCntMemAlign, inCntPaddingPG, inCntPoseidonG, inCntSha256F; - pol constant incStack; - pol constant binOpcode; - pol constant jmpAddr, elseAddr; + const int NR = 8; - pol constant line; + col fixed CONST[NR]; + col fixed OFFSET; + col fixed IN_A, IN_B, IN_C, IN_ROTL_C, IN_D, IN_E, IN_SR, IN_FREE, IN_FREE0, + IN_CTX, IN_SP, IN_PC, IN_GAS, IN_HASHPOS, IN_STEP, IN_RR, IN_RCX, IND, IND_RR, + IN_CNT_ARITH, IN_CNT_BINARY, IN_CNT_KECCAK_F, IN_CNT_SHA_256_F, + IN_CNT_MEM_ALIGN, IN_CNT_PADDING_PG, IN_CNT_POSEIDON_G, + INC_STACK, BIN_OP, ARITH_OP, HASH_BYTES, JMP_ADDR, ELSE_ADDR, LINE; + col fixed FLAGS; - pol constant operations; + // include "rom_compiled.pil"; - /* - comment genereated with: - node tools/pil_pol_table/bits_compose.js "arithEq0,arithEq1,arithEq2,assert,bin,hashK,hashKDigest,hashKLen,hashP,hashPDigest,hashPLen,ind,indRR,isMem,isStack,JMP,JMPC,JMPN,memAlignRD,memAlignWR,memAlignWR8,mOp,mWR,repeat,setA,setB,setC,setCTX,setD,setE,setGAS,setHASHPOS,setPC,setRCX,setRR,setSP,setSR,sRD,sWR,useCTX,useJmpAddr,JMPZ,call,return,hashK1,hashP1,useElseAddr,arithEq3,arithEq4,arithEq5, hashS, hashSDigest, hashSLen, hashS1" - - operations = - 2**0 * arithEq0 + 2**1 * arithEq1 + 2**2 * arithEq2 + 2**3 * assert - + 2**4 * bin + 2**5 * hashK + 2**6 * hashKDigest + 2**7 * hashKLen - + 2**8 * hashP + 2**9 * hashPDigest + 2**10 * hashPLen + 2**11 * ind - + 2**12 * indRR + 2**13 * isMem + 2**14 * isStack + 2**15 * JMP - + 2**16 * JMPC + 2**17 * JMPN + 2**18 * memAlignRD + 2**19 * memAlignWR - + 2**20 * memAlignWR8 + 2**21 * mOp + 2**22 * mWR + 2**23 * repeat - + 2**24 * setA + 2**25 * setB + 2**26 * setC + 2**27 * setCTX - + 2**28 * setD + 2**29 * setE + 2**30 * setGAS + 2**31 * setHASHPOS - + 2**32 * setPC + 2**33 * setRCX + 2**34 * setRR + 2**35 * setSP - + 2**36 * setSR + 2**37 * sRD + 2**38 * sWR + 2**39 * useCTX - + 2**40 * useJmpAddr + 2**41 * JMPZ + 2**42 * call + 2**43 * return - + 2**44 * hashK1 + 2**45 * hashP1 + 2**46 * useElseAddr + 2**47 * arithEq3 - + 2**48 * arithEq4 + 2**49 * arithEq5 + 2**50 * hashS + 2**51 * hashSDigest - + 2**52 * hashSLen + 2**53 * hashS1 - - */ + // repeat_last_source_line(); + lookup_proves(ROM_ID, 1, [...CONST, IN_A, IN_B, IN_C, IN_ROTL_C, IN_D, IN_E, IN_SR, IN_FREE, IN_FREE0, + IN_CTX, IN_SP, IN_PC, IN_GAS, IN_HASHPOS, IN_STEP, IN_RR, IN_RCX, IND, IND_RR, + IN_CNT_ARITH, IN_CNT_BINARY, IN_CNT_KECCAK_F, IN_CNT_SHA_256_F, + IN_CNT_MEM_ALIGN, IN_CNT_PADDING_PG, IN_CNT_POSEIDON_G, + FLAGS, OFFSET, INC_STACK, BIN_OP, ARITH_OP, HASH_BYTES, + JMP_ADDR, ELSE_ADDR, LINE]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/sha256f.pil b/test/pil2/zkevm-etrog/sha256f.pil index d9416b3..202d07d 100644 --- a/test/pil2/zkevm-etrog/sha256f.pil +++ b/test/pil2/zkevm-etrog/sha256f.pil @@ -1,27 +1,43 @@ -include "global.pil"; +include "tools.pil" -namespace Sha256F(%N); +const SHA256F_ID = 66; - pol commit input[3], output; - pol constant kGateType, kA, kB, kC, kOut, kCarryOut; - pol constant Conn[4]; - // 0 -> XOR - // 1 -> CH - // 2 -> MAJ - // 3 -> ADD - pol constant GATE_TYPE; - pol constant CARRY_ENABLED; // 1 WHEN ADD +subproof Sha256F(2**23) { + + const int bits = 7; + const int ONES = (2**bits) - 1; + + col fixed FIELD_LATCH = [0:6,1]...; + col fixed L1 = [1,0...]; + col witness bit; + + expr bitToField = 0; + for (int index = 0; index < bits; ++index) { + bitToField += (bits - index - 1)'bit * 2**index; + } + + bit *(1-bit) === 0; + FIELD_LATCH * (bitToField - input[0]) === 0; + + col witness input[3], output; // GATE_TYPE => script gate sequence // kGateType => type of gate, used to define all combinations of valid values. // input[], output are the witness, gate used in each row defined by GATE_TYPE. - { GATE_TYPE, input[0], input[1], input[2], output, input[2]' * CARRY_ENABLED } in { kGateType, kA, kB, kC, kOut, kCarryOut }; + lookup_assumes(SHA256F_TABLE_ID, 1, [GATE_TYPE, ...input, output, input[2]' * CARRY_ENABLED]); + + col fixed CONN[4]; + col fixed GATE_TYPE; + col fixed CARRY_ENABLED; // 1 WHEN ADD + // TODO: loading circuit with connections + include "sha256f_script.pil" // wires: conections between gates - {input[0], input[1], input[2], output} connect {Conn[0], Conn[1], Conn[2], Conn[3]}; + // {input[0], input[1], input[2], output} connect {Conn[0], Conn[1], Conn[2], Conn[3]}; // signal constant 0 (conect to use constant 0 in gate) - Global.L1 * input[0] = 0; + L1 * input[0] === 0; // signal constant 1 => 1 x 7 = 1111111 (conect to use constant 1 in gate) - Global.L1 * (2**7-1-input[1]) = 0; \ No newline at end of file + L1 * (ONES - input[1]) === 0; +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/sha256f_table.pil b/test/pil2/zkevm-etrog/sha256f_table.pil new file mode 100644 index 0000000..8ba1c1e --- /dev/null +++ b/test/pil2/zkevm-etrog/sha256f_table.pil @@ -0,0 +1,54 @@ +include "tools.pil" + +const int SHA256F_TABLE_ID = 67; + +subproof Sha256FTable(2**23) { + + const int bits = 7; + const int TO = 2**7 - 1; + const int TO4 = 4 * TO; + const int MASK = 2**7 - 1; + + const int GATE_XOR = 0; + const int GATE_CH = 1; + const int GATE_MAJ = 2; + const int GATE_ADD = 3; + + col fixed GATE_TYPE = [GATE_XOR, GATE_CH, GATE_MAJ, GATE_ADD]...; + col fixed IN1 = [0:TO4**2..TO:TO4**2]...; + col fixed IN2 = [0:TO4..TO:TO4]...; + col fixed IN3 = [0:4..TO:4]...; + // TODO: expressions inside fixed definition + // col fixed OUT = [IN1 ^ IN2 ^ IN3, + // (IN1 & IN2) ^ ((MASK ^ IN1) & IN3), + // (IN1 & IN2) ^ (IN1 & IN3) ^ (IN2 & IN3), + // IN1 ^ IN2 ^ IN3]...; + // col fixed CARRY_OUT = [0,0,0,(IN1 & IN2) | (IN1 & IN3) | (IN2 & IN3)]...; + col fixed OUT; + col fixed CARRY_OUT; + + for (int irow = 0; irow < N; irow += 4) { + const int in1 = IN1[irow]; + const int in2 = IN2[irow]; + const int in3 = IN3[irow]; + const int xor = in1 ^ in2 ^ in3; + + // xor + OUT[irow] = xor; + CARRY_OUT[irow] = 0; + + // ch + OUT[irow+1] = (in1 & in2) ^ ((MASK ^ in1) & in3); + CARRY_OUT[irow+1] = 0; + + // maj + OUT[irow+2] = (in1 & in2) ^ (in1 & in3) ^ (in2 & in3); + CARRY_OUT[irow+2] = 0; + + // + OUT[irow+3] = xor; + CARRY_OUT[irow+3] = 0; + } + + lookup_proves(SHA256F_TABLE_ID, 1, [GATE_TYPE, IN1, IN2, IN3, OUT, CARRY_OUT]); +} \ No newline at end of file diff --git a/test/pil2/zkevm-etrog/storage.pil b/test/pil2/zkevm-etrog/storage.pil index 5700e6a..3cb2030 100644 --- a/test/pil2/zkevm-etrog/storage.pil +++ b/test/pil2/zkevm-etrog/storage.pil @@ -2,7 +2,7 @@ include "tools.pil" include "poseidong.pil"; include "climb_key.pil"; -const int STORAGE_ID 10; +const int STORAGE_ID = 90; subproof Storage(2**23) { diff --git a/test/pil2/zkevm-etrog/storage_rom.pil b/test/pil2/zkevm-etrog/storage_rom.pil index 0d5811d..ea35787 100644 --- a/test/pil2/zkevm-etrog/storage_rom.pil +++ b/test/pil2/zkevm-etrog/storage_rom.pil @@ -11,7 +11,7 @@ subproof StorageRom(2**16) { include "storage_rom_compiled.pil"; - fillWithLastSourceLine(); + repeat_last_source_line(); lookup_proves(STORAGE_ROM_ID, 1, [LINE, ROM_FLAGS, CONST0, JMP_ADDRESS, IN_SIBLING_RKEY]); } @@ -27,7 +27,7 @@ private function source(int line, int flags, int const0, int jmpAddress, int inS air.IN_SIBLING_RKEY[line] = inSiblingRkey; } -private function fillWithLastSourceLine() { +private function repeat_last_source_line() { int rline = air.source.lastLine; int line = rline + 1; // #pragma debugger diff --git a/test/pil2/zkevm-etrog/storage_rom_json_to_pil2.js b/test/pil2/zkevm-etrog/tools/storage_rom_json_to_pil2.js similarity index 100% rename from test/pil2/zkevm-etrog/storage_rom_json_to_pil2.js rename to test/pil2/zkevm-etrog/tools/storage_rom_json_to_pil2.js From 1d33f9bbda97537a688ae7ffc63e5a3a5eff8835 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Sun, 25 Feb 2024 19:22:03 +0100 Subject: [PATCH 31/33] WIP in speedup sequences --- build/pil_parser.js | 2 +- src/compiler.js | 54 ++++++++++++---------------- src/pil.js | 9 ++++- src/pil_parser.jison | 3 +- src/processor.js | 40 ++++++++++++++++----- src/reference.js | 4 +++ src/sequence.js | 48 +++++++++++++++++++------ src/values.js | 4 +++ test/pil2/zkevm-etrog/README.md | 62 +++++++++++++++++++-------------- 9 files changed, 145 insertions(+), 81 deletions(-) diff --git a/build/pil_parser.js b/build/pil_parser.js index ef32a49..e9696fc 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -750,7 +750,7 @@ case 294: this.$ = $$[$0-2].insert('and', ExpressionFactory.fromObject($$[$0])) break; case 295: - this.$ = $$[$0-4].insert('if', ExpressionFactory.fromObjects($$[$0-2], $$[$0])) + this.$ = $$[$0-4].insert('if', [ExpressionFactory.fromObject($$[$0-2]), ExpressionFactory.fromObject($$[$0])]) break; case 296: this.$ = $$[$0-2].insert('band', ExpressionFactory.fromObject($$[$0])) diff --git a/src/compiler.js b/src/compiler.js index 19093c6..5771d7b 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -44,9 +44,8 @@ class Compiler { } compile(fileName, config = {}) { const isMain = true; - this.config = config; + this.config = {...config}; this.initContext(); - console.log(config); this.processor = new Processor(this.Fr, this, this.config); if (this.config.namespaces) { this.namespaces = {}; @@ -85,41 +84,17 @@ class Compiler { oldParseError(str, hash); }; pil_parser.Parser.prototype.parseError = myErr; - let parser = new pil_parser.Parser(); const parserPerformAction = parser.performAction; const parserStateInfo = parser.productions_; let compiler = this; - /* - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - ===> - const __symbol_info__ = this.terminals_[symbol] + ( lexer.match && - lexer.match != this.terminals_[symbol] ? ` (${lexer.match})`:''); -console.log('\x1B[93mSTATE '+state+' SYMBOL '+__symbol_info__+" #"+(yylineno + 1)+"\x1B[0m"); - */ + parser.performAction = function (yytext, yyleng, yylineno, yy, yystate, $$, _$ ) { const result = parserPerformAction.apply(this, arguments); const first = _$[$$.length - 1 - parserStateInfo[yystate][1]]; const last = _$[$$.length - 1]; const sourceRef = `${compiler.relativeFileName}:${last.last_line}`; Context.processor.sourceRef = sourceRef; -// if (sourceRef === 'mem_align.pil:48') { -/* if (sourceRef === 'sequence.pil:5') { - console.log(arguments); - console.log(this); - console.log(yy); - console.log(yyleng); - EXIT_HERE; - }*/ - // console.log(`ST_${yystate} ${parserStateInfo[yystate][0]} ${sourceRef}`); if (typeof this.$ !== 'object') { return result; } @@ -134,6 +109,13 @@ console.log('\x1B[93mSTATE '+state+' SYMBOL '+__symbol_info__+" #"+(yylineno + 1 } parseSource(fileName, isMain = false, options = {}) { + let libraries = []; + if (isMain && this.config.includes) { + this.fileDir = process.cwd(); + for (const include of this.config.includes) { + libraries.push({type: 'include', file: include, debug:'', contents: this.loadInclude({file: include})}); + } + } const [_src, fileDir, fullFileName, relativeFileName] = this.loadSource(fileName, isMain. options); const preSrc = options.preSrc ?? ''; @@ -144,11 +126,19 @@ console.log('\x1B[93mSTATE '+state+' SYMBOL '+__symbol_info__+" #"+(yylineno + 1 const parser = this.instanceParser(src, fullFileName); - const sts = parser.parse(src); - - for (let i=0; i 0) { + console.log('C'); console.log(evaluatedIndexes); console.log(this); throw new Error('try to access to index on non-array value'); diff --git a/src/sequence.js b/src/sequence.js index fc5d03a..5d67c8f 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -48,6 +48,10 @@ module.exports = class Sequence { getValue(index) { return this.#values.getValue(index); } + #setValue(index, value) { + ++this.valueCounter; + return this.#values.__setValue(index, value); + } setValue(index, value) { /* assert(this.extendPos >= 0 && (this.maxSize === false || this.extendPos < this.maxSize), `Invalid value of extendPos:${this.extendPos} maxSize:${this.maxSize}`);*/ @@ -82,7 +86,16 @@ module.exports = class Sequence { } _sizeOf(e) { if (e instanceof Expression) return 1; - else return this.router.go(e, '_sizeOf'); + switch (e.type) { + case 'sequence': return this._sizeOfSequence(e); + case 'padding_seq': return this._sizeOfPaddingSeq(e); + case 'seq_list': return this._sizeOfSeqList(e); + case 'repeat_seq': return this._sizeOfRepeatSeq(e); + case 'range_seq': return this._sizeOfRangeSeq(e); + case 'arith_seq': return this._sizeOfArithSeq(e); + case 'geom_seq': return this._sizeOfGeomSeq(e); + } + throw new Error(`Invalid sequence type ${e.type} sizeof`); } _sizeOfSeqList(e) { let size = 0; @@ -122,6 +135,8 @@ module.exports = class Sequence { return [this.e2num(e.from), this.e2num(e.to), fromTimes]; } getTermSeqInfo(e) { + if (e._cache_getTermSeqInfo) return e._cache_getTermSeqInfo; + const t1Times = e.t1.times ? this.toNumber(this.e2num(e.t1.times)): 1; const t2Times = e.t2.times ? this.toNumber(this.e2num(e.t2.times)): 1; const tnTimes = e.tn.times === false ? false : (e.tn.times ? this.toNumber(this.e2num(e.t2.times)): 1); @@ -137,8 +152,8 @@ module.exports = class Sequence { if (t1 === t2) { throw new Error(`In term sequence, t1(${t1}), t2(${t2}) must be different`); } - - return [t1, t2, tn, t1Times]; + e._cache_getTermSeqInfo = [t1, t2, tn, t1Times]; + return e._cache_getTermSeqInfo; } _sizeOfRangeSeq(e) { // TODO review if negative, fe? @@ -173,7 +188,7 @@ module.exports = class Sequence { let value = t1; while (this.extendPos < finalExtendPos) { for (let itimes = 0; itimes < times && this.extendPos < finalExtendPos; ++itimes) { - this.setValue(this.extendPos++,value); + this.#setValue(this.extendPos++,value); } value = value + delta; } @@ -288,7 +303,7 @@ module.exports = class Sequence { while (remaingValues > 0 && itimes > 0) { --remaingValues; --itimes; - this.setValue(this.extendPos, value); + this.#setValue(this.extendPos, value); this.extendPos = this.extendPos + (reverse ? -1:1); } itimes = times; @@ -310,7 +325,7 @@ module.exports = class Sequence { assert(times > 0); while (value <= toValue) { for (let itimes = 0; itimes < times; ++itimes) { - this.setValue(this.extendPos++, value); + this.#setValue(this.extendPos++, value); } value = (value + delta) * ratio; } @@ -338,7 +353,16 @@ module.exports = class Sequence { if (e instanceof Expression) { return this._extendExpr(e); } - return this.router.go(e, '_extend'); + switch (e.type) { + case 'sequence': return this._extendSequence(e); + case 'padding_seq': return this._extendPaddingSeq(e); + case 'seq_list': return this._extendSeqList(e); + case 'repeat_seq': return this._extendRepeatSeq(e); + case 'range_seq': return this._extendRangeSeq(e); + case 'arith_seq': return this._extendArithSeq(e); + case 'geom_seq': return this._extendGeomSeq(e); + } + throw new Error(`Invalid sequence type ${e.type} extend`); } _extendSeqList(e) { let count = 0; @@ -367,7 +391,7 @@ module.exports = class Sequence { let upto = remaingValues >= seqSize ? seqSize : remaingValues; // console.log(`SETTING UPTO ${upto} ${remaingValues} ${seqSize}`); for (let index = 0; index < upto; ++index) { - this.setValue(this.extendPos++, this.#values.getValue(from + index)); + this.#setValue(this.extendPos++, this.#values.getValue(from + index)); } remaingValues = remaingValues - upto; } @@ -375,10 +399,11 @@ module.exports = class Sequence { } _extendExpr(e) { const num = this.e2num(e); - this.setValue(this.extendPos++, num); + this.#setValue(this.extendPos++, num); return 1; } _extendRepeatSeq(e) { + if (e._cache_extendRepeatSeq) return e._cache_extendRepeatSeq; let count = 0; const times = this.e2num(e.times); for (let itime = 0; itime < times; ++itime) { @@ -386,8 +411,9 @@ module.exports = class Sequence { count += this._extend(e.value); // console.log('SETTING POST COUNT '+count); } - return count; - }seq + e._cache_extendRepeatSeq = count; + return e._cache_extendRepeatSeq; + } e2num(e) { if (typeof e === 'bigint' || typeof e === 'number') { return e; diff --git a/src/values.js b/src/values.js index c7e7d77..7a7f5ee 100644 --- a/src/values.js +++ b/src/values.js @@ -31,6 +31,7 @@ module.exports = class Values { return cloned; } cloneValues(cloneEachValue = true) { + console.log('\x1B[1;33m************** CLONEVALUES *****************\x1B[0m'); let _values = this.#values; this.#values = []; for(const _value of _values) { @@ -43,6 +44,9 @@ module.exports = class Values { } this.#values[irow] = value; } + __setValue(irow, value) { + this.#values[irow] = value; + } getValue(irow) { return this.#values[irow]; } diff --git a/test/pil2/zkevm-etrog/README.md b/test/pil2/zkevm-etrog/README.md index 0f2c5ea..c460abd 100644 --- a/test/pil2/zkevm-etrog/README.md +++ b/test/pil2/zkevm-etrog/README.md @@ -1,28 +1,38 @@ -Migration of zkevm pils to current version using vadcops. +### PIL2 Migration |ID|subproof|pil2|tools|executor|notes| |---|----|----|-----|----|----| -|1|main|90%|N/A|0%|| -|2|rom|80%|0%||tool: zkasm => pil| -|4|mem|90%|| -|5|mem_align|80%|| -|6|range_32|50%|| -|10|arith|30%|||pending equation generation and last features added (alias free,diff points)| -|20|binary|95%|| -|20|binary (one_row)|95%|||| -|21|binary_ops_table|95%|N/A|N/A|| -|40-42|padding_pg||| -|45|poseidong|95%|| -|50-52|padding_kk||| -|55|padding_kkbit||| -|56|keccakf||0%||tool: script/circuit => pil| -|57|keccakf_table||| -||bits2field|N/A|||integrated inside keccakf -|60-62|padding_sha256||| -|65|padding_sha256bit||| -|66|sha256f|80%|0%||tool: script/circuit => pil| -|67|sha256f_table||| -||bits2field_sha256|N/A|||integrated inside sha256f -|90|storage|95%|||| -|91|storage_rom|95%|95%|N/A|tool: zkasm => pil| -|92|climb_key|95%|||| -|93|climb_key_table|95%|100%|N/A|tool: validate/generate constants| +|1|main|90%|-|0%|| +|2|rom|80%|0%|-|tool: zkasm => pil| +|4|mem|90%|-|0%|| +|5|mem_align|80%|-|0%|| +|6|range_32|50%|-|0%|| +|10|arith|30%|0%|0%|pending: equation generation from pil and last features added (alias free,diff points)| +|20|binary|90%|-|0%|| +|20|binary (one_row)|90%|-|-|alternative, no generate executor| +|21|binary_ops_table|90%|-|-|| +|40-42|padding_pg|90%|-|0%|| +|45|poseidong|95%|-|0%|| +|50-52|padding_kk|0%|-|0%|| +|55|padding_kkbit|0%|-|0%|| +|56|keccakf|90%|0%|0%|tool: script/circuit => pil| +|57|keccakf_table|90%|-|-|| +||bits2field|-|-|-|deleted, integrated inside keccakf +|60-62|padding_sha256|0%|-|0%|| +|65|padding_sha256bit|10%|-|0%|| +|66|sha256f|80%|0%|0%|tool: script/circuit => pil| +|67|sha256f_table|90%|-|-|| +||bits2field_sha256|-|-|-|deleted, integrated inside sha256f +|90|storage|80%|-|%0|| +|91|storage_rom|100%|100%|-|tool: zkasm => pil| +|92|climb_key|90%|-|0%|| +|93|climb_key_table|100%|100%|-|tool: validate/generate constants| + +### TOOLS +|tool|status|notes| +|---|----|----| +|zkasm_rom2pil|0%|used to generate pil from rom.json| +|equation2pil|0%|generate equation pols with prior/next window| +|keccakf_script2pil|0%|used to generate pil from keccak script json| +|sha256_script2pil|0%|used to generate pil from sha256 script json| +|zkasm_storagerom2pil|100%|used to generate pil from storage-rom.json| +|climbkey_table|100%|used to verify complex climbkey fixed columns| From 0b8e901769b905c9719dfd3eef0afd3e810d8984 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Mon, 26 Feb 2024 23:07:37 +0100 Subject: [PATCH 32/33] WIP - feature switch-case supported --- build/pil_parser.js | 34 +++++++++-- src/pil_parser.jison | 32 ++++++++-- src/processor.js | 94 ++++++++++++++++++++++++++++- src/references.js | 4 +- src/sequence.js | 112 +++++++++++++++++++++++++++++++---- src/transpiler.js | 51 ++++++++++++++++ src/values.js | 3 + tools/benchmark/sequence1.js | 4 ++ tools/benchmark/sequence2.js | 6 ++ tools/benchmark/sequence3.js | 4 ++ tools/benchmark/sequence4.js | 4 ++ tools/benchmark/sequence5.js | 5 ++ tools/benchmark/sequence6.js | 4 ++ tools/eval.js | 16 +++++ 14 files changed, 345 insertions(+), 28 deletions(-) create mode 100644 src/transpiler.js create mode 100644 tools/benchmark/sequence1.js create mode 100644 tools/benchmark/sequence2.js create mode 100644 tools/benchmark/sequence3.js create mode 100644 tools/benchmark/sequence4.js create mode 100644 tools/benchmark/sequence5.js create mode 100644 tools/benchmark/sequence6.js create mode 100644 tools/eval.js diff --git a/build/pil_parser.js b/build/pil_parser.js index e9696fc..dae802f 100644 --- a/build/pil_parser.js +++ b/build/pil_parser.js @@ -77,7 +77,7 @@ var parser = {trace: function trace () { }, yy: {}, symbols_: {"error":2,"all_top_level_blocks":3,"top_level_blocks":4,"lopcs":5,"EOF":6,"top_level_block":7,"CS":8,"subproof_definition":9,"proof_definition":10,"function_definition":11,"include_directive":12,"col_declaration":13,"challenge_declaration":14,"public_declaration":15,"public_table_declaration":16,"proof_value_declaration":17,"subproof_value_declaration":18,"variable_declaration":19,"DEBUGGER":20,"PRAGMA":21,"use_directive":22,"USE":23,"name_reference":24,"no_closed_container_definition":25,"CONTAINER":26,"ALIAS":27,"IDENTIFIER":28,"closed_container_definition":29,"{":30,"declare_block":31,"}":32,"PROOF":33,"statement_block":34,"non_delimited_statement":35,"statement_closed":36,"lcs":37,"statement_no_closed":38,"statement_list":39,"statement_list_closed":40,"declare_list":41,"when_boundary":42,"FIRST":43,"LAST":44,"FRAME":45,"codeblock_closed":46,"WHEN":47,"(":48,"expression":49,")":50,"HINT":51,"data_object":52,"[":53,"data_array":54,"]":55,"function":56,"FUNCTION":57,"PRIVATE":58,"arguments":59,":":60,"return_type_list":61,"return_type":62,"FINAL":63,"SUBPROOF":64,"arguments_list":65,",":66,"DOTS_FILL":67,"argument":68,"basic_type":69,"REFERENCE":70,"type_array":71,"INT":72,"FE":73,"EXPR":74,"CONST":75,"COL":76,"WITNESS":77,"FIXED":78,"CHALLENGE":79,"T_STRING":80,"PROOF_VALUE":81,"SUBPROOF_VALUE":82,"AIR_VALUE":83,"PUBLIC":84,"PUBLIC_TABLE":85,"declare_item":86,"codeblock_no_closed":87,"===":88,"delayed_function_call":89,"constant_definition":90,"data_value":91,"function_call":92,"name_optional_index":93,"multiple_expression_list":94,"delayed_function_event":95,"defined_scopes":96,"AIR":97,"ON":98,"variable_assignment":99,"variable_multiple_assignment":100,"return_statement":101,"CONTINUE":102,"BREAK":103,"in_expression":104,"expression_list":105,"FOR":106,"for_init":107,"variable_assignment_list":108,"IN":109,"WHILE":110,"DO":111,"ONCE":112,"SWITCH":113,"case_body":114,"IF":115,"ELSE":116,"case_list":117,"DEFAULT":118,"case_value":119,"DOTS_RANGE":120,"CASE":121,"for_assignation":122,"INC":123,"name_id":124,"DEC":125,"variable_type_declaration":126,"variable_declaration_list":127,"variable_declaration_item":128,"=":129,"variable_declaration_array":130,"RETURN":131,"assign_operation":132,"+=":133,"-=":134,"*=":135,"left_variable_multiple_assignment_list":136,"left_variable_multiple_assignment":137,"sequence_definition":138,"INCLUDE":139,"flexible_string":140,"stage_definition":141,"STAGE":142,"NUMBER":143,"STRING":144,"TEMPLATE_STRING":145,"sequence_list":146,"sequence":147,"DOTS_ARITH_SEQ":148,"DOTS_GEOM_SEQ":149,"declaration_array":150,"col_declaration_item":151,"col_declaration_ident":152,".":153,"col_declaration_list":154,"AGGREGATE":155,"CONSTANT":156,"EQ":157,"NE":158,"LT":159,"GT":160,"LE":161,"GE":162,"IS":163,"AND":164,"?":165,"B_AND":166,"B_OR":167,"B_XOR":168,"OR":169,"SHL":170,"SHR":171,"!":172,"+":173,"-":174,"*":175,"%":176,"/":177,"\\\\":178,"POW":179,"POSITIONAL_PARAM":180,"casting":181,"'":182,"array_index":183,"expression_index":184,"name_reference_right":185,"$accept":0,"$end":1}, terminals_: {2:"error",6:"EOF",8:"CS",20:"DEBUGGER",21:"PRAGMA",23:"USE",26:"CONTAINER",27:"ALIAS",28:"IDENTIFIER",30:"{",32:"}",33:"PROOF",43:"FIRST",44:"LAST",45:"FRAME",47:"WHEN",48:"(",50:")",51:"HINT",53:"[",55:"]",57:"FUNCTION",58:"PRIVATE",60:":",63:"FINAL",64:"SUBPROOF",66:",",67:"DOTS_FILL",70:"REFERENCE",72:"INT",73:"FE",74:"EXPR",75:"CONST",76:"COL",77:"WITNESS",78:"FIXED",79:"CHALLENGE",80:"T_STRING",81:"PROOF_VALUE",82:"SUBPROOF_VALUE",83:"AIR_VALUE",84:"PUBLIC",85:"PUBLIC_TABLE",88:"===",97:"AIR",98:"ON",102:"CONTINUE",103:"BREAK",106:"FOR",109:"IN",110:"WHILE",111:"DO",112:"ONCE",113:"SWITCH",115:"IF",116:"ELSE",118:"DEFAULT",120:"DOTS_RANGE",121:"CASE",123:"INC",125:"DEC",129:"=",131:"RETURN",133:"+=",134:"-=",135:"*=",139:"INCLUDE",142:"STAGE",143:"NUMBER",144:"STRING",145:"TEMPLATE_STRING",148:"DOTS_ARITH_SEQ",149:"DOTS_GEOM_SEQ",153:".",155:"AGGREGATE",156:"CONSTANT",157:"EQ",158:"NE",159:"LT",160:"GT",161:"LE",162:"GE",163:"IS",164:"AND",165:"?",166:"B_AND",167:"B_OR",168:"B_XOR",169:"OR",170:"SHL",171:"SHR",172:"!",173:"+",174:"-",175:"*",176:"%",177:"/",178:"\\\\",179:"POW",180:"POSITIONAL_PARAM",182:"'"}, -productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[22,2],[25,2],[25,4],[29,5],[29,7],[10,4],[35,1],[35,2],[35,1],[35,2],[39,1],[39,2],[39,1],[40,2],[40,3],[40,3],[40,1],[40,2],[40,2],[40,1],[34,1],[34,0],[31,1],[31,2],[31,0],[37,2],[37,1],[42,1],[42,1],[42,1],[36,1],[36,5],[36,3],[36,4],[36,4],[36,3],[36,1],[36,1],[36,3],[56,2],[56,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[59,1],[59,3],[59,1],[59,0],[65,3],[65,1],[68,2],[68,2],[68,3],[68,3],[69,1],[69,1],[69,1],[69,2],[69,2],[69,2],[69,2],[69,2],[69,1],[69,1],[69,2],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[61,3],[61,1],[71,3],[71,2],[62,1],[62,2],[41,3],[41,1],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[38,1],[38,1],[38,1],[38,1],[38,3],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[91,1],[91,3],[91,3],[52,5],[52,3],[52,3],[52,1],[54,3],[54,1],[92,4],[95,1],[96,1],[96,1],[96,1],[89,7],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[104,1],[104,3],[46,9],[46,7],[46,5],[46,6],[46,6],[46,3],[46,5],[46,5],[46,7],[46,1],[46,1],[114,3],[114,5],[119,3],[119,5],[119,1],[119,3],[117,5],[117,4],[122,1],[122,2],[122,2],[122,2],[122,2],[107,1],[107,1],[107,1],[107,1],[19,1],[19,2],[126,2],[126,2],[126,2],[126,2],[126,2],[126,4],[126,4],[126,4],[126,4],[126,4],[126,4],[126,8],[126,8],[126,8],[126,8],[126,8],[130,2],[130,3],[130,3],[130,4],[128,1],[128,2],[127,3],[127,1],[101,1],[101,2],[101,4],[132,1],[132,1],[132,1],[132,1],[136,3],[136,2],[136,1],[137,3],[137,5],[100,3],[100,5],[99,3],[99,3],[108,3],[108,1],[12,2],[141,4],[141,0],[140,1],[140,1],[138,3],[138,4],[138,5],[138,6],[146,3],[146,5],[146,5],[146,5],[146,9],[146,9],[146,4],[146,4],[146,6],[146,6],[146,1],[146,3],[147,3],[147,3],[147,5],[147,5],[147,7],[147,2],[147,3],[147,1],[94,0],[94,3],[94,5],[94,3],[94,1],[105,4],[105,3],[105,2],[105,1],[150,2],[150,3],[150,3],[150,4],[151,1],[151,2],[152,1],[152,1],[152,1],[152,3],[152,3],[154,3],[154,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[90,4],[90,5],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,5],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,2],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,2],[49,2],[49,1],[49,2],[49,2],[49,2],[49,2],[49,1],[49,1],[49,3],[49,1],[49,1],[49,1],[181,4],[181,4],[181,4],[181,4],[181,4],[181,5],[181,5],[181,5],[181,5],[181,5],[124,2],[124,3],[124,5],[124,3],[124,2],[124,3],[124,5],[124,3],[124,1],[93,1],[93,2],[184,1],[184,3],[184,2],[184,2],[183,4],[183,3],[24,3],[24,3],[24,3],[24,1],[24,3],[24,1],[24,3],[185,3],[185,3],[185,1],[185,1]], +productions_: [0,[3,3],[4,3],[4,0],[5,2],[5,0],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[22,2],[25,2],[25,4],[29,5],[29,7],[10,4],[35,1],[35,2],[35,1],[35,2],[39,1],[39,2],[39,1],[40,2],[40,3],[40,3],[40,1],[40,2],[40,2],[40,1],[34,1],[34,0],[31,1],[31,2],[31,0],[37,2],[37,1],[42,1],[42,1],[42,1],[36,1],[36,5],[36,3],[36,4],[36,4],[36,3],[36,1],[36,1],[36,3],[56,2],[56,3],[11,11],[11,9],[11,7],[11,8],[11,9],[11,9],[59,1],[59,3],[59,1],[59,0],[65,3],[65,1],[68,2],[68,2],[68,3],[68,3],[69,1],[69,1],[69,1],[69,2],[69,2],[69,2],[69,2],[69,2],[69,1],[69,1],[69,2],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[61,3],[61,1],[71,3],[71,2],[62,1],[62,2],[41,3],[41,1],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[86,1],[38,1],[38,1],[38,1],[38,1],[38,3],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[91,1],[91,3],[91,3],[52,5],[52,3],[52,3],[52,1],[54,3],[54,1],[92,4],[95,1],[96,1],[96,1],[96,1],[89,7],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[104,1],[104,3],[46,9],[46,7],[46,5],[46,6],[46,6],[46,3],[46,5],[46,5],[46,7],[46,1],[46,1],[114,3],[114,6],[119,3],[119,5],[119,1],[119,3],[117,5],[117,4],[122,1],[122,2],[122,2],[122,2],[122,2],[107,1],[107,1],[107,1],[107,1],[19,1],[19,2],[126,2],[126,2],[126,2],[126,2],[126,2],[126,4],[126,4],[126,4],[126,4],[126,4],[126,4],[126,8],[126,8],[126,8],[126,8],[126,8],[130,2],[130,3],[130,3],[130,4],[128,1],[128,2],[127,3],[127,1],[101,1],[101,2],[101,4],[132,1],[132,1],[132,1],[132,1],[136,3],[136,2],[136,1],[137,3],[137,5],[100,3],[100,5],[99,3],[99,3],[108,3],[108,1],[12,2],[141,4],[141,0],[140,1],[140,1],[138,3],[138,4],[138,5],[138,6],[146,3],[146,5],[146,5],[146,5],[146,9],[146,9],[146,4],[146,4],[146,6],[146,6],[146,1],[146,3],[147,3],[147,3],[147,5],[147,5],[147,7],[147,2],[147,3],[147,1],[94,0],[94,3],[94,5],[94,3],[94,1],[105,4],[105,3],[105,2],[105,1],[150,2],[150,3],[150,3],[150,4],[151,1],[151,2],[152,1],[152,1],[152,1],[152,3],[152,3],[154,3],[154,1],[13,3],[13,5],[13,4],[13,4],[13,6],[13,6],[14,3],[15,4],[15,2],[16,16],[16,14],[17,2],[18,6],[9,9],[9,8],[9,5],[90,4],[90,5],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,5],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,2],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,2],[49,2],[49,1],[49,2],[49,2],[49,2],[49,2],[49,1],[49,1],[49,3],[49,1],[49,1],[49,1],[181,4],[181,4],[181,4],[181,4],[181,4],[181,5],[181,5],[181,5],[181,5],[181,5],[124,2],[124,3],[124,5],[124,3],[124,2],[124,3],[124,5],[124,3],[124,1],[93,1],[93,2],[184,1],[184,3],[184,2],[184,2],[183,4],[183,3],[24,3],[24,3],[24,3],[24,1],[24,3],[24,1],[24,3],[185,3],[185,3],[185,1],[185,1]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { /* this == yyval */ @@ -354,7 +354,7 @@ case 150: this.$ = { ...$$[$0-1], type: 'once', statements: $$[$0] } break; case 151: - this.$ = $$[$0-4] + this.$ = { type: 'switch', value: $$[$0-2], cases: $$[$0].cases } break; case 152: this.$ = {type:'if', conditions: [{type: 'if', expression: $$[$0-2], statements: $$[$0] }] } @@ -363,7 +363,7 @@ case 153: this.$ = { type:'if', conditions: [{type: 'if', expression: $$[$0-4], statements: $$[$0-2] }, {type: 'else', statements: $$[$0]}]} break; case 157: - this.$ = $$[$0-3]; this.$.cases.push({ else: true, statements: $$[$0-1] }) + this.$ = $$[$0-4]; this.$.cases.push({ default: true, statements: implicit_scope($$[$0-1]) }) break; case 158: case 226: case 252: this.$ = $$[$0-2]; this.$.values.push($$[$0]) @@ -378,10 +378,10 @@ case 161: this.$ = { values: [{ from: $$[$0-2], to: $$[$0] }] } break; case 162: - this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: $$[$0] }) + this.$ = $$[$0-4]; this.$.cases.push({condition: $$[$0-2], statements: implicit_scope($$[$0].statements) }) break; case 163: - this.$ = {cases: [{ condition: $$[$0-2], statements: $$[$0] }]} + this.$ = {cases: [{ condition: $$[$0-2], statements: implicit_scope($$[$0].statements) }]} break; case 165: this.$ = { ...$$[$0], type: 'variable_increment', pre: 1n, post: 0n } @@ -915,7 +915,7 @@ case 357: case 358: break; } }, -table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],21:[1,19],26:$V1,33:[1,21],56:22,57:$V2,58:$V3,63:$V4,64:[1,20],72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,126:31,139:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),o($V0,[2,18]),{28:[1,41],155:[1,40]},{30:[1,42]},{48:[1,43]},{33:[1,45],56:44,57:$Vh,58:$V3,64:[1,46]},{140:48,144:$Vi,145:$Vj},o($Vk,$Vl,{141:51,77:$Vm,78:$Vn,142:$Vo}),o($Vk,$Vl,{141:55,142:$Vo}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:56,154:57},{155:[1,63]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:64},{155:[1,66]},o($Vt,[2,173]),{26:$V1,57:$Vu,72:$V5,73:$V6,74:$V7,80:$Vb,126:67},{24:72,28:[1,69],33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},{57:[1,77]},{24:72,28:$Vz,33:$Vv,53:[1,80],64:$Vw,70:$Vx,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,53:[1,84],64:$Vw,70:$Vx,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,53:[1,87],64:$Vw,70:$Vx,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,53:[1,90],64:$Vw,70:$Vx,97:$Vy,127:88,128:89},{24:72,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{28:[1,93]},{30:[1,95],48:[1,94]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:96,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:$V81,57:$V91,59:163,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,181]},{56:182,57:$Vh,58:$V3},{56:183,57:$Vh,58:$V3},{28:[1,184]},o($Vn1,[2,217]),o($Vo1,[2,220]),o($Vo1,[2,221]),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:186,154:185},o($Vk,$Vl,{141:187,142:$Vo}),o($Vk,$Vl,{141:188,142:$Vo}),{48:[1,189]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:190},o([6,8,20,21,26,32,33,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,139],$Vp1,{150:192,53:$Vq1,129:[1,191]}),o($Vn1,[2,276],{66:$Vr1}),o($Vs1,[2,261]),o($Vs1,[2,262]),o($Vs1,[2,263]),{153:[1,195]},o($Vt1,[2,267]),{48:[1,196]},o($Vn1,[2,279],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1}),{48:[1,197]},o($Vt,[2,174]),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},o([6,8,20,21,26,32,33,53,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,129,139],$Vu1,{48:$Vv1,153:$Vw1}),o($Vt,[2,179],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,200]}),o($Vz1,$VA1,{130:201,53:$VB1}),{153:[1,203]},{153:[1,204]},{153:[1,205]},o($VC1,[2,355],{153:[1,206]}),{28:[1,207]},o($Vt,[2,175],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,208]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},o($VC1,$Vu1,{153:$Vw1}),o($Vt,[2,176],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,211]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},o($Vt,[2,177],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,213]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},o($Vt,[2,178],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,215]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{129:[1,217]},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:218,128:210},{48:[1,219]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:220,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:229,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,230]},{32:[2,39]},{11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:[2,29],33:$Vv,36:232,38:231,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,32:[2,31],37:233},o($VJ1,[2,35],{37:234,8:$VB}),o($VJ1,[2,38],{8:$VK1}),o($VL1,[2,108]),o($VL1,[2,109]),o($VL1,[2,110]),o($VL1,[2,111],{88:[1,236],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VL1,[2,113]),o($VL1,[2,114]),o($VL1,[2,115]),o($VL1,[2,116]),o($VL1,[2,117]),o($VL1,[2,118]),o($VL1,[2,119]),o($VL1,[2,120]),o($VL1,[2,121]),o($V72,[2,49]),{42:261,43:[1,262],44:[1,263],45:[1,264],48:[1,260]},{24:162,28:$Vz,30:[1,265],33:$Vv,48:$VJ,49:267,53:[1,266],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,55]),o($V72,[2,56]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:268,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,45]),o($VL1,[2,137]),o($VL1,[2,138]),o($VL1,[2,139]),o($VL1,[2,140]),o($VL1,[2,141]),o($VL1,[2,142]),o($Vk,$Vl,{141:51,71:270,48:$V82,53:$V92,77:$Vm,78:$Vn,142:$Vo}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:272,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:273,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:274,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o([8,32,88,109,110,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Va2,{132:277,123:$Vb2,125:$Vc2,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:282,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:287,143:$Vi2,180:$Vj2,182:$V71},o($Vo1,[2,317],{182:$Vk2}),o($Vo1,[2,318]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:289,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo1,[2,320]),o($Vo1,[2,321],{182:$Vl2}),o($Vo1,[2,322]),{63:[1,292],95:291},{28:[1,293]},{24:294,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{24:295,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy},{48:[1,296]},{48:[1,297]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:298,36:300,37:301,38:299,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{33:$Vm2,64:$Vn2,96:302,97:$Vo2},{48:[1,306]},{48:[1,307]},o($V72,[2,154]),o($V72,[2,155]),{129:[1,308]},o($VL1,[2,199],{140:136,92:138,181:140,93:155,24:162,124:223,49:309,28:$Vz,33:$Vv,48:$VJ,53:[1,310],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,$Vq2,{48:$Vr2,182:$Vs2}),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:313,97:$Vy},{24:72,28:$Vz,33:$Vv,48:$Vt2,53:[1,316],64:$Vw,70:$Vx,71:315,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,48:$Vu2,53:[1,319],64:$Vw,70:$Vx,71:318,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,48:$Vv2,53:[1,322],64:$Vw,70:$Vx,71:321,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,48:$Vw2,53:[1,325],64:$Vw,70:$Vx,71:324,97:$Vy,127:88,128:89},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:327,136:326,143:$Vi2,180:$Vj2,182:$V71},o($Vx2,[2,342],{183:328,53:[1,329]}),{50:[1,330]},{50:[2,66],66:[1,331]},{50:[2,68]},o($Vy2,[2,71]),{28:[1,332],70:[1,333]},o($Vz2,[2,76]),o($Vz2,[2,77]),o($Vz2,[2,78]),{72:[1,334],73:[1,335],74:[1,336],80:[1,337]},{77:[1,338],78:[1,339]},o($Vz2,[2,84]),o($Vz2,[2,85]),o($Vz2,[2,87]),o($Vz2,[2,88]),o($Vz2,[2,89]),o($Vz2,[2,90]),o($Vz2,[2,91]),o($Vz2,[2,92]),{50:$V81,57:$V91,59:340,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,341]},{48:[1,342]},{48:$Vv1},o($Vt,[2,268],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,343]}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:344},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:346,154:345},{143:[1,347]},o($Vn1,[2,274],{66:$Vr1}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:348,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt1,[2,260],{53:$VA2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:351,55:[1,350],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:352,152:65},{28:[1,353],145:[1,354]},{28:[1,355]},{28:[1,356]},{28:$VB2,145:$VC2,185:357},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,128:360},{24:162,28:$Vz,33:$Vv,48:$VJ,49:361,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vz1,[2,196],{53:[1,362]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:364,55:[1,363],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$VB2,145:$VC2,185:365},{28:$VB2,145:$VC2,185:366},{28:$VB2,145:$VC2,185:367},{28:$VB2,145:$VC2,185:368},{48:[2,59]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:369,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,370],66:$Vx1},o($VD2,$Vy1),{24:162,28:$Vz,33:$Vv,48:$VJ,49:371,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,372],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:373,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,374],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:375,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,376],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:377,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,378],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:379,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,380],66:$VE2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:382,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,254],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,$Va2,{123:$Vb2,125:$Vc2}),{48:$Vt2,53:$V92,71:315},{48:$Vu2,53:$V92,71:318},{48:$Vv2,53:$V92,71:321},{48:$V82,53:$V92,71:270},{48:$Vw2,53:$V92,71:324},{32:[1,383]},o($V0,[2,24]),{8:$VB,32:[2,30],37:384},o($VJ1,[2,32],{37:385,8:$VB}),o($VJ1,[2,37],{8:$VK1}),o($VJ1,[2,36],{8:$VK1}),o($V72,[2,44]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:386,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:387,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:388,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:389,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:390,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:391,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:392,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:393,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{57:$V91,62:394,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:396,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:397,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:398,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:399,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:400,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:401,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:402,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:403,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:404,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:405,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:406,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:407,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:408,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:409,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:410,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:411,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:412,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,46]),o($VG2,[2,47]),o($VG2,[2,48]),{28:$VH2,52:414},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:416,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:[1,421],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{32:[1,422]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:423,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,424],53:$VK2},{55:$VL2},o($Vo1,[2,302]),o($Vo1,[2,310]),o($Vo1,[2,311]),o($Vo1,[2,315]),o($Vo1,[2,316]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:427,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VM2,[2,202],{138:428,53:$VN2}),o($VM2,[2,203]),o($VM2,[2,204]),o($VM2,[2,205]),o($Vo1,[2,313]),o($Vp2,$Vq2,{182:$Vs2}),{182:$Vk2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:430,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$Vl2},o($Vo1,[2,314]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:431,97:$Vy},{50:[1,432],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:433,97:$Vy},{33:$Vm2,64:$Vn2,96:434,97:$Vo2},o([33,64,97],[2,132]),{53:$Vq1,129:[1,435],150:436},o($VL1,[2,20],{130:201,27:[1,437],30:[1,438],53:$VB1,129:$VA1}),o($VL1,[2,19]),{13:443,19:440,24:162,26:$V1,28:$Vz,33:$Vv,48:$Vh2,57:$Vu,64:$Vw,70:$Vx,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,80:$Vb,93:283,97:$Vy,99:441,107:439,124:442,126:31,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:444,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{110:[1,445]},{8:$VB,37:447,110:[1,446]},o([20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,25],{37:448,8:$VB}),o($V72,[2,27]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:449,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,133]),o($VG2,[2,134]),o($VG2,[2,135]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:450,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:451,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,53:[1,453],64:$Vw,70:$Vx,92:452,93:454,97:$Vy},o($VL1,[2,200],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:455,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,333],{48:[1,457],143:[1,456],180:[1,458]}),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,94:459,49:461,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,[2,337]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:462,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,463],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:464,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,465],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:466,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,467],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:468,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,469],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{55:[1,470],66:[1,471]},o($VD2,[2,208]),o($Vx2,[2,343],{53:[1,472]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,120:$VQ2,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:473},{30:[1,477],60:[1,476]},{57:$V91,67:[1,478],68:479,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},o($Vy2,[2,72],{71:480,53:$V92}),o($Vy2,[2,73],{71:481,53:$V92}),o($Vz2,[2,79]),o($Vz2,[2,80]),o($Vz2,[2,81]),o($Vz2,[2,86]),o($Vz2,[2,82]),o($Vz2,[2,83]),{50:[1,482]},{50:$V81,57:$V91,59:483,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{50:$V81,57:$V91,59:484,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:485,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt,[2,270],{66:$Vr1}),o($Vt,[2,271],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,486]}),{50:[1,487]},o($Vn1,[2,275],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:489,55:[1,488],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vs1,[2,255]),{55:[1,490],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vt1,[2,266]),o($Vs1,[2,264]),o($Vs1,[2,265]),{66:[1,491]},{50:[1,492]},o($VC1,[2,354],{153:$VR2}),o($VS2,[2,359]),o($VS2,[2,360]),o([6,8,20,21,26,32,33,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],[2,197]),o($Vn1,[2,184],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:495,55:[1,494],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VT2,[2,191]),{55:[1,496],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VC1,[2,350],{153:$VR2}),o($VC1,[2,351],{153:$VR2}),o($VC1,[2,352],{153:$VR2}),o($VC1,[2,356],{153:$VR2}),o($Vn1,[2,180],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,497]},o($Vn1,[2,181],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,498]},o($Vn1,[2,182],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,499]},o($Vn1,[2,183],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,500]},o($Vn1,[2,185],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,501]},{50:[1,502],66:$VE2},{30:[1,503]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:505,64:$Vw,67:[1,504],70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,253],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V0,[2,283]),o($VJ1,[2,34],{8:$VK1}),o($VJ1,[2,33],{8:$VK1}),o($VL1,[2,112],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,286],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,287],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,288],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,289],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,290],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,291],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,163,164,165,166,167,168,169],[2,292],{157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,[2,293]),o($VV2,[2,97],{71:506,53:$V92}),o($VW2,[2,294],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{60:[1,507],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VW2,[2,296],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,297],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,298],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,299],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,300],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,301],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,303],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,304],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VZ2,[2,305],{179:$V62}),o($VZ2,[2,306],{179:$V62}),o($VZ2,[2,307],{179:$V62}),o($VZ2,[2,308],{179:$V62}),o($Vo1,[2,309]),{50:[1,508],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,51]),{8:$VB,37:447},{32:[1,509],66:$V_2},o($V$2,[2,128],{60:[1,511]}),{55:[1,512],66:$V03},o($VD2,[2,130]),o($V13,[2,122],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{28:$VH2,52:514},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:515,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,54]),o($V72,[2,57]),{50:[1,516],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:517,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,518]},o($V23,[2,96]),o([8,32,50,66,110],[2,213],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([8,32,50,66,109,110],[2,214]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:519,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,523],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vp2,[2,338]),o($Vo1,[2,319],{182:$V43}),o($Vp2,[2,340]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:525,97:$Vy},{24:162,28:$Vz,33:$Vv,48:$VJ,49:526,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:$VA2,129:[1,527]},{28:[1,528]},{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:529,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},{8:[1,539],109:[1,540]},o($V63,[2,169]),o($V63,[2,170]),o($V63,[2,171],{132:277,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),o($V63,[2,172]),{50:[1,541],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{48:[1,542]},{48:[1,543]},o($V72,[2,28]),o($V72,[2,26]),o($V72,[2,150]),{50:[1,544],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,545],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VL1,[2,211]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:546,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:$Vr2},{55:[1,547],66:$VE2},o($Vp2,[2,334]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:548,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,336]),{50:[1,549],66:$V73},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:551,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,250],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{50:[1,552],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:553,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,554],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:555,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,556],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:557,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,558],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:559,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{129:[2,209]},o($VD2,[2,207],{24:162,93:283,124:561,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,67:[1,560],70:$Vx,97:$Vy,143:$Vi2,180:$Vj2,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,120:$VQ2,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:562},{55:[1,563]},{55:[2,344],109:$VM1,120:[1,564],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:565,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,566],57:$V91,62:567,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:568,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[2,67]},o($Vy2,[2,70]),o($Vy2,[2,74],{53:$VK2}),o($Vy2,[2,75],{53:$VK2}),{30:[1,569]},{50:[1,570]},{50:[1,571]},o($Vn1,[2,269],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:572,53:$VN2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,138:573,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vk,[2,218]),o($Vs1,[2,257]),{55:[1,574],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vs1,[2,256]),{28:[1,575]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:576},{28:[1,577],145:[1,578]},o($VT2,[2,193]),{55:[1,579],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VT2,[2,192]),{53:[1,580]},{53:[1,581]},{53:[1,582]},{53:[1,583]},{53:[1,584]},{30:[1,585]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:586,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:587,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,252],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VV2,[2,98],{53:$VK2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:588,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:589,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,52]),{28:[1,590]},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:591,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,53]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:592,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,593],66:$V_2},{55:[1,594],66:$V03},o($Vo1,[2,326]),{50:[1,595],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V23,[2,95]),{55:[1,596],66:$V83},o($VD2,[2,236],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,600],109:$VM1,120:$Vd3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:602,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$V43},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:603,97:$Vy},{48:[1,604]},o($VL1,[2,284],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:$VN2,138:605},o($VL1,[2,21],{30:[1,606]}),{32:[1,607]},{8:$VB,32:[2,41],37:608},o($Ve3,[2,100]),o($Ve3,[2,101]),o($Ve3,[2,102]),o($Ve3,[2,103]),o($Ve3,[2,104]),o($Ve3,[2,105]),o($Ve3,[2,106]),o($Ve3,[2,107]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:609,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:611,53:[1,612],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,104:610,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:613,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:614,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:615,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,617],114:616},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:618,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,619],66:$VE2},o($VL1,[2,201]),{50:[1,620],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,131]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:621,53:[1,622],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,623],66:$VE2},o($Vo1,[2,323]),{50:[1,624],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,324]),{50:[1,625],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,325]),{50:[1,626],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,327]),{50:[1,627],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,628]},o($VD2,[2,206]),{55:[1,629]},o($Vf3,[2,349]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:630,55:[2,346],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[2,347],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{57:$V91,61:631,62:632,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{30:[1,633]},{32:[1,634]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:635,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,636]},{30:[1,637]},o($Vn1,[2,272],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vt,[2,273]),o($Vs1,[2,258]),{50:[1,639],66:[1,638]},o($Vn1,[2,280],{66:$Vr1}),o($VS2,[2,357]),o($VS2,[2,358]),o($VT2,[2,194]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:640,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:641,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:642,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:643,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:644,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:645,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,646]},o($VF2,[2,251],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149],[2,295],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,50]),o($V$2,[2,126],{60:[1,647]}),o($V$2,[2,127]),o($VD2,[2,129]),o($V13,[2,123]),o($V13,[2,124]),o($Vo1,[2,331]),o($Vg3,[2,222],{60:[1,649],67:[1,648]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:651,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,147:650,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:652,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vh3,[2,243]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:653,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:654,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,655],66:$V83},o($Vp2,[2,339]),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,49:461,94:656,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VL1,[2,285]),{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:657,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},o($V72,[2,22]),{8:$VK1,13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,32:[2,42],57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:658,126:31},{8:[1,659],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,660]},{50:[2,143],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:661,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,147]),{50:[1,662],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,663],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,151]),{117:664,121:[1,665]},o([8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,152],{116:[1,666]}),o($VL1,[2,212]),o($Vp2,[2,335]),o($Vy2,[2,247],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:667,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,249]),o($Vo1,[2,328]),o($Vo1,[2,329]),o($Vo1,[2,330]),o($Vo1,[2,332]),{129:[2,210]},o($Vf3,[2,348]),{55:[2,345],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,668],66:[1,669]},o($VD2,[2,94]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:670,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vi3,[2,62]),{32:[1,671]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:672,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:673,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:674,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:[1,675]},{55:[1,676],66:$VE2},{55:[1,677],66:$VE2},{55:[1,678],66:$VE2},{55:[1,679],66:$VE2},{55:[1,680],66:$VE2},{32:[1,681]},o($V0,[2,282]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:682,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,223]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:683,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,226],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,684],109:$VM1,120:$Vd3,148:[1,685],149:[1,686],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,238],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,237],{109:$VM1,120:$Vj3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,239],{60:[1,688],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,244]),{50:[1,689],66:$V73},{32:[1,690]},o($Ve3,[2,99]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,108:691,122:692,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:697,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,698],66:$VE2},o($V72,[2,148]),o($V72,[2,149]),{32:[1,699],118:[1,700],121:[1,701]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:702,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:704,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,705],66:$VE2},{30:[1,706]},{57:$V91,62:707,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{32:[1,708]},o($Vi3,[2,63]),{32:[1,709]},{32:[1,710]},{50:[1,711],66:$VE2},{53:[1,712]},o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($Vt,[2,189]),o($Vt,[2,190]),o($V0,[2,281]),o($V$2,[2,125]),o($Vg3,[2,224],{67:[1,713],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:714,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,232],{140:136,92:138,181:140,93:155,24:162,124:223,49:715,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,233],{140:136,92:138,181:140,93:155,24:162,124:223,49:716,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:717,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:718,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VL1,[2,136]),o($V72,[2,23]),{50:[1,719],66:[1,720]},o($Vy2,[2,216]),o($Vy2,[2,164]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:721,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:722,143:$Vi2,180:$Vj2,182:$V71},{123:[1,723],125:[1,724],129:$Vd2,132:277,133:$Ve2,134:$Vf2,135:$Vg2},o($V72,[2,146]),{50:[2,144]},o($V72,[2,156]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:99,39:725,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:726,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{60:[1,727],66:$Vm3},o($Vn3,[2,160],{109:$VM1,120:[1,729],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,153]),o($Vy2,[2,248]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:730,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,93]),o($Vi3,[2,61]),o($Vi3,[2,64]),o($Vi3,[2,65]),{28:[1,731]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:732,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,225]),o($VD2,[2,227],{109:$VM1,120:$Vj3,148:[1,733],149:[1,734],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,228],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,229],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,241],{60:[1,735],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,240],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:736,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,122:737,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},o($Vy2,[2,165]),o($Vy2,[2,166]),o($Vy2,[2,167]),o($Vy2,[2,168]),{32:[1,738]},{60:[1,739],66:$Vm3},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:740,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:742,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:743,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,744]},{53:[1,745]},{55:[1,746],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,234],{140:136,92:138,181:140,93:155,24:162,124:223,49:747,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,235],{140:136,92:138,181:140,93:155,24:162,124:223,49:748,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:749,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,145]),o($Vy2,[2,215]),o($V72,[2,157]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:750,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo3,[2,163],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:233},o($Vn3,[2,158],{109:$VM1,120:[1,752],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vn3,[2,161],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vi3,[2,60]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:753,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,754]},{60:[1,755],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{60:[1,756],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vh3,[2,242],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo3,[2,162],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:751,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:384},{24:162,28:$Vz,33:$Vv,48:$VJ,49:757,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,758],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:759,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:760,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:761,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn3,[2,159],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:[1,762]},{55:[1,763],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,230],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,231],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:764,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn1,[2,278]),{55:[1,765],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vn1,[2,277])], +table: [o($V0,[2,3],{3:1,4:2}),{1:[3]},o($V0,[2,5],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:8,11:9,12:10,13:11,14:12,15:13,16:14,17:15,18:16,19:17,20:[1,18],21:[1,19],26:$V1,33:[1,21],56:22,57:$V2,58:$V3,63:$V4,64:[1,20],72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,126:31,139:$Vg},{1:[2,1]},o($V0,[2,2]),o($V0,[2,4]),o($V0,[2,6]),o($V0,[2,7]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,17]),o($V0,[2,18]),{28:[1,41],155:[1,40]},{30:[1,42]},{48:[1,43]},{33:[1,45],56:44,57:$Vh,58:$V3,64:[1,46]},{140:48,144:$Vi,145:$Vj},o($Vk,$Vl,{141:51,77:$Vm,78:$Vn,142:$Vo}),o($Vk,$Vl,{141:55,142:$Vo}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:56,154:57},{155:[1,63]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:64},{155:[1,66]},o($Vt,[2,173]),{26:$V1,57:$Vu,72:$V5,73:$V6,74:$V7,80:$Vb,126:67},{24:72,28:[1,69],33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},{57:[1,77]},{24:72,28:$Vz,33:$Vv,53:[1,80],64:$Vw,70:$Vx,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,53:[1,84],64:$Vw,70:$Vx,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,53:[1,87],64:$Vw,70:$Vx,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,53:[1,90],64:$Vw,70:$Vx,97:$Vy,127:88,128:89},{24:72,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{28:[1,93]},{30:[1,95],48:[1,94]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:96,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:$V81,57:$V91,59:163,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,181]},{56:182,57:$Vh,58:$V3},{56:183,57:$Vh,58:$V3},{28:[1,184]},o($Vn1,[2,217]),o($Vo1,[2,220]),o($Vo1,[2,221]),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:186,154:185},o($Vk,$Vl,{141:187,142:$Vo}),o($Vk,$Vl,{141:188,142:$Vo}),{48:[1,189]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:190},o([6,8,20,21,26,32,33,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,139],$Vp1,{150:192,53:$Vq1,129:[1,191]}),o($Vn1,[2,276],{66:$Vr1}),o($Vs1,[2,261]),o($Vs1,[2,262]),o($Vs1,[2,263]),{153:[1,195]},o($Vt1,[2,267]),{48:[1,196]},o($Vn1,[2,279],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1}),{48:[1,197]},o($Vt,[2,174]),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:70,128:71},o([6,8,20,21,26,32,33,53,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,110,129,139],$Vu1,{48:$Vv1,153:$Vw1}),o($Vt,[2,179],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,200]}),o($Vz1,$VA1,{130:201,53:$VB1}),{153:[1,203]},{153:[1,204]},{153:[1,205]},o($VC1,[2,355],{153:[1,206]}),{28:[1,207]},o($Vt,[2,175],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,208]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},o($VC1,$Vu1,{153:$Vw1}),o($Vt,[2,176],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,211]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},o($Vt,[2,177],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,213]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},o($Vt,[2,178],{66:$Vx1}),o($Vt1,$Vy1,{129:[1,215]}),{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{129:[1,217]},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,127:218,128:210},{48:[1,219]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:220,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:229,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,230]},{32:[2,39]},{11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:[2,29],33:$Vv,36:232,38:231,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,32:[2,31],37:233},o($VJ1,[2,35],{37:234,8:$VB}),o($VJ1,[2,38],{8:$VK1}),o($VL1,[2,108]),o($VL1,[2,109]),o($VL1,[2,110]),o($VL1,[2,111],{88:[1,236],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VL1,[2,113]),o($VL1,[2,114]),o($VL1,[2,115]),o($VL1,[2,116]),o($VL1,[2,117]),o($VL1,[2,118]),o($VL1,[2,119]),o($VL1,[2,120]),o($VL1,[2,121]),o($V72,[2,49]),{42:261,43:[1,262],44:[1,263],45:[1,264],48:[1,260]},{24:162,28:$Vz,30:[1,265],33:$Vv,48:$VJ,49:267,53:[1,266],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,55]),o($V72,[2,56]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:268,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,45]),o($VL1,[2,137]),o($VL1,[2,138]),o($VL1,[2,139]),o($VL1,[2,140]),o($VL1,[2,141]),o($VL1,[2,142]),o($Vk,$Vl,{141:51,71:270,48:$V82,53:$V92,77:$Vm,78:$Vn,142:$Vo}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:272,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:273,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:274,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o([8,32,88,109,110,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179],$Va2,{132:277,123:$Vb2,125:$Vc2,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:282,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:287,143:$Vi2,180:$Vj2,182:$V71},o($Vo1,[2,317],{182:$Vk2}),o($Vo1,[2,318]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:289,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo1,[2,320]),o($Vo1,[2,321],{182:$Vl2}),o($Vo1,[2,322]),{63:[1,292],95:291},{28:[1,293]},{24:294,28:$Vz,33:$Vv,53:$VA,64:$Vw,70:$Vx,97:$Vy,128:91},{24:295,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy},{48:[1,296]},{48:[1,297]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:298,36:300,37:301,38:299,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{33:$Vm2,64:$Vn2,96:302,97:$Vo2},{48:[1,306]},{48:[1,307]},o($V72,[2,154]),o($V72,[2,155]),{129:[1,308]},o($VL1,[2,199],{140:136,92:138,181:140,93:155,24:162,124:223,49:309,28:$Vz,33:$Vv,48:$VJ,53:[1,310],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,$Vq2,{48:$Vr2,182:$Vs2}),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:313,97:$Vy},{24:72,28:$Vz,33:$Vv,48:$Vt2,53:[1,316],64:$Vw,70:$Vx,71:315,97:$Vy,127:78,128:79},{24:72,28:$Vz,33:$Vv,48:$Vu2,53:[1,319],64:$Vw,70:$Vx,71:318,97:$Vy,127:82,128:83},{24:72,28:$Vz,33:$Vv,48:$Vv2,53:[1,322],64:$Vw,70:$Vx,71:321,97:$Vy,127:85,128:86},{24:72,28:$Vz,33:$Vv,48:$Vw2,53:[1,325],64:$Vw,70:$Vx,71:324,97:$Vy,127:88,128:89},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:327,136:326,143:$Vi2,180:$Vj2,182:$V71},o($Vx2,[2,342],{183:328,53:[1,329]}),{50:[1,330]},{50:[2,66],66:[1,331]},{50:[2,68]},o($Vy2,[2,71]),{28:[1,332],70:[1,333]},o($Vz2,[2,76]),o($Vz2,[2,77]),o($Vz2,[2,78]),{72:[1,334],73:[1,335],74:[1,336],80:[1,337]},{77:[1,338],78:[1,339]},o($Vz2,[2,84]),o($Vz2,[2,85]),o($Vz2,[2,87]),o($Vz2,[2,88]),o($Vz2,[2,89]),o($Vz2,[2,90]),o($Vz2,[2,91]),o($Vz2,[2,92]),{50:$V81,57:$V91,59:340,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{48:[1,341]},{48:[1,342]},{48:$Vv1},o($Vt,[2,268],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,343]}),{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:344},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:346,154:345},{143:[1,347]},o($Vn1,[2,274],{66:$Vr1}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:348,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt1,[2,260],{53:$VA2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:351,55:[1,350],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:352,152:65},{28:[1,353],145:[1,354]},{28:[1,355]},{28:[1,356]},{28:$VB2,145:$VC2,185:357},{24:72,28:$Vz,33:$Vv,64:$Vw,70:$Vx,97:$Vy,128:360},{24:162,28:$Vz,33:$Vv,48:$VJ,49:361,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vz1,[2,196],{53:[1,362]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:364,55:[1,363],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:$VB2,145:$VC2,185:365},{28:$VB2,145:$VC2,185:366},{28:$VB2,145:$VC2,185:367},{28:$VB2,145:$VC2,185:368},{48:[2,59]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:369,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,370],66:$Vx1},o($VD2,$Vy1),{24:162,28:$Vz,33:$Vv,48:$VJ,49:371,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,372],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:373,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,374],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:375,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,376],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:377,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,378],66:$Vx1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:379,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,380],66:$VE2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:382,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,254],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,$Va2,{123:$Vb2,125:$Vc2}),{48:$Vt2,53:$V92,71:315},{48:$Vu2,53:$V92,71:318},{48:$Vv2,53:$V92,71:321},{48:$V82,53:$V92,71:270},{48:$Vw2,53:$V92,71:324},{32:[1,383]},o($V0,[2,24]),{8:$VB,32:[2,30],37:384},o($VJ1,[2,32],{37:385,8:$VB}),o($VJ1,[2,37],{8:$VK1}),o($VJ1,[2,36],{8:$VK1}),o($V72,[2,44]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:386,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:387,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:388,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:389,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:390,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:391,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:392,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:393,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{57:$V91,62:394,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:396,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:397,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:398,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:399,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:400,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:401,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:402,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:403,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:404,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:405,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:406,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:407,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:408,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:409,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:410,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:411,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:412,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,46]),o($VG2,[2,47]),o($VG2,[2,48]),{28:$VH2,52:414},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:416,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:[1,421],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{32:[1,422]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:423,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,424],53:$VK2},{55:$VL2},o($Vo1,[2,302]),o($Vo1,[2,310]),o($Vo1,[2,311]),o($Vo1,[2,315]),o($Vo1,[2,316]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:427,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VM2,[2,202],{138:428,53:$VN2}),o($VM2,[2,203]),o($VM2,[2,204]),o($VM2,[2,205]),o($Vo1,[2,313]),o($Vp2,$Vq2,{182:$Vs2}),{182:$Vk2},{24:162,28:$Vz,33:$Vv,48:$VJ,49:430,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$Vl2},o($Vo1,[2,314]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:431,97:$Vy},{50:[1,432],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:433,97:$Vy},{33:$Vm2,64:$Vn2,96:434,97:$Vo2},o([33,64,97],[2,132]),{53:$Vq1,129:[1,435],150:436},o($VL1,[2,20],{130:201,27:[1,437],30:[1,438],53:$VB1,129:$VA1}),o($VL1,[2,19]),{13:443,19:440,24:162,26:$V1,28:$Vz,33:$Vv,48:$Vh2,57:$Vu,64:$Vw,70:$Vx,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,80:$Vb,93:283,97:$Vy,99:441,107:439,124:442,126:31,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:444,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{110:[1,445]},{8:$VB,37:447,110:[1,446]},o([20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,116,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,25],{37:448,8:$VB}),o($V72,[2,27]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:449,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VG2,[2,133]),o($VG2,[2,134]),o($VG2,[2,135]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:450,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:451,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,53:[1,453],64:$Vw,70:$Vx,92:452,93:454,97:$Vy},o($VL1,[2,200],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:455,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,333],{48:[1,457],143:[1,456],180:[1,458]}),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,94:459,49:461,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($Vp2,[2,337]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:462,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,463],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:209,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:464,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,465],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:212,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:466,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,467],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:214,128:210},{24:162,28:$Vz,33:$Vv,48:$VJ,49:468,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:[1,469],53:$VK2},{24:72,28:$Vz,33:$Vv,55:$VL2,64:$Vw,70:$Vx,97:$Vy,127:216,128:210},{55:[1,470],66:[1,471]},o($VD2,[2,208]),o($Vx2,[2,343],{53:[1,472]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,120:$VQ2,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:473},{30:[1,477],60:[1,476]},{57:$V91,67:[1,478],68:479,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},o($Vy2,[2,72],{71:480,53:$V92}),o($Vy2,[2,73],{71:481,53:$V92}),o($Vz2,[2,79]),o($Vz2,[2,80]),o($Vz2,[2,81]),o($Vz2,[2,86]),o($Vz2,[2,82]),o($Vz2,[2,83]),{50:[1,482]},{50:$V81,57:$V91,59:483,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{50:$V81,57:$V91,59:484,65:164,67:$Va1,68:166,69:167,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{24:162,28:$Vz,33:$Vv,48:$VJ,49:485,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vt,[2,270],{66:$Vr1}),o($Vt,[2,271],{66:$Vr1}),o($Vt1,$Vp1,{150:192,53:$Vq1,129:[1,486]}),{50:[1,487]},o($Vn1,[2,275],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:489,55:[1,488],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vs1,[2,255]),{55:[1,490],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vt1,[2,266]),o($Vs1,[2,264]),o($Vs1,[2,265]),{66:[1,491]},{50:[1,492]},o($VC1,[2,354],{153:$VR2}),o($VS2,[2,359]),o($VS2,[2,360]),o([6,8,20,21,26,32,33,55,57,58,63,64,66,72,73,74,75,76,79,80,81,82,84,85,109,110,139],[2,197]),o($Vn1,[2,184],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:495,55:[1,494],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VT2,[2,191]),{55:[1,496],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VC1,[2,350],{153:$VR2}),o($VC1,[2,351],{153:$VR2}),o($VC1,[2,352],{153:$VR2}),o($VC1,[2,356],{153:$VR2}),o($Vn1,[2,180],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,497]},o($Vn1,[2,181],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,498]},o($Vn1,[2,182],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,499]},o($Vn1,[2,183],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,500]},o($Vn1,[2,185],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{129:[1,501]},{50:[1,502],66:$VE2},{30:[1,503]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:505,64:$Vw,67:[1,504],70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,253],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V0,[2,283]),o($VJ1,[2,34],{8:$VK1}),o($VJ1,[2,33],{8:$VK1}),o($VL1,[2,112],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,286],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,287],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,288],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,289],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,290],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VU2,[2,291],{170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,109,110,120,139,148,149,163,164,165,166,167,168,169],[2,292],{157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vo1,[2,293]),o($VV2,[2,97],{71:506,53:$V92}),o($VW2,[2,294],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{60:[1,507],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VW2,[2,296],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,297],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,298],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,299],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VW2,[2,300],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VX2,[2,301],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,166:$VW1,167:$VX1,168:$VY1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,303],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VY2,[2,304],{175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VZ2,[2,305],{179:$V62}),o($VZ2,[2,306],{179:$V62}),o($VZ2,[2,307],{179:$V62}),o($VZ2,[2,308],{179:$V62}),o($Vo1,[2,309]),{50:[1,508],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,51]),{8:$VB,37:447},{32:[1,509],66:$V_2},o($V$2,[2,128],{60:[1,511]}),{55:[1,512],66:$V03},o($VD2,[2,130]),o($V13,[2,122],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{28:$VH2,52:514},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,54:515,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:417,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,54]),o($V72,[2,57]),{50:[1,516],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:517,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,518]},o($V23,[2,96]),o([8,32,50,66,110],[2,213],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([8,32,50,66,109,110],[2,214]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:519,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,523],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vp2,[2,338]),o($Vo1,[2,319],{182:$V43}),o($Vp2,[2,340]),{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:525,97:$Vy},{24:162,28:$Vz,33:$Vv,48:$VJ,49:526,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:$VA2,129:[1,527]},{28:[1,528]},{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:529,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},{8:[1,539],109:[1,540]},o($V63,[2,169]),o($V63,[2,170]),o($V63,[2,171],{132:277,129:$Vd2,133:$Ve2,134:$Vf2,135:$Vg2}),o($V63,[2,172]),{50:[1,541],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{48:[1,542]},{48:[1,543]},o($V72,[2,28]),o($V72,[2,26]),o($V72,[2,150]),{50:[1,544],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,545],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VL1,[2,211]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:546,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{48:$Vr2},{55:[1,547],66:$VE2},o($Vp2,[2,334]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:548,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vp2,[2,336]),{50:[1,549],66:$V73},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:551,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,250],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{50:[1,552],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:553,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,554],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:555,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,556],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:557,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[1,558],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:559,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{129:[2,209]},o($VD2,[2,207],{24:162,93:283,124:561,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,67:[1,560],70:$Vx,97:$Vy,143:$Vi2,180:$Vj2,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:474,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,120:$VQ2,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71,184:562},{55:[1,563]},{55:[2,344],109:$VM1,120:[1,564],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:565,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,566],57:$V91,62:567,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:568,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{50:[2,67]},o($Vy2,[2,70]),o($Vy2,[2,74],{53:$VK2}),o($Vy2,[2,75],{53:$VK2}),{30:[1,569]},{50:[1,570]},{50:[1,571]},o($Vn1,[2,269],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:572,53:$VN2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,138:573,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vk,[2,218]),o($Vs1,[2,257]),{55:[1,574],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vs1,[2,256]),{28:[1,575]},{28:$Vp,70:$Vq,97:$Vr,145:$Vs,151:62,152:65,154:576},{28:[1,577],145:[1,578]},o($VT2,[2,193]),{55:[1,579],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VT2,[2,192]),{53:[1,580]},{53:[1,581]},{53:[1,582]},{53:[1,583]},{53:[1,584]},{30:[1,585]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:586,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:587,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VF2,[2,252],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VV2,[2,98],{53:$VK2}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:588,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:589,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,52]),{28:[1,590]},{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:591,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,53]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:592,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,593],66:$V_2},{55:[1,594],66:$V03},o($Vo1,[2,326]),{50:[1,595],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V23,[2,95]),{55:[1,596],66:$V83},o($VD2,[2,236],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,600],109:$VM1,120:$Vd3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:521,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,146:602,147:520,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{182:$V43},{24:162,28:$Vz,33:$Vv,64:$Vw,70:$Vx,93:603,97:$Vy},{48:[1,604]},o($VL1,[2,284],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:$VN2,138:605},o($VL1,[2,21],{30:[1,606]}),{32:[1,607]},{8:$VB,32:[2,41],37:608},o($Ve3,[2,100]),o($Ve3,[2,101]),o($Ve3,[2,102]),o($Ve3,[2,103]),o($Ve3,[2,104]),o($Ve3,[2,105]),o($Ve3,[2,106]),o($Ve3,[2,107]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:609,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:611,53:[1,612],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,104:610,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:613,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:614,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:615,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,617],114:616},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:618,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,619],66:$VE2},o($VL1,[2,201]),{50:[1,620],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,131]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:621,53:[1,622],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,623],66:$VE2},o($Vo1,[2,323]),{50:[1,624],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,324]),{50:[1,625],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,325]),{50:[1,626],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vo1,[2,327]),{50:[1,627],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,628]},o($VD2,[2,206]),{55:[1,629]},o($Vf3,[2,349]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:630,55:[2,346],64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[2,347],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{57:$V91,61:631,62:632,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{30:[1,633]},{32:[1,634]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:635,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{30:[1,636]},{30:[1,637]},o($Vn1,[2,272],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vt,[2,273]),o($Vs1,[2,258]),{50:[1,639],66:[1,638]},o($Vn1,[2,280],{66:$Vr1}),o($VS2,[2,357]),o($VS2,[2,358]),o($VT2,[2,194]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:640,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:641,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:642,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:643,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:644,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:645,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,646]},o($VF2,[2,251],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o([6,8,20,21,26,32,33,50,55,57,58,60,63,64,66,67,72,73,74,75,76,79,80,81,82,84,85,88,110,120,139,148,149],[2,295],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,50]),o($V$2,[2,126],{60:[1,647]}),o($V$2,[2,127]),o($VD2,[2,129]),o($V13,[2,123]),o($V13,[2,124]),o($Vo1,[2,331]),o($Vg3,[2,222],{60:[1,649],67:[1,648]}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:651,53:$V33,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,147:650,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:652,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vh3,[2,243]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:653,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:654,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,655],66:$V83},o($Vp2,[2,339]),o($Vy2,$VO2,{140:136,92:138,181:140,93:155,24:162,124:223,49:461,94:656,28:$Vz,33:$Vv,48:$VJ,53:$VP2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VL1,[2,285]),{13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,31:657,32:$V53,41:530,57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:531,126:31},o($V72,[2,22]),{8:$VK1,13:532,14:533,15:534,16:535,17:536,18:537,19:538,26:$V1,32:[2,42],57:$Vu,72:$V5,73:$V6,74:$V7,75:$V8,76:$V9,79:$Va,80:$Vb,81:$Vc,82:$Vd,84:$Ve,85:$Vf,86:658,126:31},{8:[1,659],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,660]},{50:[2,143],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:661,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,147]),{50:[1,662],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{50:[1,663],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($V72,[2,151]),{117:664,121:[1,665]},o([8,20,21,23,26,28,30,32,33,47,48,51,53,57,58,63,64,70,72,73,74,75,76,79,80,81,82,84,85,97,98,102,103,106,110,111,112,113,115,118,121,123,125,131,139,143,144,145,156,172,173,174,180,182],[2,152],{116:[1,666]}),o($VL1,[2,212]),o($Vp2,[2,335]),o($Vy2,[2,247],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:667,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vy2,[2,249]),o($Vo1,[2,328]),o($Vo1,[2,329]),o($Vo1,[2,330]),o($Vo1,[2,332]),{129:[2,210]},o($Vf3,[2,348]),{55:[2,345],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{55:[1,668],66:[1,669]},o($VD2,[2,94]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:670,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vi3,[2,62]),{32:[1,671]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:672,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:673,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:222,64:$Vw,67:$VD1,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,105:674,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{28:[1,675]},{55:[1,676],66:$VE2},{55:[1,677],66:$VE2},{55:[1,678],66:$VE2},{55:[1,679],66:$VE2},{55:[1,680],66:$VE2},{32:[1,681]},o($V0,[2,282]),{24:162,28:$Vz,30:$VI2,33:$Vv,48:$VJ,49:418,53:$VJ2,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,91:682,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,223]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:683,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,226],{60:$V93,67:$Va3}),o($Vb3,$Vc3,{60:[1,684],109:$VM1,120:$Vd3,148:[1,685],149:[1,686],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,238],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,237],{109:$VM1,120:$Vj3,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,239],{60:[1,688],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,244]),{50:[1,689],66:$V73},{32:[1,690]},o($Ve3,[2,99]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,108:691,122:692,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:697,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,698],66:$VE2},o($V72,[2,148]),o($V72,[2,149]),{32:[1,699],118:[1,700],121:[1,701]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:702,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:704,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,705],66:$VE2},{30:[1,706]},{57:$V91,62:707,69:395,72:$Vb1,73:$Vc1,74:$Vd1,75:$Ve1,76:$Vf1,79:$Vg1,80:$Vh1,81:$Vi1,82:$Vj1,83:$Vk1,84:$Vl1,85:$Vm1},{32:[1,708]},o($Vi3,[2,63]),{32:[1,709]},{32:[1,710]},{50:[1,711],66:$VE2},{53:[1,712]},o($Vt,[2,186]),o($Vt,[2,187]),o($Vt,[2,188]),o($Vt,[2,189]),o($Vt,[2,190]),o($V0,[2,281]),o($V$2,[2,125]),o($Vg3,[2,224],{67:[1,713],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:714,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,232],{140:136,92:138,181:140,93:155,24:162,124:223,49:715,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,233],{140:136,92:138,181:140,93:155,24:162,124:223,49:716,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:717,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:718,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VL1,[2,136]),o($V72,[2,23]),{50:[1,719],66:[1,720]},o($Vy2,[2,216]),o($Vy2,[2,164]),{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:721,143:$Vi2,180:$Vj2,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,124:722,143:$Vi2,180:$Vj2,182:$V71},{123:[1,723],125:[1,724],129:$Vd2,132:277,133:$Ve2,134:$Vf2,135:$Vg2},o($V72,[2,146]),{50:[2,144]},o($V72,[2,156]),{60:[1,725]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:703,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,119:726,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{60:[1,727],66:$Vm3},o($Vn3,[2,160],{109:$VM1,120:[1,729],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,153]),o($Vy2,[2,248]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,32:$VH,33:$Vv,34:730,36:100,37:101,38:99,39:97,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($VD2,[2,93]),o($Vi3,[2,61]),o($Vi3,[2,64]),o($Vi3,[2,65]),{28:[1,731]},{24:162,28:$Vz,33:$Vv,48:$VJ,49:732,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vg3,[2,225]),o($VD2,[2,227],{109:$VM1,120:$Vj3,148:[1,733],149:[1,734],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,228],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,229],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vb3,[2,241],{60:[1,735],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vh3,[2,240],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,35:736,36:300,37:301,38:413,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$Vh2,64:$Vw,70:$Vx,93:283,97:$Vy,99:693,122:737,123:$Vk3,124:696,125:$Vl3,143:$Vi2,180:$Vj2,182:$V71},o($Vy2,[2,165]),o($Vy2,[2,166]),o($Vy2,[2,167]),o($Vy2,[2,168]),{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:99,39:738,40:98,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{60:[1,739],66:$Vm3},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:740,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:742,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:743,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{32:[1,744]},{53:[1,745]},{55:[1,746],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,234],{140:136,92:138,181:140,93:155,24:162,124:223,49:747,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),o($VD2,[2,235],{140:136,92:138,181:140,93:155,24:162,124:223,49:748,28:$Vz,33:$Vv,48:$VJ,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,97:$Vy,123:$V_,125:$V$,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:749,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($V72,[2,145]),o($Vy2,[2,215]),{32:[1,750]},{8:$VB,11:118,12:107,13:103,14:104,15:108,16:109,17:110,18:111,19:122,20:$VC,21:$VD,22:114,23:$VE,24:162,25:113,26:$VF,28:$Vz,29:119,30:$VG,33:$Vv,36:100,37:101,38:741,40:751,46:115,47:$VI,48:$VJ,49:105,51:$VK,53:$VL,56:22,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,87:102,89:106,90:112,92:138,93:155,97:$Vy,98:$VR,99:123,100:124,101:125,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,124:132,125:$V$,126:31,131:$V01,137:153,139:$Vg,140:136,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vo3,[2,163],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:752,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:233},o($Vn3,[2,158],{109:$VM1,120:[1,753],157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vn3,[2,161],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($Vi3,[2,60]),{24:162,28:$Vz,33:$Vv,48:$VJ,49:754,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{53:[1,755]},{60:[1,756],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{60:[1,757],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vh3,[2,242],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($V72,[2,157]),o($Vo3,[2,162],{56:22,126:31,87:102,13:103,14:104,49:105,89:106,12:107,15:108,16:109,17:110,18:111,90:112,25:113,22:114,46:115,11:118,29:119,19:122,99:123,100:124,101:125,124:132,140:136,92:138,181:140,137:153,93:155,24:162,36:232,38:752,20:$VC,21:$VD,23:$VE,26:$VF,28:$Vz,30:$VG,33:$Vv,47:$VI,48:$VJ,51:$VK,53:$VL,57:$V2,58:$V3,63:$V4,64:$Vw,70:$Vx,72:$VM,73:$VN,74:$VO,75:$V8,76:$VP,79:$Va,80:$VQ,81:$Vc,82:$Vd,84:$Ve,85:$Vf,97:$Vy,98:$VR,102:$VS,103:$VT,106:$VU,110:$VV,111:$VW,112:$VX,113:$VY,115:$VZ,123:$V_,125:$V$,131:$V01,139:$Vg,143:$V11,144:$Vi,145:$Vj,156:$V21,172:$V31,173:$V41,174:$V51,180:$V61,182:$V71}),{8:$VB,37:384},{24:162,28:$Vz,33:$Vv,48:$VJ,49:758,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{55:[1,759],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},{24:162,28:$Vz,33:$Vv,48:$VJ,49:760,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:761,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},{24:162,28:$Vz,33:$Vv,48:$VJ,49:762,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn3,[2,159],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{53:[1,763]},{55:[1,764],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($VD2,[2,230],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),o($VD2,[2,231],{109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62}),{24:162,28:$Vz,33:$Vv,48:$VJ,49:765,64:$Vw,70:$Vx,72:$VE1,73:$VF1,74:$VG1,76:$VH1,80:$VI1,92:138,93:155,97:$Vy,123:$V_,124:223,125:$V$,140:136,143:$V11,144:$Vi,145:$Vj,172:$V31,173:$V41,174:$V51,180:$V61,181:140,182:$V71},o($Vn1,[2,278]),{55:[1,766],109:$VM1,157:$VN1,158:$VO1,159:$VP1,160:$VQ1,161:$VR1,162:$VS1,163:$VT1,164:$VU1,165:$VV1,166:$VW1,167:$VX1,168:$VY1,169:$VZ1,170:$V_1,171:$V$1,173:$V02,174:$V12,175:$V22,176:$V32,177:$V42,178:$V52,179:$V62},o($Vn1,[2,277])], defaultActions: {4:[2,1],97:[2,39],165:[2,68],184:[2,58],207:[2,59],470:[2,209],478:[2,67],628:[2,210],698:[2,144]}, parseError: function parseError (str, hash) { if (hash.recoverable) { @@ -1092,6 +1092,28 @@ function insert_expr(e, op, ...values) { return e; }*/ // console.log(`STATE ${state} ${(this.terminals_[symbol] || symbol)}`); +function implicit_scope(statements) { + if (Array.isArray(statements)) { + if (statements.length > 1) { + return {type: 'scope_definition', statements}; + } + statements = statements[0]; + } + if (typeof statements.type === 'undefined') { + return {type: 'scope_definition', ...statements}; + } + if (statements.type === 'code') { + statements.type = 'scope_definition'; + if (!Array.isArray(statements.statements)) { + statements.statements = [statements.statements]; + } + return statements; + } + if (statements.type === 'scope_definition') { + return statements; + } + return {type: 'scope_definition', statements}; +} /* generated by jison-lex 0.3.4 */ var lexer = (function(){ var lexer = ({ diff --git a/src/pil_parser.jison b/src/pil_parser.jison index 59116ee..f5f97d4 100644 --- a/src/pil_parser.jison +++ b/src/pil_parser.jison @@ -192,6 +192,28 @@ function insert_expr(e, op, ...values) { return e; }*/ // console.log(`STATE ${state} ${(this.terminals_[symbol] || symbol)}`); +function implicit_scope(statements) { + if (Array.isArray(statements)) { + if (statements.length > 1) { + return {type: 'scope_definition', statements}; + } + statements = statements[0]; + } + if (typeof statements.type === 'undefined') { + return {type: 'scope_definition', ...statements}; + } + if (statements.type === 'code') { + statements.type = 'scope_definition'; + if (!Array.isArray(statements.statements)) { + statements.statements = [statements.statements]; + } + return statements; + } + if (statements.type === 'scope_definition') { + return statements; + } + return {type: 'scope_definition', statements}; +} %} %start all_top_level_blocks @@ -734,7 +756,7 @@ codeblock_closed { $$ = { ...$2, type: 'once', statements: $3 } } | SWITCH '(' expression ')' case_body - { $$ = $1 } + { $$ = { type: 'switch', value: $3, cases: $5.cases } } | IF '(' expression ')' non_delimited_statement %prec IF_NO_ELSE { $$ = {type:'if', conditions: [{type: 'if', expression: $3, statements: $5 }] } } @@ -754,8 +776,8 @@ case_body : '{' case_list '}' { $$ = $2 } - | '{' case_list DEFAULT statement_list '}' - { $$ = $2; $$.cases.push({ else: true, statements: $4 }) } + | '{' case_list DEFAULT ':' statement_list '}' + { $$ = $2; $$.cases.push({ default: true, statements: implicit_scope($5) }) } ; case_value @@ -774,10 +796,10 @@ case_value case_list : case_list CASE case_value ':' statement_list_closed - { $$ = $1; $$.cases.push({condition: $3, statements: $5 }) } + { $$ = $1; $$.cases.push({condition: $3, statements: implicit_scope($5.statements) }) } | CASE case_value ':' statement_list_closed - { $$ = {cases: [{ condition: $2, statements: $4 }]} } + { $$ = {cases: [{ condition: $2, statements: implicit_scope($4.statements) }]} } ; for_assignation diff --git a/src/processor.js b/src/processor.js index 12be676..38b1d10 100644 --- a/src/processor.js +++ b/src/processor.js @@ -37,7 +37,9 @@ const { log2, getKs, getRoots } = require("./utils.js"); const Hints = require('./hints.js'); const util = require('util'); const Debug = require('./debug.js'); +const Transpiler = require('./transpiler.js'); +const MAX_SWITCH_CASE_RANGE = 512; module.exports = class Processor { constructor (Fr, parent, config = {}) { this.sourceRef = '(processor constructor)'; @@ -49,6 +51,7 @@ module.exports = class Processor { this.scope = new Scope(); this.runtime = new Runtime(); this.context = new Context(this.Fr, this, config); + this.nextStatementTranspile = false; console.log(config); this.scope.mark('proof'); @@ -132,6 +135,8 @@ module.exports = class Processor { this.proto = new ProtoOut(this.Fr); this.proto.setupPilOut('noname'); + + this.transpiler = new Transpiler({processor: this}); } loadBuiltInClass() { const filenames = fs.readdirSync(__dirname + '/builtin'); @@ -223,6 +228,11 @@ module.exports = class Processor { } executeStatement(st) { const __executeStatementCounter = this.executeStatementCounter++; + let activeTranspile = this.nextStatementTranspile; + if (activeTranspile) { + this.transpile = true; + this.nextStatementTranspile = false; + } this.traceLog(`[TRACE] #${__executeStatementCounter} ${st.debug ?? ''} (DEEP:${this.scope.deep})`, '38;5;75'); this.sourceRef = st.debug ? (st.debug.split(':').slice(0,2).join(':') ?? ''):''; @@ -242,12 +252,23 @@ module.exports = class Processor { if (this.breakpoints.includes(st.debug)) { debugger; } - res = this[method](st); + if (this.transpile) { + this.transpiler.transpile(st); + EXIT_HERE; + } else { + res = this[method](st); + } } catch (e) { // console.log([Expression.constructor.name]); console.log("EXCEPTION ON "+st.debug+" ("+this.callstack.join(' > ')+")"); + if (activeTranspile) { + this.transpile = false; + } throw e; } + if (activeTranspile) { + this.transpile = false; + } return res; } execPragma(st) { @@ -276,6 +297,9 @@ module.exports = class Processor { } case 'debugger': debugger; + break; + case 'transpile': + this.nextStatementTranspile = true; break; } @@ -399,6 +423,72 @@ module.exports = class Processor { return res; } } + prepareSwitchCase(s) { + let values = {}; + // s.cases.map((x,i) => {console.log(`#### CASE ${i} ####`); console.log(util.inspect(x.statements, false, 2000, true))}); + for (let index = 0; index < s.cases.length; ++index) { + const _case = s.cases[index]; + if (_case.condition && _case.condition.values) { + for (const value of _case.condition.values) { + if (value instanceof Expression) { + const _key = value.asInt(); + if (typeof values[_key] !== 'undefined') { + throw new Error(`Switch-case value ${_key} duplicated`); + } + values[_key] = index; + } else if (value.from && value.to && value.from instanceof Expression && value.to instanceof Expression) { + const _from = value.from.asInt(); + const _to = value.to.asInt(); + if ((_to - _from) < MAX_SWITCH_CASE_RANGE) { + while (_from <= _to) { + if (typeof values[_from] !== 'undefined') { + throw new Error(`Switch-case value ${_from} duplicated`); + } + values[_from] = index; + ++_from; + } + } else { + throw new Error(`Switch-case range too big ${from}..${to} (${_to-_from}) max: ${MAX_SWITCH_CASE_RANGE}`); + } + } else { + console.log(value); + EXIT_HERE; + } + } + console.log(values); + _case.__cached_values = values; + } else if (_case.default) { + if (typeof values[false] !== 'undefined') { + throw new Error(`Switch-case DEFAULT duplicated`); + } + values[false] = index; + } else { + console.log(_case); + EXIT_HERE; + } + } + s.__cached_values = values; + } + execSwitch(s) { + // switch must cases value must be constant values + // TODO: check no constant variable values + if (!s.__cached_values) { + this.prepareSwitchCase(s); + } + assert(s.value instanceof Expression); + const value = s.value.asInt(); + let caseIndex = false; + if (typeof s.__cached_values[value] !== 'undefined') { + caseIndex = s.__cached_values[value]; + } else if (typeof s.__cached_values[false] !== 'undefined') { + caseIndex = s.__cached_values[false]; + } + if (caseIndex !== false) { + this.scope.push(); + this.execute(s.cases[caseIndex].statements, `SWITCH CASE ${value} ${this.sourceRef}`); + this.scope.pop(); + } + } execWhile(s) { let index = 0; let result = false; @@ -559,7 +649,7 @@ module.exports = class Processor { const [name, indexes, legth] = slist.getRuntimeReference(); } execBreak(s) { - return new BreakCmd();console.log + return new BreakCmd(); } execContinue(s) { return new ContinueCmd(); diff --git a/src/references.js b/src/references.js index 344113c..26bad0d 100644 --- a/src/references.js +++ b/src/references.js @@ -194,7 +194,7 @@ module.exports = class References { const nameInfo = this.decodeName(name); if (name === 'Main.jmp') { console.log(nameInfo); } - console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} ${lengths.length ? '[' + lengths.join(',') + '] ': ''}scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}[type: ${initValue instanceof Object ? initValue.constructor.name : typeof initValue}]`, options); + // console.log(`DECLARE_REFERENCE ${name} ==> ${nameInfo.name} ${type} ${lengths.length ? '[' + lengths.join(',') + '] ': ''}scope:${nameInfo.scope} #${Context.scope.deep} ${initValue}[type: ${initValue instanceof Object ? initValue.constructor.name : typeof initValue}]`, options); let [array, size] = Reference.getArrayAndSize(lengths); if (Debug.active) console.log(name, lengths, array, size); @@ -495,8 +495,6 @@ module.exports = class References { if (reference) break; } if (!reference) { - console.log(name); - console.log(nameInfo); if (typeof defaultValue !== 'undefined') return defaultValue; throw new Exceptions.ReferenceNotFound(names.join(',')); } diff --git a/src/sequence.js b/src/sequence.js index 5d67c8f..892e473 100644 --- a/src/sequence.js +++ b/src/sequence.js @@ -3,6 +3,7 @@ const Router = require("./router.js"); const Expression = require("./expression.js"); const Values = require('./values.js'); const Debug = require('./debug.js'); +const vm = require('vm'); const MAX_ELEMS_GEOMETRIC_SEQUENCE = 300; class SequencePadding { @@ -33,6 +34,7 @@ module.exports = class Sequence { this.extendPos = 0; this.debug = ''; this.valueCounter = 0; + this.varIndex = 0; this.sizeOf(expression); } clone() { @@ -284,7 +286,7 @@ module.exports = class Sequence { const [count, reverse, ti, tf, ratio] = this.getGeomInfo(t1, t2, tn, times, true); return tn === false ? count : count * times; } - _extendGeomSeq(e) { + _extendGeomSeq(e) { const [t1, t2, _tn, times] = this.getTermSeqInfo(e); const [_count, reverse, ti, tf, ratio] = this.getGeomInfo(t1, t2, _tn, times); @@ -331,11 +333,30 @@ module.exports = class Sequence { } return this.extendPos - initialExtendPos; } + _gcodeRangeSeq(e) { + const [fromValue, toValue, times] = this.getRangeSeqInfo(e); + const delta = fromValue > toValue ? -1n:1n; + const v = this.createCodeVariable('_v'); + let code = `for(let ${v}=${fromValue}n;${v}<=${toValue}n;${v}=${v}${delta > 0n?'+'+delta:delta}n){`; + if (times === 1) { + code += `__values.push(${v});}\n`; + } else { + const v2 = this.createCodeVariable(); + code += `for(let ${v2}=0;${v2}<${times};++${v2}){__values.push(${v})}}\n;`; + } + const count = times * (Number((toValue - fromValue) / delta) + 1); + return [code, count]; + } + extend() { if (Debug.active) console.log(this.size); - // this.values = new Array(this.size); this.extendPos = 0; - this._extend(this.expression); + const [code, count] = this._gcode(this.expression); + let __values = []; + const context = {__values} + vm.createContext(context); + vm.runInContext(code, context); + this.#values.__setValues(__values); this.#values.mutable = false; } verify() { @@ -364,6 +385,21 @@ module.exports = class Sequence { } throw new Error(`Invalid sequence type ${e.type} extend`); } + _gcode(e) { + if (e instanceof Expression) { + return this._gcodeExpr(e); + } + switch (e.type) { + case 'sequence': return this._gcodeSequence(e); + case 'padding_seq': return this._gcodePaddingSeq(e); + case 'seq_list': return this._gcodeSeqList(e); + case 'repeat_seq': return this._gcodeRepeatSeq(e); + case 'range_seq': return this._gcodeRangeSeq(e); + case 'arith_seq': return this._gcodeArithSeq(e); + case 'geom_seq': return this._gcodeGeomSeq(e); + } + throw new Error(`Invalid sequence type ${e.type} gcode`); + } _extendSeqList(e) { let count = 0; for(const value of e.values) { @@ -371,10 +407,23 @@ module.exports = class Sequence { } return count; } + _gcodeSeqList(e) { + let count = 0; + let code = e.values.length > 1 ? '{' : ''; + for(const value of e.values) { + const [_code, _count] = this._gcode(value); + count += _count; + code += _code; + } + return [code + (e.values.length > 1 ? '}' : ''), count]; + } _extendSequence(e) { return this._extendSeqList(e); } - _extendPaddingSeq(e) { + _gcodeSequence(e) { + return this._gcodeSeqList(e); + } + _extendPaddingSeq(e) { let from = this.extendPos; let seqSize = this._extend(e.value); let remaingValues = this.paddingSize - seqSize; @@ -397,22 +446,61 @@ module.exports = class Sequence { } return this.paddingSize; } - _extendExpr(e) { + _gcodePaddingSeq(e) { + // TODO: if last element it's a padding, not need to fill and after when access to + // a position applies an module over index. + const [_code, seqSize] = this._gcode(e.value); + let remaingValues = this.paddingSize - seqSize; + if (remaingValues < 0) { + throw new Error(`In padding range must be space at least for one time sequence at ${this.debug}`); + } + if (seqSize < 1) { + console.log(e.value); + throw new Error(`Sequence must be at least one element at ${this.debug}`); + } + if (remaingValues === 0) { + return [_code. seqSize]; + } + let code = `{${_code}`; + if (remaingValues > 0) { + const v1 = this.createCodeVariable(); + const base = this.createCodeVariable('_b'); + code += `let ${base}=__values.length-${seqSize};for (let ${v1}=0;${v1}<${remaingValues};++${v1}){__values.push(__values[${base}+${v1}]);}`; + } + code += '}\n'; + return [code, seqSize + remaingValues]; + } + _extendExpr(e) { const num = this.e2num(e); - this.#setValue(this.extendPos++, num); + this._values[this.extendPos++] = num; return 1; } + _gcodeExpr(e) { + // no cache + const num = this.e2num(e); + return [`__values.push(${num}n);\n`, 1]; + } + createCodeVariable(prefix = '_i') { + return prefix+(++this.varIndex); + } _extendRepeatSeq(e) { - if (e._cache_extendRepeatSeq) return e._cache_extendRepeatSeq; let count = 0; const times = this.e2num(e.times); for (let itime = 0; itime < times; ++itime) { - // console.log('SETTING PRE COUNT '+count); count += this._extend(e.value); - // console.log('SETTING POST COUNT '+count); } - e._cache_extendRepeatSeq = count; - return e._cache_extendRepeatSeq; + return count; + } + _gcodeRepeatSeq(e) { + if (!e.__cache) { + const times = this.e2num(e.times); + const [_code, _count] = this._gcode(e.value); + const v = this.createCodeVariable(); + const code = `for (let ${v}=0;${v}<${times};++${v}){${_code}}`; + const count = _count * Number(times); + e.__cache = [code, count]; + } + return e.__cache; } e2num(e) { if (typeof e === 'bigint' || typeof e === 'number') { @@ -443,4 +531,4 @@ module.exports = class Sequence { } return nvalue; } -} +} \ No newline at end of file diff --git a/src/transpiler.js b/src/transpiler.js new file mode 100644 index 0000000..15c9377 --- /dev/null +++ b/src/transpiler.js @@ -0,0 +1,51 @@ +module.exports = class Transpiler { + constructor(config = {}) { + this.processor = config.processor; + this.config = config; + } + transpile(st) { + console.log(st); + this.declared = {}; + return this.#transpile(st); + } + #transpile(st) { + console.log(st); + switch(st.type) { + case 'for': return this.#transpileFor(st); + case 'code': return this.#transpile(st.statements); + case 'variable_declaration': return this.#transpileVariableDeclaration(st); + } + } + #transpileFor(st) { + let code = '{'; + console.log(st.condition.toString()); + this.#transpile(st.init); + EXIT_HERE; + } + #transpileVariableDeclaration(st) { + let code = ''; + if (st.vtype !== 'string' && st.vtype !== 'int') { + throw new Error(`declaration type ${st.vtype} not supported on transpilation`); + } + console.log(st.items); + console.log(st.init); + code += st.const ? 'const ':'let '; + if (st.init && st.items.length !== st.init.length) { + throw new Error(`declaration type ${st.vtype} not supported on transpilation`); + } + if (st.items.length === 1) { + code += st.items[0].name; + } else { + EXIT_HERE; + } + if (st.init) { + if (st.init.length === 1) { + code += `=${st.init[0].toString()}`; + } else { + EXIT_HERE; + } + } + console.log(code); + return code; + } +} \ No newline at end of file diff --git a/src/values.js b/src/values.js index 7a7f5ee..c59386b 100644 --- a/src/values.js +++ b/src/values.js @@ -53,4 +53,7 @@ module.exports = class Values { toString() { return this.#values.join(); } + __setValues(values) { + this.#values = values; + } } diff --git a/tools/benchmark/sequence1.js b/tools/benchmark/sequence1.js new file mode 100644 index 0000000..b1c1e49 --- /dev/null +++ b/tools/benchmark/sequence1.js @@ -0,0 +1,4 @@ +let __values = []; +for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)} +for(let _i2=0;_i2<16383;++_i2) { __values = __values.concat(__values.slice(-256)); } +console.log(__values.length); diff --git a/tools/benchmark/sequence2.js b/tools/benchmark/sequence2.js new file mode 100644 index 0000000..7a2d325 --- /dev/null +++ b/tools/benchmark/sequence2.js @@ -0,0 +1,6 @@ +let __values = []; +for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)} +let __values1 = [...__values]; +// for(let _i2=0;_i2<16383;++_i2) { __values = __values.concat(__values1); } +for(let _i2=0;_i2<8000;++_i2) { __values = __values.concat(__values1); } +console.log(__values.length); diff --git a/tools/benchmark/sequence3.js b/tools/benchmark/sequence3.js new file mode 100644 index 0000000..5bf0ec4 --- /dev/null +++ b/tools/benchmark/sequence3.js @@ -0,0 +1,4 @@ +let __values = []; +for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)}; +for(let _i2=0;_i2<8000;++_i2) { for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)} } +// console.log(__values.join()); diff --git a/tools/benchmark/sequence4.js b/tools/benchmark/sequence4.js new file mode 100644 index 0000000..7f7104a --- /dev/null +++ b/tools/benchmark/sequence4.js @@ -0,0 +1,4 @@ +let __values = []; +for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)} +for(let _i2=0;_i2<8000;++_i2) {let base = __values.length - 256; for(let _i1=0;_i1<=255;_i1=_i1+1){__values.push(__values[base+_i1])}} +// console.log(__values.join()); diff --git a/tools/benchmark/sequence5.js b/tools/benchmark/sequence5.js new file mode 100644 index 0000000..247fdb6 --- /dev/null +++ b/tools/benchmark/sequence5.js @@ -0,0 +1,5 @@ +let __values = []; +for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)} +let base = __values.length - 256 +for(let _i2=0;_i2<2048000;++_i2) {__values.push(__values[(base+_i2)%255])} +// console.log(__values.join()); diff --git a/tools/benchmark/sequence6.js b/tools/benchmark/sequence6.js new file mode 100644 index 0000000..51d3009 --- /dev/null +++ b/tools/benchmark/sequence6.js @@ -0,0 +1,4 @@ +let __values = []; +for(let _i1=0n;_i1<=255n;_i1=_i1+1n){__values.push(_i1)} +for(let _i2=0;_i2<2048000;++_i2) {__values.push(__values[__values.length - 256])} +// console.log(__values.join()); diff --git a/tools/eval.js b/tools/eval.js new file mode 100644 index 0000000..6f05e1f --- /dev/null +++ b/tools/eval.js @@ -0,0 +1,16 @@ +const vm = require('vm'); + +class C { + runme() { + let a = 10; + let values = []; + console.log('Hi'); + const context = {values} + vm.createContext(context); + console.log(vm.runInContext('values.push(63)', context)); + console.log(values); + } +} + +let c = new C(); +c.runme(); \ No newline at end of file From 98696ff6d119bca5515b5851f4d274ffb3ceb916 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 29 Feb 2024 22:24:58 +0100 Subject: [PATCH 33/33] WIP --- src/expression.js | 5 + src/expression_items/function_call.js | 3 + src/processor.js | 5 +- src/transpiler.js | 172 ++++++++++++++++++++++++-- 4 files changed, 176 insertions(+), 9 deletions(-) diff --git a/src/expression.js b/src/expression.js index a8e6f34..53c237f 100644 --- a/src/expression.js +++ b/src/expression.js @@ -1004,7 +1004,12 @@ class Expression extends ExpressionItem { } else if (st.operands.length === 2) { res = this.operandToString(st.operands[0], pos, st.op, options) + ' ' + operationLabel + ' ' + this.operandToString(st.operands[1], pos, st.op, options); + } else if (st.operands.length === 3 && st.op === 'if') { + res = '(' + this.operandToString(st.operands[0], pos, st.op, options) + ')?('+ + this.operandToString(st.operands[1], pos, st.op, options) + '):(' + + this.operandToString(st.operands[2], pos, st.op, options) + ')'; } else { + console.log(st); TODO_EXIT } if (parentPrecedence > operationInfo.precedence || (parentOperation === 'sub' && st.op !== 'mul')) { diff --git a/src/expression_items/function_call.js b/src/expression_items/function_call.js index 7b8b17a..1039d34 100644 --- a/src/expression_items/function_call.js +++ b/src/expression_items/function_call.js @@ -27,6 +27,9 @@ module.exports = class FunctionCall extends RuntimeItem { setFunction(funcdef) { this.funcdef = funcdef; } + toString(options) { + return this.dump(options); + } dump(options) { const indexes = this.indexes.length > 0 ? '['+this.indexes.join(',')+']':''; const args = '(' + this.args.map(x => x.toString()).join(',') +')'; diff --git a/src/processor.js b/src/processor.js index 38b1d10..7640577 100644 --- a/src/processor.js +++ b/src/processor.js @@ -52,6 +52,7 @@ module.exports = class Processor { this.runtime = new Runtime(); this.context = new Context(this.Fr, this, config); this.nextStatementTranspile = false; + this.nextStatementFixed = false; console.log(config); this.scope.mark('proof'); @@ -301,6 +302,9 @@ module.exports = class Processor { case 'transpile': this.nextStatementTranspile = true; break; + case 'fixed': + this.nextStatementFixed = true; + break; } } @@ -455,7 +459,6 @@ module.exports = class Processor { EXIT_HERE; } } - console.log(values); _case.__cached_values = values; } else if (_case.default) { if (typeof values[false] !== 'undefined') { diff --git a/src/transpiler.js b/src/transpiler.js index 15c9377..f0b5120 100644 --- a/src/transpiler.js +++ b/src/transpiler.js @@ -6,7 +6,10 @@ module.exports = class Transpiler { transpile(st) { console.log(st); this.declared = {}; - return this.#transpile(st); + const code = this.#transpile(st); + console.log(code); + EXIT_HERE; + return code; } #transpile(st) { console.log(st); @@ -14,13 +17,72 @@ module.exports = class Transpiler { case 'for': return this.#transpileFor(st); case 'code': return this.#transpile(st.statements); case 'variable_declaration': return this.#transpileVariableDeclaration(st); + case 'variable_increment': return this.#transpileVariableIncrement(st); + case 'scope_definition': return this.#transpileScopeDefinition(st); + case 'expr': return this.#transpileExpr(st); + case 'switch': return this.#transpileSwitchCase(st); + case 'assign': return this.#transpileAssign(st); + case 'if': return this.#transpileIf(st); } + throw new Error(`not known how transpile ${st.type}`); + } + #transpileIf(st) { + let code = ''; + let first = true; + for (const cond of st.conditions) { + if (cond.type === 'if') { + if (first) code += 'if ('; + else code += 'else if ('; + code += cond.expression.toString() + ')'; + } else if (cond.type === 'else') { + code += ' else '; + } else { + EXIT_HERE; + } + code += this.#transpile(cond.statements); + first = false; + } + return code; + } + #transpileSwitchCase(st) { + let code = 'switch ('+st.value.toString()+') {\n'; + let ccases = []; + console.log(st); + for (const _case of st.cases) { + if (_case.condition.values) { + let cvalues = []; + for (const cvalue of _case.condition.values) { + cvalues.push(cvalue.toString()); + } + code += '\n\tcase '+cvalues.join()+':\n'; + } else if (_case.default) { + code += '\n\tdefault:\n'; + } else { + console.log(_case); + EXIT_HERE; + } + code += this.#transpile(_case.statements)+';\nbreak;\n'; + } + code += '}\n'; + return code; + } + #transpileExpr(st) { + return st.expr.toString(); } #transpileFor(st) { let code = '{'; - console.log(st.condition.toString()); - this.#transpile(st.init); - EXIT_HERE; + const inits = Array.isArray(st.init) ? st.init : [st.init]; + const cinits = []; + for (const init of inits) { + cinits.push(this.#transpile(init)); + } + const cincrements = []; + for (const increment of st.increment) { + cincrements.push(this.#transpile(increment)); + } + code += 'for ('+cinits.join()+';'+st.condition.toString()+';'+cincrements.join()+') {\n'; + code += this.#transpile(st.statements) + '\n}'; + return code; } #transpileVariableDeclaration(st) { let code = ''; @@ -30,22 +92,116 @@ module.exports = class Transpiler { console.log(st.items); console.log(st.init); code += st.const ? 'const ':'let '; - if (st.init && st.items.length !== st.init.length) { - throw new Error(`declaration type ${st.vtype} not supported on transpilation`); + if (st.init) { + const initlen = st.init.type === 'expression_list' ? st.init.values.length : st.init.length; + if (st.items.length !== initlen) { + throw new Error(`mistmatch lengths ${st.items.length} vs ${initlen}`); + } } if (st.items.length === 1) { code += st.items[0].name; } else { - EXIT_HERE; + code += '[' + st.items.map(x => x.name).join() + ']'; } if (st.init) { if (st.init.length === 1) { code += `=${st.init[0].toString()}`; + } else if (st.init.type === 'expression_list') { + const inits = []; + for (const init of st.init.values) { + inits.push(init.toString()); + } + code += '=['+inits.join()+']'; } else { EXIT_HERE; } } - console.log(code); return code; } + f() + {for (let i=0;i < N;++i) { + {let [a,b,cin,plast,c,cout,op]=[A*[i],B*[i],CIN*[i],LAST*[i],0,0,OP*[i]]; + println(i); + switch (op) { + + case 0: + {c=(cin + a + b) & 255; + cout=(cin + a + b) >> 8}; + break; + + case 1: + {cout=((a - cin) >= b)?(0):(1); + c=((256 * cout + a) - cin) - b}; + break; + + case 2,3:{ + if (a < b){ + cout=1; + c=plast + } else if (a == b) { + cout=cin; + c=plast * cin + }; + if (op == 3 && plast && (a & 128) != (b & 128)){ + c=a & 128; + cout=c + } + }; + break; + + case 4: { + if (a == b && !cin) c=plast; else cout=1; + cout=(plast)?(!cout):(cout)}; + break; + + case 5: + {c=a & b; + cout=cin || c}; + break; + + case 6: + {c=a | b}; + break; + + case 7: + {c=a ^ b}; + break; + } + ; + C[i]=c; + COUT[i]=c} + } + } + #transpileReference(ref) { + let code = ref.name; + if (!ref.dim) { + return code; + } + const cindexes = []; + for (const index of ref.indexes) { + cindexes.push(index.toString()); + } + return code + '['+ cindexes.join('][')+']'; + } + #transpileAssign(st) { + return this.#transpileReference(st.name) + '=' + st.value.toString(); + } + #transpileVariableIncrement(st) { + if (!st.dim) { + if (st.pre === 1n) { + return '++'+st.name; + } + if (st.post === 1n) { + return st.name+'++'; + } + } + throw new Error(`Traspilation not supported by pre:${st.pre}, post:${st.post}, dim:${dim}`); + } + #transpileScopeDefinition(st) { + let codes = []; + for (const statement of st.statements) { + codes.push(this.#transpile(statement)); + } + return '{'+codes.join(';\n')+'}'; + } } \ No newline at end of file