//################################################################################ // create_append_paragraph // output_markdown, output_paragraph //################################################################################ #include #include #include "markdown.h" //################################################################################ // string utilities //################################################################################ inline int is_chars(int mychar,const char* chars) { return strchr(chars,mychar)!=NULL; } inline int is_same_char_line(MyTSchar& buffer,int start,int end, int allow_spaces,int min_chars) { int num_chars=1; for(int i=start+1;i<=end;i++){ if(is_chars(buffer[i]," \t")){ if(allow_spaces==0) return 0; } else if(buffer[i]!=buffer[start]){ return 0; } else { num_chars++; } } if(num_chars>=min_chars) return 1; else return 0; } inline int num_same_char_line_prefix(MyTSchar& buffer,int start,int end, int allow_spaces) { int num_chars=1; for(int i=start+1;i<=end;i++){ if(is_chars(buffer[i],Unicode_space_g_)){ if(allow_spaces==0) break; } else if(buffer[i]!=buffer[start]){ break; } else { num_chars++; } } return num_chars; } inline int link_label_name(MyTSchar& buffer,int startB,MyTSchar& name) { int start=-1,end=-1; for(int i=startB;i1) return 0; } else if(smaller_than==0){ if(parentheses) return 0; end=i-1; break; } else { return 0; } } else if(is_chars(buffer[i],"<")){ if(start==-1){ start=i+1; smaller_than=1; } else if(smaller_than>0){ return 0; } } else if(is_chars(buffer[i],">")){ if(smaller_than>0){ end=i-1; break; } if(start==-1) start=i; } else if(is_chars(buffer[i],"(")){ parentheses++; if(start==-1) start=i; } else if(is_chars(buffer[i],")")){ parentheses--; if(start==-1) start=i; } else if(is_chars(buffer[i],"\\")){ if(start==-1) start=i; i++; } else { if(start==-1) start=i; } } if(start==-1) return 0; if(smaller_than && end==-1) return 0; if(end==-1) end=buffer.num()-1; url.setV(&buffer[start],end-start+1); if(smaller_than) return end+2; else return end+1; } inline int link_title(MyTSchar& buffer,int startB,MyTSchar& title) { int start=-1,end=-1,num_spaces=0,num_non_spaces=0,num_endlines=0,num_enlinesA=0; char openC; for(int i=startB;i1) return 0; } else { if(num_non_spaces==0) return 0; num_non_spaces=0; } } else if(is_chars(buffer[i],"\"'")){ if(start==-1){ if(num_spaces==0) return 0; openC=buffer[i]; start=i+1; num_non_spaces++; } else if(buffer[i]==openC){ end=i-1; break; } else { num_non_spaces++; } } else if(is_chars(buffer[i],"(")){ if(start==-1){ if(num_spaces==0) return 0; openC=buffer[i]; start=i+1; } else if(openC=='('){ return 0; } else { num_non_spaces++; } } else if(is_chars(buffer[i],")")){ if(start==-1){ return 0; } else if(openC=='('){ end=i-1; break; } else { num_non_spaces++; } } else if(is_chars(buffer[i],"\\")){ if(start==-1) return 0; num_non_spaces++; i++; } else { if(start==-1) return 0; num_non_spaces++; } } if(start==-1 || end==-1) return 0; title.setV(&buffer[start],end-start+1); title.regsub(0,"\\\\\"","\""); return end+2; } inline int spaces_num(MyTSchar& buffer,int start,int* num_spaces=NULL) { if(num_spaces) (*num_spaces)=0; for(int i=start;inum){ int len=0; for(int j=i-1;j>=0;j--){ if(buffer[j]!='\n') len++; else break; } int delta=4-len%4; buffer.clear(i); buffer.insertV(i," ",delta); if(num_increased) (*num_increased)+=delta-1; if(num_spaces) (*num_spaces)++; num_chars++; } else { if(num_spaces) (*num_spaces)+=4; num_chars+=4; } } else if(is_chars(buffer[i],"\r\n")){ if(num_spaces) (*num_spaces)++; num_chars++; } else { num_chars++; } if(num_chars>=num){ return i+1; } } return buffer.num(); } static int find_closing_delimiterExact(MyTSchar& buffer,int start,int end,char c, int num) { for(int i=start;i<=end;i++){ if(buffer[i]==c){ int nReal=num_same_char_line_prefix(buffer,i,end,0); if(nReal!=num){ i+=nReal; continue; } return i; } } return -1; } static int find_closing_delimiter(MyTSchar& buffer,int start,int end,char c,int num) { for(int i=start;i<=end;i++){ if(buffer[i]==c){ int nMax=num_same_char_line_prefix(buffer,i,end,0); if(nMax]*)>|>)",ma,mL,1)){ return ma[0]+mL[0]-1-buffer.v(); } else if(string_regexp(buffer.v(),start,end+1,"^",ma,mL,1)){ return ma[0]+mL[0]-1-buffer.v(); } else if(string_regexp(buffer.v(),start,end+1,"^<\\?[^>]*\\?>",ma,mL,1)){ return ma[0]+mL[0]-1-buffer.v(); } else if(string_regexp(buffer.v(),start,end+1,"^]*>",ma,mL,1)){ return ma[0]+mL[0]-1-buffer.v(); } else if(string_regexp(buffer.v(),start,end+1,"^",ma,mL,1)){ return ma[0]+mL[0]-1-buffer.v(); } return -1; } static int is_autolink(MyTSchar& buffer,int start,int end) { const char* ma[1]; int mL[1]; const char* rex="^<\\w[-+.\\w]{1,31}:[^\\s<>]*>"; if(string_regexp(buffer.v(),start,end+1,rex,ma,mL,1)==0) return -1; return ma[0]+mL[0]-1-buffer.v(); } inline void output_quoted_char(MyTSchar& out,char c) { switch(c){ case '<': out.printE("<"); break; case '>': out.printE(">"); break; case '&': out.printE("&"); break; case '"': out.printE("""); break; default: out.printE("%c",c); break; } } void MKstate::output_quoted_string_nobackslash(MyTSchar& buffer,MyTSchar& out, int start,int end) { for(int i=start;i<=end;i++){ int pos=this->entities_json_to_c(buffer,out,i); if(pos!=-1){ i=pos; continue; } output_quoted_char(out,buffer[i]); } } void MKstate::output_quoted_string_code_span(MyTSchar& buffer,MyTSchar& out, int start,int end) { for(int i=start;i<=end;i++){ char c=buffer[i]; if(c=='\n') c=' '; if((i==start || i==end) && is_chars(buffer[start]," \n") && is_chars(buffer[end]," \n") && string_regexp(buffer.v(),start,end+1,"^\\s+$")==0){ continue; } output_quoted_char(out,c); } } inline void output_quoted_string(MyTSchar& out,const char* c) { while(*c!='\0'){ if(*c=='\\' && is_chars(*(c+1),ASCII_punctuation_g_)){ c++; } output_quoted_char(out,*c); c++; } } inline void replace_backslash(MyTSchar& out) { for(int i=0;ientities_json_to_c(buffer,outL,i); if(pos!=-1){ output_url_encoded_stringDo(outL,out,0,outL.num()-1); i=pos; continue; } output_url_encoded_stringDo(buffer,out,i,i); } } int MKstate::entities_json_to_c(MyTSchar& buffer,MyTSchar& out,int start) { Tcl_Obj* bufptr=NULL; if(!is_setup_entities_json_to_c_){ this->setup_entities_json_to_c(); } MyTSchar matches[3]; int match0; if(buffer.regexp(start,"^&#([xX]?)(\\w{1,7});",matches,3,0,match0)){ if(matches[2].num()==0) return -1; if(matches[1].num()){ matches[2].insertV(0,"0x",-1); } char* end; int ivalue=strtol(matches[2].v(),&end,0); if(*end!='\0') return -1; if(ivalue==0){ // this is Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) out.printE("\xEF\xBF\xBD"); return match0+matches[0].num()-1; } bufptr=Tcl_ObjPrintf("\\u%04x",ivalue); } else if(buffer.regexp(start,"^&[^\\s;]+;",matches,1,0,match0)){ const char* value=entities_json_to_c_.get(matches[0].v()); if(!value) return -1; bufptr=Tcl_NewStringObj(value,-1); } else { return -1; } Tcl_IncrRefCount(bufptr); if(!ip_){ ip_=Tcl_CreateInterp(); } Tcl_Obj* resPtr=Tcl_SubstObj(ip_,bufptr,TCL_SUBST_BACKSLASHES); if(strcmp(Tcl_GetString(resPtr),"&")==0){ out.printE("&"); } else if(strcmp(Tcl_GetString(resPtr),"\"")==0){ out.printE("""); } else if(strcmp(Tcl_GetString(resPtr),"<")==0){ out.printE("<"); } else if(strcmp(Tcl_GetString(resPtr),">")==0){ out.printE(">"); } else { out.printE("%s",Tcl_GetString(resPtr)); } Tcl_DecrRefCount(resPtr); //Tcl_DecrRefCount(bufptr); return match0+matches[0].num()-1; } //################################################################################ // MKblocks //################################################################################ void MKblocks::nprint(int iblock,MyTSvec& blocks, MyTSchar& buffer,MyTSchar& deb) { MyTSchar tmp; deb.printE("\n",iblock,parent_,MarkdownStates_g_[int(mtype_)],blanks_[0], blanks_[1],level_,tight_); if(posNoBlank_[0]>pos_[0]){ tmp.setV(&buffer[pos_[0]],posNoBlank_[0]-pos_[0]); string_quote_xml(tmp); tmp.regsub(0,"\\n","\\\\n"); } else { tmp.clear(); } deb.printE("%s\n",tmp.v()); if(posNoBlank_[0]>=0 && posNoBlank_[1]>=posNoBlank_[0]){ tmp.setV(&buffer[posNoBlank_[0]],posNoBlank_[1]-posNoBlank_[0]+1); string_quote_xml(tmp); tmp.regsub(0,"\\n","\\\\n"); } else { tmp.clear(); } deb.printE("%s\n",tmp.v()); if(posNoBlank_[1]%s\n",tmp.v()); deb.printE("%d,%d %d,%d\n",pos_[0],pos_[1], posNoBlank_[0],posNoBlank_[1]); for(int i=0;i\n"); } //################################################################################ // MKstate //################################################################################ int MKstate::list_item_level_prefix(MyTSchar& buffer,int ibox) { MyTSchar matches[1]; int num_prefix=0; while(ibox!=0){ if(blocks_[ibox].mtype_==MK::list_item){ MKblocks& block=blocks_[ibox]; buffer.regexp(block.pos_[0],"^\\s*([-+*]|\\d{1,9}[.\\)])\\s*",matches,1); num_prefix+=matches[0].num(); } ibox=blocks_[ibox].parent_; } return num_prefix; } int MKstate::give_prev(int iblock) { MKblocks& block=blocks_[blocks_[iblock].parent_]; int ipos=block.children_.isin_pos(iblock); if(ipos>0) return block.children_[ipos-1]; return -1; } int MKstate::give_next(int iblock) { MKblocks& block=blocks_[blocks_[iblock].parent_]; int ipos=block.children_.isin_pos(iblock); if(iposgive_type(current_level)==MK::block_quote){ is_lazy_continuation=1; } //################################################################################ // setext_heading //################################################################################ if(this->give_type(current_level)==MK::paragraph && blanks_line_[0]<=3 && !is_lazy_continuation && is_chars(buffer[SE_lineNoBlank_[0]],"-=")){ int valid=is_same_char_line(buffer,SE_lineNoBlank_[0],SE_lineNoBlank_[1],0,1); if(valid){ MKblocks& block=blocks_[open_blocks_[end_MTS]]; block.mtype_=MK::setext_heading; if(buffer[SE_lineNoBlank_[0]]=='=') block.level_=1; else block.level_=2; this->curr_close(); return; } } //################################################################################ // list_item //################################################################################ int is_list_item=0,is_list_item_cont=0; MyTSchar matches[2]; int SE_lineL=SE_line_[0]; if(this->give_type(current_level)==MK::list_item){ int num_prefix=0,num_increased; MKblocks& block=blocks_[open_blocks_[current_level]]; if(buffer.regexp(block.pos_[0],"^[ \t]*([-+*]|\\d{1,9}[.\\)])[ \t]*\n")){ num_prefix=2; } else if(block.children_.num()){ int pos=blocks_[block.children_[0]].posNoBlank_[0]; if(blocks_[block.children_[0]].mtype_==MK::indented_code_block) pos-=4; else if(blocks_[block.children_[0]].mtype_==MK::fenced_code_block) pos=blocks_[block.children_[0]].pos_[0]; num_prefix=pos-block.pos_[0]; } else { num_prefix=2; } if(blanks_line_[0]>=num_prefix){ is_list_item_cont=1; SE_lineL=incr_chars(buffer,SE_line_[0],num_prefix,&blanks_line_[0], &num_increased); if(num_increased){ SE_lineNoBlank_[0]+=num_increased; SE_line_[1]+=num_increased; SE_lineNoBlank_[1]+=num_increased; pos_+=num_increased; } } } //################################################################################ // block_quote //################################################################################ if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],">") && !is_list_item_cont){ if(this->give_type(current_level)==MK::fenced_code_block){ goto no_block_quote; } if(this->give_type(current_level)!=MK::block_quote){ while(open_blocks_.num()>current_level) this->curr_close(); this->append_block(MK::block_quote,SE_line_,SE_lineNoBlank_, blanks_line_); } SE_line_[0]=SE_lineNoBlank_[0]+1; if(is_chars(buffer[SE_line_[0]]," \t")){ int num_increased; SE_line_[0]=incr_chars(buffer,SE_line_[0],1,&blanks_line_[0],&num_increased); if(num_increased){ SE_lineNoBlank_[0]+=num_increased; SE_line_[1]+=num_increased; SE_lineNoBlank_[1]+=num_increased; pos_+=num_increased; } } SE_lineNoBlank_[0]=spaces_num(buffer,SE_line_[0],&blanks_line_[0]); this->create_append_paragraph(buffer,current_level+1); return; } no_block_quote:; //################################################################################ // thematic_break //################################################################################ if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"-_*") && !is_list_item_cont){ int valid=is_same_char_line(buffer,SE_lineNoBlank_[0],SE_lineNoBlank_[1],1,3); if(valid){ if(is_lazy_continuation){ this->close_all(); } else { while(is_open(current_level)) this->curr_close(); } this->append_block(MK::thematic_break,SE_line_, SE_lineNoBlank_,blanks_line_); this->curr_close(); return; } } //################################################################################ // list_item cont //################################################################################ if(!is_list_item_cont && blanks_line_[0]<=3){ if(is_chars(buffer[SE_lineNoBlank_[0]],"-+*")){ is_list_item=1; SE_lineL=SE_lineNoBlank_[0]+1; } else if(buffer.regexp(SE_lineNoBlank_[0],"^(\\d{1,9})[.\\)]",matches,2)){ if(this->give_type(current_level)!=MK::paragraph || strcmp(matches[1].v(),"1")==0){ is_list_item=1; SE_lineL=SE_lineNoBlank_[0]+matches[0].num(); } } if(is_list_item && is_chars(buffer[SE_lineL]," \t")){ int num_increased; SE_lineL=incr_chars(buffer,SE_lineL,1,&blanks_line_[0],&num_increased); if(num_increased){ SE_lineNoBlank_[0]+=num_increased; SE_line_[1]+=num_increased; SE_lineNoBlank_[1]+=num_increased; pos_+=num_increased; } } else if(buffer[SE_lineL]!='\n'){ is_list_item=0; } } if(is_list_item || is_list_item_cont){ if(this->give_type(current_level)==MK::fenced_code_block){ goto no_list_item; } if(this->give_type(current_level)==MK::paragraph && buffer.regexp(SE_lineNoBlank_[0],"^[ \t]*([-+*]|\\d{1,9}[.\\)])[ \t]*\n")){ goto no_list_item; } if(this->give_type(current_level)!=MK::list_item || !is_list_item_cont){ while(open_blocks_.num()>current_level) this->curr_close(); if(!is_list_item_cont && this->give_type(current_level)==MK::list_item){ this->curr_close(); } this->append_block(MK::list_item,SE_line_,SE_lineNoBlank_, blanks_line_); } SE_line_[0]=SE_lineL; SE_lineNoBlank_[0]=spaces_num(buffer,SE_line_[0],&blanks_line_[0]); this->create_append_paragraph(buffer,current_level+1); return; } if(this->give_type(current_level)==MK::list_item){ is_lazy_continuation=1; } no_list_item:; //################################################################################ // fenced_code_block //################################################################################ if(this->give_type(current_level)==MK::fenced_code_block){ MKblocks& block=blocks_[open_blocks_[end_MTS]]; int is_end=0; if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"`~")){ is_end=is_same_char_line(buffer,SE_lineNoBlank_[0], SE_lineNoBlank_[1],0,block.level_); int pos=spaces_num(buffer,block.pos_[0]); if(buffer[SE_lineNoBlank_[0]]!=buffer[pos]) is_end=0; } if(SE_lineNoBlank_[0]==buffer.num()-1) is_end=1; if(is_end){ block.pos_[1]=SE_line_[1]; block.posNoBlank_[1]=SE_line_[0]-1; block.blanks_[1]=blanks_line_[1]; this->curr_close(); return; } if(0&& SE_line_[0]>block.pos_[1]+1){ this->curr_close(); SE_lineNoBlank_[1]=SE_line_[1]; MKblocks& blockN=this->append_block(MK::fenced_code_block,SE_line_, SE_lineNoBlank_,blanks_line_); blockN.level_=block.level_; return; } block.pos_[1]=SE_line_[1]; block.posNoBlank_[1]=SE_lineNoBlank_[1]; block.blanks_[1]=blanks_line_[1]; return; } if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"`~") && this->give_type(current_level)!=MK::HTML_block){ int level=num_same_char_line_prefix(buffer,SE_lineNoBlank_[0],SE_lineNoBlank_[1],0); int pos=-1; if(buffer[SE_lineNoBlank_[0]]=='`'){ pos=find_closing_delimiter(buffer,SE_lineNoBlank_[0]+level, SE_lineNoBlank_[1],'`',1); } if(level>=3 && pos==-1){ if(is_lazy_continuation){ while(open_blocks_.num()>current_level){ this->curr_close(); } } else if(is_open(current_level)){ this->curr_close(); } SE_lineNoBlank_[0]=SE_line_[1]+1; MKblocks& block=this->append_block(MK::fenced_code_block,SE_line_, SE_lineNoBlank_,blanks_line_); block.level_=level; return; } } //################################################################################ // indented_code_block //################################################################################ if(this->give_type_last()==MK::indented_code_block){ this->curr_close(); } if(this->give_type_last()==MK::list_item && is_lazy_continuation && blanks_line_[0]>=4){ this->curr_close(); } if(this->give_type_last()==MK::block_quote && is_lazy_continuation && blanks_line_[0]>=4){ this->curr_close(); } if(!is_open(current_level) && blanks_line_[0]>=4){ if(is_lazy_continuation){ this->close_all(); } int num_increased; SE_lineNoBlank_[0]=incr_chars(buffer,SE_line_[0],4,&blanks_line_[0],&num_increased); if(num_increased){ SE_line_[1]+=num_increased; SE_lineNoBlank_[1]+=num_increased; pos_+=num_increased; } if(buffer[SE_lineNoBlank_[0]]!='\n'){ this->append_block(MK::indented_code_block,SE_line_,SE_lineNoBlank_, blanks_line_); return; } } //################################################################################ // ATX_heading //################################################################################ if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"#")){ IntVector2D level,start_end,blank; level[0]=1; start_end[0]=start_end[1]=-1; for(int i=SE_lineNoBlank_[0]+1;i<=SE_lineNoBlank_[1];i++){ if(is_chars(buffer[i],"#") && start_end[0]==-1 && blank[0]==0){ level[0]++; } else if(is_chars(buffer[i],"#") && blank[1]>0){ level[1]++; } else if(is_chars(buffer[i]," \t")){ if(start_end[0]==-1){ blank[0]++; blank[1]++; } else { blank[1]++; } } else { if(start_end[0]==-1) start_end[0]=i; start_end[1]=i; blank[1]=0; level[1]=0; } } if(level[0]<=6 && (blank[0]>=1 || start_end[0]==-1)){ if(is_lazy_continuation){ this->close_all(); } else if(is_open(current_level)) this->curr_close(); MKblocks& block=this->append_block(MK::ATX_heading,SE_line_,start_end, blanks_line_); block.level_=level[0]; this->curr_close(); return; } } //################################################################################ // HTML_block //################################################################################ if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"<") && this->give_type(current_level)!=MK::HTML_block){ const char* rexsStart[]={ "(?in)\\A<(script|pre|style)(\\s|>|$)", "(?in)\\A", "(?in)\\A.*\\?>", "(?in)\\A.*>", "(?in)\\A.*\\]\\]>", "(?in)\\A\\s*$", "(?in)\\A\\s*$" }; MKblocks& block=blocks_[open_blocks_[end_MTS]]; block.pos_[1]=SE_line_[1]; block.posNoBlank_[1]=SE_lineNoBlank_[1]; block.blanks_[1]=blanks_line_[1]; if(buffer.regexp(SE_lineNoBlank_[0],rexsEnd[block.level_-1])){ int c=block.posNoBlank_[1]; if(c>block.posNoBlank_[0] && is_chars(buffer[c],ASCII_space_g_)){ c--; } block.posNoBlank_[1]=c; if(block.level_==1 && buffer[block.pos_[1]]=='\n'){ block.posNoBlank_[1]=block.pos_[1]; } this->curr_close(); } return; } //################################################################################ // link_reference_definition //################################################################################ if(!is_open(current_level) && blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"[")){ MKlink& link=links_.incr_num(); int c=link_label_name(buffer,SE_lineNoBlank_[0],link.name_); int c_noblank; if(c){ link_normalize(link.name_); if(link.name_.num()==0) c=0; else if(buffer[c]!=':') c=0; else c++; } if(c){ c=link_destination(buffer,c,link.url_); } if(c){ int c_alt=link_title(buffer,c,link.title_); if(c_alt!=0){ int c_alt2=spaces_num(buffer,c_alt,&num_spaces); if(c_alt2!=0 && is_chars(buffer[c_alt2],"\r\n")){ c_noblank=c_alt; c=c_alt2; } else { c_alt=0; } } if(c_alt==0){ c_noblank=c; c=spaces_num(buffer,c,&num_spaces); if(!is_chars(buffer[c],"\r\n")){ c=0; } } } if(c){ if(links_.exists(link.name_.v())){ // necessary to emit a warning } else { links_.set(link.name_.v(),links_.num()-1); } SE_lineNoBlank_[1]=c_noblank; SE_line_[1]=c; blanks_line_[1]=c-c_noblank; this->append_block(MK::link_reference_definition,SE_line_, SE_lineNoBlank_,blanks_line_); pos_=SE_line_[1]; this->curr_close(); return; } else { links_.decr_num(); } } //################################################################################ // normal paragraph //################################################################################ int para_is_void=0; if(SE_lineNoBlank_[0]==-1) para_is_void=1; else if(SE_lineNoBlank_[0]>=SE_lineNoBlank_[1] && is_chars(buffer[SE_lineNoBlank_[0]],ASCII_space_g_)) para_is_void=1; else if(SE_lineNoBlank_[0]==buffer.num()-1) para_is_void=1; if(para_is_void){ if(SE_lineNoBlank_[0]=current_level;i--){ int iblock; if(i==open_blocks_.num()){ if(blocks_[open_blocks_[end_MTS]].children_.num()){ iblock=blocks_[open_blocks_[end_MTS]].children_[end_MTS]; } else { continue; } } else { iblock=open_blocks_[i]; } if(igive_type_last()==MK::paragraph){ this->curr_close(); } if(this->give_type_last()==MK::list_item){ int pos=blocks_[open_blocks_[end_MTS]].pos_[0]; const char* rex="^[ \t]*([-+*]|\\d{1,9}[.\\)])[ \t]*\n"; const char* mA[1]; int mL[1]; if(string_regexp(buffer.v(),pos,-1,rex,mA,mL,1)==1 && pos+mL[0]<=SE_line_[0]){ this->curr_close(); } } if(is_lazy_continuation && this->give_type(current_level)==MK::block_quote){ this->curr_close(); if(this->num_open()>current_level){ this->curr_close(); } } } else if(is_open(current_level) && this->give_type(current_level)!=MK::document){ MKblocks& block=blocks_[open_blocks_[end_MTS]]; if(block.mtype_!=MK::paragraph){ if(block.mtype_!=MK::list_item || current_levelcurr_close(); if(is_lazy_continuation){ while(open_blocks_.num()>current_level){ this->curr_close(); } } } this->append_block(MK::paragraph,SE_line_,SE_lineNoBlank_, blanks_line_); } else { block.pos_[1]=SE_line_[1]; block.posNoBlank_[1]=SE_lineNoBlank_[1]; block.blanks_[1]=blanks_line_[1]; } } else { if(is_lazy_continuation){ this->close_all(); } this->append_block(MK::paragraph,SE_line_,SE_lineNoBlank_, blanks_line_); } } void MKstate::process_markdown(MyTSchar& buffer) { MKblocks& block=this->append_block(MK::document); MyTSchar buffer0=buffer; buffer.clear(); for(int i=0;icreate_append_paragraph(buffer,1); i=pos_; SE_line_[0]=SE_line_[1]=-1; SE_lineNoBlank_[0]=SE_lineNoBlank_[1]=-1; blanks_line_[0]=0; if(iblock_quote_level(ibox); while(i<=end && level>0){ if(buffer[i]=='>'){ if(ilist_item_level_prefix(buffer,ibox); if(prefix>0){ int num_spaces; spaces_num(buffer,i,&num_spaces); if(prefix>num_spaces) prefix=num_spaces; i+=num_spaces; } return i; } void MKstate::output_link(MyTSchar& out,MyTSchar& url,MyTSchar& title, MyTSchar& text) { out.printE("output_url_encoded_string(url,out,0,url.num()-1); out.printE("\""); if(title.num()){ out.printE(" title=\""); this->output_quoted_string_nobackslash(title,out,0,title.num()-1); out.printE("\""); } out.printE(">"); this->output_quoted_string_nobackslash(text,out,0,text.num()-1); out.printE(""); } void MKstate::output_paragraph(MyTSchar& buffer,MyTSchar& out,int start,int end, int ibox,int endline_to_space) { int c; for(int i=start;i<=end;i++){ if(i>start && buffer[i-1]=='\n'){ while(is_chars(buffer[i],ASCII_space_g_) && i<=end) i++; if(i>end) break; i=this->remove_block_quote_list_item_prefix(buffer,i,end,ibox); } if(buffer[i]=='\\' && i"); continue; } } if(is_chars(buffer[i],"_*")){ int n,nMax,nEnd=-1; nMax=num_same_char_line_prefix(buffer,i,end,0); for(n=nMax;n>=1;n--){ if(i+n>=end || is_chars(buffer[i+n],Unicode_space_g_)) continue; if(is_chars(buffer[i+n],ASCII_punctuation_g_)){ if(i>start && !is_chars(buffer[i-1],ASCII_punctuation_SP_g_)){ continue; } } nEnd=find_closing_delimiterEM(buffer,i+n,end,buffer[i],n); if(nEnd!=-1) break; } if(i>start && buffer[i]=='_' && !is_chars(buffer[i-1],Unicode_space_g_) && !is_chars(buffer[i-1],ASCII_punctuation_SP_g_)){ nEnd=-1; } if(buffer[i+n]==buffer[i]){ nEnd=-1; } if(i>start && buffer[i-1]==buffer[i]){ nEnd=-1; } if(nEnd!=-1 && nEnd+n<=end && buffer[i]=='_' && !is_chars(buffer[nEnd+n],Unicode_space_g_) && !is_chars(buffer[nEnd+n],ASCII_punctuation_SP_g_)){ nEnd=-1; } if(nEnd!=-1 && nEnd>i+n){ const char* mA[1]; int mL[1]; if(string_regexp(buffer.v(),i+n,nEnd,"[`]+",mA,mL,1)==1){ int pos0=mA[0]-buffer.v(); int pos=find_closing_delimiterExact(buffer,pos0+mL[0],end,buffer[pos0], mL[0]); if(pos!=-1){ nEnd=-1; } } } if(nEnd!=-1 && nEnd>i+n){ if(n%2==1) out.printE(""); for(int j=0;j"); this->output_paragraph(buffer,out,i+n,nEnd-1,ibox); for(int j=0;j"); if(n%2==1) out.printE(""); i=nEnd+n-1; continue; } } else if(buffer[i]=='`' && (i==start || buffer[i-1]!='`')){ int n=num_same_char_line_prefix(buffer,i,end,0); int nEnd=find_closing_delimiterExact(buffer,i+n,end,buffer[i],n); if(nEnd!=-1){ out.printE(""); this->output_quoted_string_code_span(buffer,out,i+n,nEnd-1); out.printE(""); i=nEnd+n-1; continue; } } else if(buffer[i]=='['){ MyTSchar name,text,url,title; int c=link_text(buffer,i,text); if(c!=0){ if(buffer[c]=='('){ c++; int c_alt=link_destination(buffer,c,url); if(c_alt!=-1) c=c_alt; c_alt=link_title(buffer,c,title); if(c_alt!=-1) c=c_alt; while(curl_; title=link->title_; } } if(c!=0){ replace_backslash(url); replace_backslash(title); replace_backslash(text); this->output_link(out,url,title,text); i=c-1; continue; } } else if(buffer[i]=='<' && (c=is_autolink(buffer,i,end))!=-1){ MyTSchar name,text,url,title; url.setV(&buffer[i+1],c-i-1); text.setV(&buffer[i+1],c-i-1); this->output_link(out,url,title,text); i=c; continue; } else if(buffer[i]=='<' && (c=is_raw_html(buffer,i,end))!=-1){ for(int j=i;j<=c;j++){ out.printE("%c",buffer[j]); } i=c; continue; } if(buffer[i]=='\n'){ if(endline_to_space){ output_quoted_char(out,' '); } else { output_quoted_char(out,'\n'); } } else if(buffer[i]==' '){ int num_spaces; int c=spaces_num(buffer,i,&num_spaces); if(num_spaces>=2 && buffer[c]=='\n'){ out.printE("
\n"); i=c; } else { output_quoted_char(out,buffer[i]); } } else if(buffer[i]=='&'){ int c=entities_json_to_c(buffer,out,i); if(c!=-1){ i=c; } else { output_quoted_char(out,buffer[i]); } } else { output_quoted_char(out,buffer[i]); } } } void MKstate::output_paragraph(MyTSchar& buffer,MyTSchar& out,int ibox) { if(blocks_[ibox].posNoBlank_[0]==-1) return; this->output_paragraph(buffer,out,blocks_[ibox].posNoBlank_[0], blocks_[ibox].posNoBlank_[1],ibox); } void MKstate::output_paragraph_all_spaces(MyTSchar& buffer,MyTSchar& out,int ibox, int print_endline,int num_indent_spaces_removed,int check_remove_start) { int start=blocks_[ibox].posNoBlank_[0]; if(start==-1) return; int end=blocks_[ibox].posNoBlank_[1]; if(check_remove_start){ start=this->remove_block_quote_list_item_prefix(buffer,start,end,ibox); } for(int i=start;i<=end;i++){ if(i>start && buffer[i-1]=='\n'){ i=this->remove_block_quote_list_item_prefix(buffer,i,end,ibox); if(i>end) break; } if(num_indent_spaces_removed>0 && (i==start || buffer[i-1]=='\n')){ int n=0; while(i<=end && buffer[i]==' '){ n++; i++; if(n==num_indent_spaces_removed) break; } } output_quoted_char(out,buffer[i]); } if(print_endline){ for(int i=blocks_[ibox].posNoBlank_[1]+1;i<=blocks_[ibox].pos_[1];i++){ output_quoted_char(out,buffer[i]); } } } void MKstate::output_paragraph_no_quoted(MyTSchar& buffer,MyTSchar& out,int ibox) { int start=blocks_[ibox].posNoBlank_[0]; if(start==-1) return; int end=blocks_[ibox].posNoBlank_[1]; for(int i=start;i<=end;i++){ if(i>start && buffer[i-1]=='\n'){ i=this->remove_block_quote_list_item_prefix(buffer,i,end,ibox); } out.printE("%c",buffer[i]); } if(buffer[end]!='\n') out.printE("\n"); } int MKstate::is_loose_last(int iblock) { if(blocks_[iblock].mtype_==MK::block_quote) return 0; if(blocks_[iblock].tight_==0) return 1; if(blocks_[iblock].children_.num()){ int child=blocks_[iblock].children_[end_MTS]; return this->is_loose_last(child); } return 0; } inline void force_line_start(MyTSchar& out) { if(out.num() && out[end_MTS]!='\n') out.printE("\n"); } int MKstate::is_fenced_block_info_string(MyTSchar& buffer,int start, MyTSchar& infostring) { infostring.clear(); for(int i=start;ientities_json_to_c(buffer,infostring,i); if(pos!=-1){ i=pos; continue; } if(buffer[i]=='\n'){ if(infostring.num()) return 1; else return 0; } else if(is_chars(buffer[i],ASCII_space_g_)){ if(infostring.num()>0) return 1; } else if(buffer[i]=='\\' && igive_prev(iblock); if(iblock_prev==-1 || blocks_[iblock_prev].mtype_!=MK::indented_code_block){ force_line_start(out); out.printE("
");
        out_num=out.num();
      } else {
        int pos0=blocks_[iblock_prev].pos_[1]+1;
        int len=blocks_[iblock].pos_[0];
        int n=string_regexp_count(buffer.v(),pos0,len,"\n");
        for(int i=0;ioutput_paragraph_all_spaces(buffer,out,iblock,1,0,0);
      int iblock_next=this->give_next(iblock);
      if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::indented_code_block){
        if(out[end_MTS]!='\n' && out_num!=out.num()) out.printE("\n");
        out.printE("
\n"); } } break; case MK::fenced_code_block: { int out_num=-1; int iblock_prev=this->give_prev(iblock); if(iblock_prev==-1 || blocks_[iblock_prev].mtype_!=MK::fenced_code_block){ int c=spaces_num(buffer,blocks_[iblock].pos_[0]); c+=num_same_char_line_prefix(buffer,c,blocks_[iblock].pos_[1],0); force_line_start(out); MyTSchar infostring; if(this->is_fenced_block_info_string(buffer,c,infostring)){ out.printE("
",infostring.v());
        } else {
          out.printE("
");
        }
        out_num=out.num();
      }
      int num_spaces=0;
      int iblock0=iblock;
      while(1){
        int iblock0L=this->give_prev(iblock0);
        if(iblock0L==-1) break;
        iblock0=iblock0L;
      }
      int pos=spaces_num(buffer,blocks_[iblock0].pos_[0]);
      num_spaces=pos-blocks_[iblock0].pos_[0];
      
      this->output_paragraph_all_spaces(buffer,out,iblock,0,num_spaces,1);
      int iblock_next=this->give_next(iblock);
      if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::fenced_code_block){
        if(out[end_MTS]!='\n' && out_num!=out.num()) out.printE("\n");
        out.printE("
\n"); } } break; case MK::HTML_block: { force_line_start(out); this->output_paragraph_no_quoted(buffer,out,iblock); } break; case MK::link_reference_definition: { // nothing } break; case MK::block_quote: { force_line_start(out); out.printE("
\n"); } break; case MK::list_item: { int need_start=0; int iblock_prev=this->give_prev(iblock); if(iblock_prev==-1 || blocks_[iblock_prev].mtype_!=MK::list_item){ need_start=1; } else { MyTSchar matches1[4],matches2[4]; const char* rex="^\\s*(?:(\\d{1,9})([.\\)])|([-+*]))"; buffer.regexp(blocks_[iblock_prev].pos_[0],rex,matches1,4); buffer.regexp(blocks_[iblock].pos_[0],rex,matches2,4); need_start=1; if(matches1[2].num() && matches2[2].num() && matches1[2][0]==matches2[2][0]){ need_start=0; } else if(matches1[3].num() && matches2[3].num() && matches1[3][0]==matches2[3][0]){ need_start=0; } if(need_start){ if(matches1[2].num()){ out.printE("\n"); } else { out.printE("\n"); } } } if(need_start){ MyTSchar iblocks; iblocks.append(iblock); while(1){ int iblock_next=this->give_next(iblocks[end_MTS]); if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::list_item){ break; } iblocks.append(iblock_next); } int tight=1; for(int i=0;iis_loose_last(iblocks[i])){ tight=0; break; } } for(int i=0;i1){ for(int j=0;jis_loose_last(child)){ tight=0; break; } } } } for(int i=0;i1){ for(int j=0;j1 && matches[1][0]=='0') matches[1].clear(0); if(strcmp(matches[1].v(),"1")==0){ out.printE("
    \n"); } else { out.printE("
      \n",matches[1].v()); } } else { out.printE("
        \n"); } } out.printE("
      • "); } break; case MK::ATX_heading: case MK::setext_heading: { force_line_start(out); out.printE("",blocks_[iblock].level_); this->output_paragraph(buffer,out,iblock); out.printE("\n",blocks_[iblock].level_); } break; case MK::thematic_break: { force_line_start(out); out.printE("
        \n"); } break; case MK::paragraph: { int tight=0; if(blocks_[blocks_[iblock].parent_].mtype_==MK::list_item){ tight=blocks_[blocks_[iblock].parent_].tight_; } if(!tight){ force_line_start(out); out.printE("

        "); } this->output_paragraph(buffer,out,iblock); if(!tight){ out.printE("

        \n"); } } break; default: { out.printE("

        "); this->output_paragraph(buffer,out,iblock); out.printE("

        \n"); } break; } for(int i=0;ioutput_markdown(buffer,out,blocks_[iblock].children_[i]); } switch(blocks_[iblock].mtype_){ case MK::list_item: { out.printE("
      • \n"); int iblock_next=this->give_next(iblock); if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::list_item){ if(buffer.regexp(blocks_[iblock].pos_[0],"^\\s*\\d{1,9}[.\\)]")){ out.printE("
    \n"); } else { out.printE("\n"); } } } break; case MK::block_quote: { out.printE("
\n"); } break; } } static void process_markdown(MyTSchar& buffer,MyTSchar& out) { MKstate mkstate; mkstate.process_markdown(buffer); mkstate.output_markdown(buffer,out,0); #ifndef NDEBUG MyTSchar deb; mkstate.blocks_[0].nprint(0,mkstate.blocks_,buffer,deb); FILE* dout=fopen("kk.xml","wb"); fprintf(dout,"\n"); fprintf(dout,"%s",deb.v()); fclose(dout); #endif } static void process_markdown(const char* fileIn,const char* dataIn,const char* fileOut) { MyTSchar buffer,out; FILE* fin=stdin,*fout=stdout; if(fileIn){ fin=fopen(fileIn,"rb"); if(!fin){ fprintf(stderr,"infile not found\n"); exit(2); } } if(dataIn){ buffer.appendV(dataIn); } else { fseek(fin,0,SEEK_END); size_t lSize=ftell(fin); rewind(fin); buffer.set_num(lSize); size_t result=fread(buffer.v(),1,lSize,fin); fclose(fin); if(result!=lSize){ fprintf(stderr,"file read incorrectly\n"); exit(2); } buffer.printE(""); } process_markdown(buffer,out); if(fileOut){ fout=fopen(fileOut,"wb"); if(!fout){ fprintf(stderr,"outfile not found\n"); exit(2); } } fprintf(fout,"%s",out.v()); if(fout!=stdout) fclose(fout); } #ifdef MARKDOWN_AS_EXE int main(int argc,const char* argv[]) { const char* fileIn=NULL,*fileOut=NULL,*dataIn=NULL; // only command necessary to initialize tcl Tcl_FindExecutable(argv[0]); if(argc>=3 && strcmp(argv[1],"-data")==0){ dataIn=argv[2]; argc--; argv++; } else if(argc>=2){ fileIn=argv[1]; } if(argc==3){ fileOut=argv[2]; } process_markdown(fileIn,dataIn,fileOut); } #else static int Markdown_process(ClientData clientData, Tcl_Interp *ip, int objc,Tcl_Obj *CONST objv[]) { int result,iMatch; MyTSchar buffer,out; const char* varname=NULL; char err_args[]= "?-variable varname? html|rdinfo content"; const char *markdown_options[] = { "-variable",NULL }; const char *markdown_cmds[] = { "html","rdinfo",NULL }; typedef enum class MOP { html,rdinfo } Markdown_options; while(objc>3 && Tcl_GetString(objv[1])[0]=='-'){ result=Tcl_GetIndexFromObj(ip,objv[1],markdown_options,"option", 0,&iMatch); if(result!=TCL_OK) return result; switch(iMatch){ case 0: if(objc<4){ Tcl_WrongNumArgs(ip,1,objv, err_args); return TCL_ERROR; } objc--; objv++; varname=Tcl_GetString(objv[1]); } objc--; objv++; } if (objc != 3) { Tcl_WrongNumArgs(ip,1,objv,err_args); return TCL_ERROR; } result=Tcl_GetIndexFromObj(ip,objv[1],markdown_cmds,"option", 0,&iMatch); if(result!=TCL_OK) return result; Markdown_options moptions=(Markdown_options) iMatch; objc--; objv++; buffer.setV(Tcl_GetString(objv[1]),-1); process_markdown(buffer,out); Tcl_Obj *blockinfo=Tcl_NewStringObj(out.v(),out.num()); if(varname){ const char* blockinfoname=Tcl_GetString(objv[2]); Tcl_UpVar(ip,"1",blockinfoname,"blockinfo",0); Tcl_SetVar2Ex(ip,"blockinfo",NULL,blockinfo,0); Tcl_DecrRefCount(blockinfo); } else { Tcl_SetObjResult(ip,blockinfo); } return TCL_OK; } extern "C" DLLEXPORT int Markdown_Init(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS Tcl_InitStubs(interp,"8.6",0); #endif Tcl_CreateObjCommand( interp, "markdown_process",Markdown_process,NULL,NULL); return TCL_OK; } extern "C" DLLEXPORT int Markdown_SafeInit(Tcl_Interp *interp) { return Markdown_Init(interp); } extern "C" DLLEXPORT int Markdown_Unload(Tcl_Interp *interp,int flags) { return TCL_ERROR; } extern "C" DLLEXPORT int Markdown_SafeUnload(Tcl_Interp *interp,int flags) { return TCL_ERROR; } #endif // MARKDOWN_AS_EXE const char* entities_json_to_c_g_[]={ "Æ","\\u00C6", "Æ","\\u00C6", "&","\\u0026", "&","\\u0026", "Á","\\u00C1", "Á","\\u00C1", "Ă","\\u0102", "Â","\\u00C2", "Â","\\u00C2", "А","\\u0410", "𝔄","\\uD835\\uDD04", "À","\\u00C0", "À","\\u00C0", "Α","\\u0391", "Ā","\\u0100", "⩓","\\u2A53", "Ą","\\u0104", "𝔸","\\uD835\\uDD38", "⁡","\\u2061", "Å","\\u00C5", "Å","\\u00C5", "𝒜","\\uD835\\uDC9C", "≔","\\u2254", "Ã","\\u00C3", "Ã","\\u00C3", "Ä","\\u00C4", "Ä","\\u00C4", "∖","\\u2216", "⫧","\\u2AE7", "⌆","\\u2306", "Б","\\u0411", "∵","\\u2235", "ℬ","\\u212C", "Β","\\u0392", "𝔅","\\uD835\\uDD05", "𝔹","\\uD835\\uDD39", "˘","\\u02D8", "ℬ","\\u212C", "≎","\\u224E", "Ч","\\u0427", "©","\\u00A9", "©","\\u00A9", "Ć","\\u0106", "⋒","\\u22D2", "ⅅ","\\u2145", "ℭ","\\u212D", "Č","\\u010C", "Ç","\\u00C7", "Ç","\\u00C7", "Ĉ","\\u0108", "∰","\\u2230", "Ċ","\\u010A", "¸","\\u00B8", "·","\\u00B7", "ℭ","\\u212D", "Χ","\\u03A7", "⊙","\\u2299", "⊖","\\u2296", "⊕","\\u2295", "⊗","\\u2297", "∲","\\u2232", "”","\\u201D", "’","\\u2019", "∷","\\u2237", "⩴","\\u2A74", "≡","\\u2261", "∯","\\u222F", "∮","\\u222E", "ℂ","\\u2102", "∐","\\u2210", "∳","\\u2233", "⨯","\\u2A2F", "𝒞","\\uD835\\uDC9E", "⋓","\\u22D3", "≍","\\u224D", "ⅅ","\\u2145", "⤑","\\u2911", "Ђ","\\u0402", "Ѕ","\\u0405", "Џ","\\u040F", "‡","\\u2021", "↡","\\u21A1", "⫤","\\u2AE4", "Ď","\\u010E", "Д","\\u0414", "∇","\\u2207", "Δ","\\u0394", "𝔇","\\uD835\\uDD07", "´","\\u00B4", "˙","\\u02D9", "˝","\\u02DD", "`","\\u0060", "˜","\\u02DC", "⋄","\\u22C4", "ⅆ","\\u2146", "𝔻","\\uD835\\uDD3B", "¨","\\u00A8", "⃜","\\u20DC", "≐","\\u2250", "∯","\\u222F", "¨","\\u00A8", "⇓","\\u21D3", "⇐","\\u21D0", "⇔","\\u21D4", "⫤","\\u2AE4", "⟸","\\u27F8", "⟺","\\u27FA", "⟹","\\u27F9", "⇒","\\u21D2", "⊨","\\u22A8", "⇑","\\u21D1", "⇕","\\u21D5", "∥","\\u2225", "↓","\\u2193", "⤓","\\u2913", "⇵","\\u21F5", "̑","\\u0311", "⥐","\\u2950", "⥞","\\u295E", "↽","\\u21BD", "⥖","\\u2956", "⥟","\\u295F", "⇁","\\u21C1", "⥗","\\u2957", "⊤","\\u22A4", "↧","\\u21A7", "⇓","\\u21D3", "𝒟","\\uD835\\uDC9F", "Đ","\\u0110", "Ŋ","\\u014A", "Ð","\\u00D0", "Ð","\\u00D0", "É","\\u00C9", "É","\\u00C9", "Ě","\\u011A", "Ê","\\u00CA", "Ê","\\u00CA", "Э","\\u042D", "Ė","\\u0116", "𝔈","\\uD835\\uDD08", "È","\\u00C8", "È","\\u00C8", "∈","\\u2208", "Ē","\\u0112", "◻","\\u25FB", "▫","\\u25AB", "Ę","\\u0118", "𝔼","\\uD835\\uDD3C", "Ε","\\u0395", "⩵","\\u2A75", "≂","\\u2242", "⇌","\\u21CC", "ℰ","\\u2130", "⩳","\\u2A73", "Η","\\u0397", "Ë","\\u00CB", "Ë","\\u00CB", "∃","\\u2203", "ⅇ","\\u2147", "Ф","\\u0424", "𝔉","\\uD835\\uDD09", "◼","\\u25FC", "▪","\\u25AA", "𝔽","\\uD835\\uDD3D", "∀","\\u2200", "ℱ","\\u2131", "ℱ","\\u2131", "Ѓ","\\u0403", ">","\\u003E", ">","\\u003E", "Γ","\\u0393", "Ϝ","\\u03DC", "Ğ","\\u011E", "Ģ","\\u0122", "Ĝ","\\u011C", "Г","\\u0413", "Ġ","\\u0120", "𝔊","\\uD835\\uDD0A", "⋙","\\u22D9", "𝔾","\\uD835\\uDD3E", "≥","\\u2265", "⋛","\\u22DB", "≧","\\u2267", "⪢","\\u2AA2", "≷","\\u2277", "⩾","\\u2A7E", "≳","\\u2273", "𝒢","\\uD835\\uDCA2", "≫","\\u226B", "Ъ","\\u042A", "ˇ","\\u02C7", "^","\\u005E", "Ĥ","\\u0124", "ℌ","\\u210C", "ℋ","\\u210B", "ℍ","\\u210D", "─","\\u2500", "ℋ","\\u210B", "Ħ","\\u0126", "≎","\\u224E", "≏","\\u224F", "Е","\\u0415", "IJ","\\u0132", "Ё","\\u0401", "Í","\\u00CD", "Í","\\u00CD", "Î","\\u00CE", "Î","\\u00CE", "И","\\u0418", "İ","\\u0130", "ℑ","\\u2111", "Ì","\\u00CC", "Ì","\\u00CC", "ℑ","\\u2111", "Ī","\\u012A", "ⅈ","\\u2148", "⇒","\\u21D2", "∬","\\u222C", "∫","\\u222B", "⋂","\\u22C2", "⁣","\\u2063", "⁢","\\u2062", "Į","\\u012E", "𝕀","\\uD835\\uDD40", "Ι","\\u0399", "ℐ","\\u2110", "Ĩ","\\u0128", "І","\\u0406", "Ï","\\u00CF", "Ï","\\u00CF", "Ĵ","\\u0134", "Й","\\u0419", "𝔍","\\uD835\\uDD0D", "𝕁","\\uD835\\uDD41", "𝒥","\\uD835\\uDCA5", "Ј","\\u0408", "Є","\\u0404", "Х","\\u0425", "Ќ","\\u040C", "Κ","\\u039A", "Ķ","\\u0136", "К","\\u041A", "𝔎","\\uD835\\uDD0E", "𝕂","\\uD835\\uDD42", "𝒦","\\uD835\\uDCA6", "Љ","\\u0409", "<","\\u003C", "<","\\u003C", "Ĺ","\\u0139", "Λ","\\u039B", "⟪","\\u27EA", "ℒ","\\u2112", "↞","\\u219E", "Ľ","\\u013D", "Ļ","\\u013B", "Л","\\u041B", "⟨","\\u27E8", "←","\\u2190", "⇤","\\u21E4", "⇆","\\u21C6", "⌈","\\u2308", "⟦","\\u27E6", "⥡","\\u2961", "⇃","\\u21C3", "⥙","\\u2959", "⌊","\\u230A", "↔","\\u2194", "⥎","\\u294E", "⊣","\\u22A3", "↤","\\u21A4", "⥚","\\u295A", "⊲","\\u22B2", "⧏","\\u29CF", "⊴","\\u22B4", "⥑","\\u2951", "⥠","\\u2960", "↿","\\u21BF", "⥘","\\u2958", "↼","\\u21BC", "⥒","\\u2952", "⇐","\\u21D0", "⇔","\\u21D4", "⋚","\\u22DA", "≦","\\u2266", "≶","\\u2276", "⪡","\\u2AA1", "⩽","\\u2A7D", "≲","\\u2272", "𝔏","\\uD835\\uDD0F", "⋘","\\u22D8", "⇚","\\u21DA", "Ŀ","\\u013F", "⟵","\\u27F5", "⟷","\\u27F7", "⟶","\\u27F6", "⟸","\\u27F8", "⟺","\\u27FA", "⟹","\\u27F9", "𝕃","\\uD835\\uDD43", "↙","\\u2199", "↘","\\u2198", "ℒ","\\u2112", "↰","\\u21B0", "Ł","\\u0141", "≪","\\u226A", "⤅","\\u2905", "М","\\u041C", " ","\\u205F", "ℳ","\\u2133", "𝔐","\\uD835\\uDD10", "∓","\\u2213", "𝕄","\\uD835\\uDD44", "ℳ","\\u2133", "Μ","\\u039C", "Њ","\\u040A", "Ń","\\u0143", "Ň","\\u0147", "Ņ","\\u0145", "Н","\\u041D", "​","\\u200B", "​","\\u200B", "​","\\u200B", "​","\\u200B", "≫","\\u226B", "≪","\\u226A", " ","\\u000A", "𝔑","\\uD835\\uDD11", "⁠","\\u2060", " ","\\u00A0", "ℕ","\\u2115", "⫬","\\u2AEC", "≢","\\u2262", "≭","\\u226D", "∦","\\u2226", "∉","\\u2209", "≠","\\u2260", "≂̸","\\u2242\\u0338", "∄","\\u2204", "≯","\\u226F", "≱","\\u2271", "≧̸","\\u2267\\u0338", "≫̸","\\u226B\\u0338", "≹","\\u2279", "⩾̸","\\u2A7E\\u0338", "≵","\\u2275", "≎̸","\\u224E\\u0338", "≏̸","\\u224F\\u0338", "⋪","\\u22EA", "⧏̸","\\u29CF\\u0338", "⋬","\\u22EC", "≮","\\u226E", "≰","\\u2270", "≸","\\u2278", "≪̸","\\u226A\\u0338", "⩽̸","\\u2A7D\\u0338", "≴","\\u2274", "⪢̸","\\u2AA2\\u0338", "⪡̸","\\u2AA1\\u0338", "⊀","\\u2280", "⪯̸","\\u2AAF\\u0338", "⋠","\\u22E0", "∌","\\u220C", "⋫","\\u22EB", "⧐̸","\\u29D0\\u0338", "⋭","\\u22ED", "⊏̸","\\u228F\\u0338", "⋢","\\u22E2", "⊐̸","\\u2290\\u0338", "⋣","\\u22E3", "⊂⃒","\\u2282\\u20D2", "⊈","\\u2288", "⊁","\\u2281", "⪰̸","\\u2AB0\\u0338", "⋡","\\u22E1", "≿̸","\\u227F\\u0338", "⊃⃒","\\u2283\\u20D2", "⊉","\\u2289", "≁","\\u2241", "≄","\\u2244", "≇","\\u2247", "≉","\\u2249", "∤","\\u2224", "𝒩","\\uD835\\uDCA9", "Ñ","\\u00D1", "Ñ","\\u00D1", "Ν","\\u039D", "Œ","\\u0152", "Ó","\\u00D3", "Ó","\\u00D3", "Ô","\\u00D4", "Ô","\\u00D4", "О","\\u041E", "Ő","\\u0150", "𝔒","\\uD835\\uDD12", "Ò","\\u00D2", "Ò","\\u00D2", "Ō","\\u014C", "Ω","\\u03A9", "Ο","\\u039F", "𝕆","\\uD835\\uDD46", "“","\\u201C", "‘","\\u2018", "⩔","\\u2A54", "𝒪","\\uD835\\uDCAA", "Ø","\\u00D8", "Ø","\\u00D8", "Õ","\\u00D5", "Õ","\\u00D5", "⨷","\\u2A37", "Ö","\\u00D6", "Ö","\\u00D6", "‾","\\u203E", "⏞","\\u23DE", "⎴","\\u23B4", "⏜","\\u23DC", "∂","\\u2202", "П","\\u041F", "𝔓","\\uD835\\uDD13", "Φ","\\u03A6", "Π","\\u03A0", "±","\\u00B1", "ℌ","\\u210C", "ℙ","\\u2119", "⪻","\\u2ABB", "≺","\\u227A", "⪯","\\u2AAF", "≼","\\u227C", "≾","\\u227E", "″","\\u2033", "∏","\\u220F", "∷","\\u2237", "∝","\\u221D", "𝒫","\\uD835\\uDCAB", "Ψ","\\u03A8", ""","\\u0022", ""","\\u0022", "𝔔","\\uD835\\uDD14", "ℚ","\\u211A", "𝒬","\\uD835\\uDCAC", "⤐","\\u2910", "®","\\u00AE", "®","\\u00AE", "Ŕ","\\u0154", "⟫","\\u27EB", "↠","\\u21A0", "⤖","\\u2916", "Ř","\\u0158", "Ŗ","\\u0156", "Р","\\u0420", "ℜ","\\u211C", "∋","\\u220B", "⇋","\\u21CB", "⥯","\\u296F", "ℜ","\\u211C", "Ρ","\\u03A1", "⟩","\\u27E9", "→","\\u2192", "⇥","\\u21E5", "⇄","\\u21C4", "⌉","\\u2309", "⟧","\\u27E7", "⥝","\\u295D", "⇂","\\u21C2", "⥕","\\u2955", "⌋","\\u230B", "⊢","\\u22A2", "↦","\\u21A6", "⥛","\\u295B", "⊳","\\u22B3", "⧐","\\u29D0", "⊵","\\u22B5", "⥏","\\u294F", "⥜","\\u295C", "↾","\\u21BE", "⥔","\\u2954", "⇀","\\u21C0", "⥓","\\u2953", "⇒","\\u21D2", "ℝ","\\u211D", "⥰","\\u2970", "⇛","\\u21DB", "ℛ","\\u211B", "↱","\\u21B1", "⧴","\\u29F4", "Щ","\\u0429", "Ш","\\u0428", "Ь","\\u042C", "Ś","\\u015A", "⪼","\\u2ABC", "Š","\\u0160", "Ş","\\u015E", "Ŝ","\\u015C", "С","\\u0421", "𝔖","\\uD835\\uDD16", "↓","\\u2193", "←","\\u2190", "→","\\u2192", "↑","\\u2191", "Σ","\\u03A3", "∘","\\u2218", "𝕊","\\uD835\\uDD4A", "√","\\u221A", "□","\\u25A1", "⊓","\\u2293", "⊏","\\u228F", "⊑","\\u2291", "⊐","\\u2290", "⊒","\\u2292", "⊔","\\u2294", "𝒮","\\uD835\\uDCAE", "⋆","\\u22C6", "⋐","\\u22D0", "⋐","\\u22D0", "⊆","\\u2286", "≻","\\u227B", "⪰","\\u2AB0", "≽","\\u227D", "≿","\\u227F", "∋","\\u220B", "∑","\\u2211", "⋑","\\u22D1", "⊃","\\u2283", "⊇","\\u2287", "⋑","\\u22D1", "Þ","\\u00DE", "Þ","\\u00DE", "™","\\u2122", "Ћ","\\u040B", "Ц","\\u0426", " ","\\u0009", "Τ","\\u03A4", "Ť","\\u0164", "Ţ","\\u0162", "Т","\\u0422", "𝔗","\\uD835\\uDD17", "∴","\\u2234", "Θ","\\u0398", "  ","\\u205F\\u200A", " ","\\u2009", "∼","\\u223C", "≃","\\u2243", "≅","\\u2245", "≈","\\u2248", "𝕋","\\uD835\\uDD4B", "⃛","\\u20DB", "𝒯","\\uD835\\uDCAF", "Ŧ","\\u0166", "Ú","\\u00DA", "Ú","\\u00DA", "↟","\\u219F", "⥉","\\u2949", "Ў","\\u040E", "Ŭ","\\u016C", "Û","\\u00DB", "Û","\\u00DB", "У","\\u0423", "Ű","\\u0170", "𝔘","\\uD835\\uDD18", "Ù","\\u00D9", "Ù","\\u00D9", "Ū","\\u016A", "_","\\u005F", "⏟","\\u23DF", "⎵","\\u23B5", "⏝","\\u23DD", "⋃","\\u22C3", "⊎","\\u228E", "Ų","\\u0172", "𝕌","\\uD835\\uDD4C", "↑","\\u2191", "⤒","\\u2912", "⇅","\\u21C5", "↕","\\u2195", "⥮","\\u296E", "⊥","\\u22A5", "↥","\\u21A5", "⇑","\\u21D1", "⇕","\\u21D5", "↖","\\u2196", "↗","\\u2197", "ϒ","\\u03D2", "Υ","\\u03A5", "Ů","\\u016E", "𝒰","\\uD835\\uDCB0", "Ũ","\\u0168", "Ü","\\u00DC", "Ü","\\u00DC", "⊫","\\u22AB", "⫫","\\u2AEB", "В","\\u0412", "⊩","\\u22A9", "⫦","\\u2AE6", "⋁","\\u22C1", "‖","\\u2016", "‖","\\u2016", "∣","\\u2223", "|","\\u007C", "❘","\\u2758", "≀","\\u2240", " ","\\u200A", "𝔙","\\uD835\\uDD19", "𝕍","\\uD835\\uDD4D", "𝒱","\\uD835\\uDCB1", "⊪","\\u22AA", "Ŵ","\\u0174", "⋀","\\u22C0", "𝔚","\\uD835\\uDD1A", "𝕎","\\uD835\\uDD4E", "𝒲","\\uD835\\uDCB2", "𝔛","\\uD835\\uDD1B", "Ξ","\\u039E", "𝕏","\\uD835\\uDD4F", "𝒳","\\uD835\\uDCB3", "Я","\\u042F", "Ї","\\u0407", "Ю","\\u042E", "Ý","\\u00DD", "Ý","\\u00DD", "Ŷ","\\u0176", "Ы","\\u042B", "𝔜","\\uD835\\uDD1C", "𝕐","\\uD835\\uDD50", "𝒴","\\uD835\\uDCB4", "Ÿ","\\u0178", "Ж","\\u0416", "Ź","\\u0179", "Ž","\\u017D", "З","\\u0417", "Ż","\\u017B", "​","\\u200B", "Ζ","\\u0396", "ℨ","\\u2128", "ℤ","\\u2124", "𝒵","\\uD835\\uDCB5", "á","\\u00E1", "á","\\u00E1", "ă","\\u0103", "∾","\\u223E", "∾̳","\\u223E\\u0333", "∿","\\u223F", "â","\\u00E2", "â","\\u00E2", "´","\\u00B4", "´","\\u00B4", "а","\\u0430", "æ","\\u00E6", "æ","\\u00E6", "⁡","\\u2061", "𝔞","\\uD835\\uDD1E", "à","\\u00E0", "à","\\u00E0", "ℵ","\\u2135", "ℵ","\\u2135", "α","\\u03B1", "ā","\\u0101", "⨿","\\u2A3F", "&","\\u0026", "&","\\u0026", "∧","\\u2227", "⩕","\\u2A55", "⩜","\\u2A5C", "⩘","\\u2A58", "⩚","\\u2A5A", "∠","\\u2220", "⦤","\\u29A4", "∠","\\u2220", "∡","\\u2221", "⦨","\\u29A8", "⦩","\\u29A9", "⦪","\\u29AA", "⦫","\\u29AB", "⦬","\\u29AC", "⦭","\\u29AD", "⦮","\\u29AE", "⦯","\\u29AF", "∟","\\u221F", "⊾","\\u22BE", "⦝","\\u299D", "∢","\\u2222", "Å","\\u00C5", "⍼","\\u237C", "ą","\\u0105", "𝕒","\\uD835\\uDD52", "≈","\\u2248", "⩰","\\u2A70", "⩯","\\u2A6F", "≊","\\u224A", "≋","\\u224B", "'","\\u0027", "≈","\\u2248", "≊","\\u224A", "å","\\u00E5", "å","\\u00E5", "𝒶","\\uD835\\uDCB6", "*","\\u002A", "≈","\\u2248", "≍","\\u224D", "ã","\\u00E3", "ã","\\u00E3", "ä","\\u00E4", "ä","\\u00E4", "∳","\\u2233", "⨑","\\u2A11", "⫭","\\u2AED", "≌","\\u224C", "϶","\\u03F6", "‵","\\u2035", "∽","\\u223D", "⋍","\\u22CD", "⊽","\\u22BD", "⌅","\\u2305", "⌅","\\u2305", "⎵","\\u23B5", "⎶","\\u23B6", "≌","\\u224C", "б","\\u0431", "„","\\u201E", "∵","\\u2235", "∵","\\u2235", "⦰","\\u29B0", "϶","\\u03F6", "ℬ","\\u212C", "β","\\u03B2", "ℶ","\\u2136", "≬","\\u226C", "𝔟","\\uD835\\uDD1F", "⋂","\\u22C2", "◯","\\u25EF", "⋃","\\u22C3", "⨀","\\u2A00", "⨁","\\u2A01", "⨂","\\u2A02", "⨆","\\u2A06", "★","\\u2605", "▽","\\u25BD", "△","\\u25B3", "⨄","\\u2A04", "⋁","\\u22C1", "⋀","\\u22C0", "⤍","\\u290D", "⧫","\\u29EB", "▪","\\u25AA", "▴","\\u25B4", "▾","\\u25BE", "◂","\\u25C2", "▸","\\u25B8", "␣","\\u2423", "▒","\\u2592", "░","\\u2591", "▓","\\u2593", "█","\\u2588", "=⃥","\\u003D\\u20E5", "≡⃥","\\u2261\\u20E5", "⌐","\\u2310", "𝕓","\\uD835\\uDD53", "⊥","\\u22A5", "⊥","\\u22A5", "⋈","\\u22C8", "╗","\\u2557", "╔","\\u2554", "╖","\\u2556", "╓","\\u2553", "═","\\u2550", "╦","\\u2566", "╩","\\u2569", "╤","\\u2564", "╧","\\u2567", "╝","\\u255D", "╚","\\u255A", "╜","\\u255C", "╙","\\u2559", "║","\\u2551", "╬","\\u256C", "╣","\\u2563", "╠","\\u2560", "╫","\\u256B", "╢","\\u2562", "╟","\\u255F", "⧉","\\u29C9", "╕","\\u2555", "╒","\\u2552", "┐","\\u2510", "┌","\\u250C", "─","\\u2500", "╥","\\u2565", "╨","\\u2568", "┬","\\u252C", "┴","\\u2534", "⊟","\\u229F", "⊞","\\u229E", "⊠","\\u22A0", "╛","\\u255B", "╘","\\u2558", "┘","\\u2518", "└","\\u2514", "│","\\u2502", "╪","\\u256A", "╡","\\u2561", "╞","\\u255E", "┼","\\u253C", "┤","\\u2524", "├","\\u251C", "‵","\\u2035", "˘","\\u02D8", "¦","\\u00A6", "¦","\\u00A6", "𝒷","\\uD835\\uDCB7", "⁏","\\u204F", "∽","\\u223D", "⋍","\\u22CD", "\","\\u005C", "⧅","\\u29C5", "⟈","\\u27C8", "•","\\u2022", "•","\\u2022", "≎","\\u224E", "⪮","\\u2AAE", "≏","\\u224F", "≏","\\u224F", "ć","\\u0107", "∩","\\u2229", "⩄","\\u2A44", "⩉","\\u2A49", "⩋","\\u2A4B", "⩇","\\u2A47", "⩀","\\u2A40", "∩︀","\\u2229\\uFE00", "⁁","\\u2041", "ˇ","\\u02C7", "⩍","\\u2A4D", "č","\\u010D", "ç","\\u00E7", "ç","\\u00E7", "ĉ","\\u0109", "⩌","\\u2A4C", "⩐","\\u2A50", "ċ","\\u010B", "¸","\\u00B8", "¸","\\u00B8", "⦲","\\u29B2", "¢","\\u00A2", "¢","\\u00A2", "·","\\u00B7", "𝔠","\\uD835\\uDD20", "ч","\\u0447", "✓","\\u2713", "✓","\\u2713", "χ","\\u03C7", "○","\\u25CB", "⧃","\\u29C3", "ˆ","\\u02C6", "≗","\\u2257", "↺","\\u21BA", "↻","\\u21BB", "®","\\u00AE", "Ⓢ","\\u24C8", "⊛","\\u229B", "⊚","\\u229A", "⊝","\\u229D", "≗","\\u2257", "⨐","\\u2A10", "⫯","\\u2AEF", "⧂","\\u29C2", "♣","\\u2663", "♣","\\u2663", ":","\\u003A", "≔","\\u2254", "≔","\\u2254", ",","\\u002C", "@","\\u0040", "∁","\\u2201", "∘","\\u2218", "∁","\\u2201", "ℂ","\\u2102", "≅","\\u2245", "⩭","\\u2A6D", "∮","\\u222E", "𝕔","\\uD835\\uDD54", "∐","\\u2210", "©","\\u00A9", "©","\\u00A9", "℗","\\u2117", "↵","\\u21B5", "✗","\\u2717", "𝒸","\\uD835\\uDCB8", "⫏","\\u2ACF", "⫑","\\u2AD1", "⫐","\\u2AD0", "⫒","\\u2AD2", "⋯","\\u22EF", "⤸","\\u2938", "⤵","\\u2935", "⋞","\\u22DE", "⋟","\\u22DF", "↶","\\u21B6", "⤽","\\u293D", "∪","\\u222A", "⩈","\\u2A48", "⩆","\\u2A46", "⩊","\\u2A4A", "⊍","\\u228D", "⩅","\\u2A45", "∪︀","\\u222A\\uFE00", "↷","\\u21B7", "⤼","\\u293C", "⋞","\\u22DE", "⋟","\\u22DF", "⋎","\\u22CE", "⋏","\\u22CF", "¤","\\u00A4", "¤","\\u00A4", "↶","\\u21B6", "↷","\\u21B7", "⋎","\\u22CE", "⋏","\\u22CF", "∲","\\u2232", "∱","\\u2231", "⌭","\\u232D", "⇓","\\u21D3", "⥥","\\u2965", "†","\\u2020", "ℸ","\\u2138", "↓","\\u2193", "‐","\\u2010", "⊣","\\u22A3", "⤏","\\u290F", "˝","\\u02DD", "ď","\\u010F", "д","\\u0434", "ⅆ","\\u2146", "‡","\\u2021", "⇊","\\u21CA", "⩷","\\u2A77", "°","\\u00B0", "°","\\u00B0", "δ","\\u03B4", "⦱","\\u29B1", "⥿","\\u297F", "𝔡","\\uD835\\uDD21", "⇃","\\u21C3", "⇂","\\u21C2", "⋄","\\u22C4", "⋄","\\u22C4", "♦","\\u2666", "♦","\\u2666", "¨","\\u00A8", "ϝ","\\u03DD", "⋲","\\u22F2", "÷","\\u00F7", "÷","\\u00F7", "÷","\\u00F7", "⋇","\\u22C7", "⋇","\\u22C7", "ђ","\\u0452", "⌞","\\u231E", "⌍","\\u230D", "$","\\u0024", "𝕕","\\uD835\\uDD55", "˙","\\u02D9", "≐","\\u2250", "≑","\\u2251", "∸","\\u2238", "∔","\\u2214", "⊡","\\u22A1", "⌆","\\u2306", "↓","\\u2193", "⇊","\\u21CA", "⇃","\\u21C3", "⇂","\\u21C2", "⤐","\\u2910", "⌟","\\u231F", "⌌","\\u230C", "𝒹","\\uD835\\uDCB9", "ѕ","\\u0455", "⧶","\\u29F6", "đ","\\u0111", "⋱","\\u22F1", "▿","\\u25BF", "▾","\\u25BE", "⇵","\\u21F5", "⥯","\\u296F", "⦦","\\u29A6", "џ","\\u045F", "⟿","\\u27FF", "⩷","\\u2A77", "≑","\\u2251", "é","\\u00E9", "é","\\u00E9", "⩮","\\u2A6E", "ě","\\u011B", "≖","\\u2256", "ê","\\u00EA", "ê","\\u00EA", "≕","\\u2255", "э","\\u044D", "ė","\\u0117", "ⅇ","\\u2147", "≒","\\u2252", "𝔢","\\uD835\\uDD22", "⪚","\\u2A9A", "è","\\u00E8", "è","\\u00E8", "⪖","\\u2A96", "⪘","\\u2A98", "⪙","\\u2A99", "⏧","\\u23E7", "ℓ","\\u2113", "⪕","\\u2A95", "⪗","\\u2A97", "ē","\\u0113", "∅","\\u2205", "∅","\\u2205", "∅","\\u2205", " ","\\u2004", " ","\\u2005", " ","\\u2003", "ŋ","\\u014B", " ","\\u2002", "ę","\\u0119", "𝕖","\\uD835\\uDD56", "⋕","\\u22D5", "⧣","\\u29E3", "⩱","\\u2A71", "ε","\\u03B5", "ε","\\u03B5", "ϵ","\\u03F5", "≖","\\u2256", "≕","\\u2255", "≂","\\u2242", "⪖","\\u2A96", "⪕","\\u2A95", "=","\\u003D", "≟","\\u225F", "≡","\\u2261", "⩸","\\u2A78", "⧥","\\u29E5", "≓","\\u2253", "⥱","\\u2971", "ℯ","\\u212F", "≐","\\u2250", "≂","\\u2242", "η","\\u03B7", "ð","\\u00F0", "ð","\\u00F0", "ë","\\u00EB", "ë","\\u00EB", "€","\\u20AC", "!","\\u0021", "∃","\\u2203", "ℰ","\\u2130", "ⅇ","\\u2147", "≒","\\u2252", "ф","\\u0444", "♀","\\u2640", "ffi","\\uFB03", "ff","\\uFB00", "ffl","\\uFB04", "𝔣","\\uD835\\uDD23", "fi","\\uFB01", "fj","\\u0066\\u006A", "♭","\\u266D", "fl","\\uFB02", "▱","\\u25B1", "ƒ","\\u0192", "𝕗","\\uD835\\uDD57", "∀","\\u2200", "⋔","\\u22D4", "⫙","\\u2AD9", "⨍","\\u2A0D", "½","\\u00BD", "½","\\u00BD", "⅓","\\u2153", "¼","\\u00BC", "¼","\\u00BC", "⅕","\\u2155", "⅙","\\u2159", "⅛","\\u215B", "⅔","\\u2154", "⅖","\\u2156", "¾","\\u00BE", "¾","\\u00BE", "⅗","\\u2157", "⅜","\\u215C", "⅘","\\u2158", "⅚","\\u215A", "⅝","\\u215D", "⅞","\\u215E", "⁄","\\u2044", "⌢","\\u2322", "𝒻","\\uD835\\uDCBB", "≧","\\u2267", "⪌","\\u2A8C", "ǵ","\\u01F5", "γ","\\u03B3", "ϝ","\\u03DD", "⪆","\\u2A86", "ğ","\\u011F", "ĝ","\\u011D", "г","\\u0433", "ġ","\\u0121", "≥","\\u2265", "⋛","\\u22DB", "≥","\\u2265", "≧","\\u2267", "⩾","\\u2A7E", "⩾","\\u2A7E", "⪩","\\u2AA9", "⪀","\\u2A80", "⪂","\\u2A82", "⪄","\\u2A84", "⋛︀","\\u22DB\\uFE00", "⪔","\\u2A94", "𝔤","\\uD835\\uDD24", "≫","\\u226B", "⋙","\\u22D9", "ℷ","\\u2137", "ѓ","\\u0453", "≷","\\u2277", "⪒","\\u2A92", "⪥","\\u2AA5", "⪤","\\u2AA4", "≩","\\u2269", "⪊","\\u2A8A", "⪊","\\u2A8A", "⪈","\\u2A88", "⪈","\\u2A88", "≩","\\u2269", "⋧","\\u22E7", "𝕘","\\uD835\\uDD58", "`","\\u0060", "ℊ","\\u210A", "≳","\\u2273", "⪎","\\u2A8E", "⪐","\\u2A90", ">","\\u003E", ">","\\u003E", "⪧","\\u2AA7", "⩺","\\u2A7A", "⋗","\\u22D7", "⦕","\\u2995", "⩼","\\u2A7C", "⪆","\\u2A86", "⥸","\\u2978", "⋗","\\u22D7", "⋛","\\u22DB", "⪌","\\u2A8C", "≷","\\u2277", "≳","\\u2273", "≩︀","\\u2269\\uFE00", "≩︀","\\u2269\\uFE00", "⇔","\\u21D4", " ","\\u200A", "½","\\u00BD", "ℋ","\\u210B", "ъ","\\u044A", "↔","\\u2194", "⥈","\\u2948", "↭","\\u21AD", "ℏ","\\u210F", "ĥ","\\u0125", "♥","\\u2665", "♥","\\u2665", "…","\\u2026", "⊹","\\u22B9", "𝔥","\\uD835\\uDD25", "⤥","\\u2925", "⤦","\\u2926", "⇿","\\u21FF", "∻","\\u223B", "↩","\\u21A9", "↪","\\u21AA", "𝕙","\\uD835\\uDD59", "―","\\u2015", "𝒽","\\uD835\\uDCBD", "ℏ","\\u210F", "ħ","\\u0127", "⁃","\\u2043", "‐","\\u2010", "í","\\u00ED", "í","\\u00ED", "⁣","\\u2063", "î","\\u00EE", "î","\\u00EE", "и","\\u0438", "е","\\u0435", "¡","\\u00A1", "¡","\\u00A1", "⇔","\\u21D4", "𝔦","\\uD835\\uDD26", "ì","\\u00EC", "ì","\\u00EC", "ⅈ","\\u2148", "⨌","\\u2A0C", "∭","\\u222D", "⧜","\\u29DC", "℩","\\u2129", "ij","\\u0133", "ī","\\u012B", "ℑ","\\u2111", "ℐ","\\u2110", "ℑ","\\u2111", "ı","\\u0131", "⊷","\\u22B7", "Ƶ","\\u01B5", "∈","\\u2208", "℅","\\u2105", "∞","\\u221E", "⧝","\\u29DD", "ı","\\u0131", "∫","\\u222B", "⊺","\\u22BA", "ℤ","\\u2124", "⊺","\\u22BA", "⨗","\\u2A17", "⨼","\\u2A3C", "ё","\\u0451", "į","\\u012F", "𝕚","\\uD835\\uDD5A", "ι","\\u03B9", "⨼","\\u2A3C", "¿","\\u00BF", "¿","\\u00BF", "𝒾","\\uD835\\uDCBE", "∈","\\u2208", "⋹","\\u22F9", "⋵","\\u22F5", "⋴","\\u22F4", "⋳","\\u22F3", "∈","\\u2208", "⁢","\\u2062", "ĩ","\\u0129", "і","\\u0456", "ï","\\u00EF", "ï","\\u00EF", "ĵ","\\u0135", "й","\\u0439", "𝔧","\\uD835\\uDD27", "ȷ","\\u0237", "𝕛","\\uD835\\uDD5B", "𝒿","\\uD835\\uDCBF", "ј","\\u0458", "є","\\u0454", "κ","\\u03BA", "ϰ","\\u03F0", "ķ","\\u0137", "к","\\u043A", "𝔨","\\uD835\\uDD28", "ĸ","\\u0138", "х","\\u0445", "ќ","\\u045C", "𝕜","\\uD835\\uDD5C", "𝓀","\\uD835\\uDCC0", "⇚","\\u21DA", "⇐","\\u21D0", "⤛","\\u291B", "⤎","\\u290E", "≦","\\u2266", "⪋","\\u2A8B", "⥢","\\u2962", "ĺ","\\u013A", "⦴","\\u29B4", "ℒ","\\u2112", "λ","\\u03BB", "⟨","\\u27E8", "⦑","\\u2991", "⟨","\\u27E8", "⪅","\\u2A85", "«","\\u00AB", "«","\\u00AB", "←","\\u2190", "⇤","\\u21E4", "⤟","\\u291F", "⤝","\\u291D", "↩","\\u21A9", "↫","\\u21AB", "⤹","\\u2939", "⥳","\\u2973", "↢","\\u21A2", "⪫","\\u2AAB", "⤙","\\u2919", "⪭","\\u2AAD", "⪭︀","\\u2AAD\\uFE00", "⤌","\\u290C", "❲","\\u2772", "{","\\u007B", "[","\\u005B", "⦋","\\u298B", "⦏","\\u298F", "⦍","\\u298D", "ľ","\\u013E", "ļ","\\u013C", "⌈","\\u2308", "{","\\u007B", "л","\\u043B", "⤶","\\u2936", "“","\\u201C", "„","\\u201E", "⥧","\\u2967", "⥋","\\u294B", "↲","\\u21B2", "≤","\\u2264", "←","\\u2190", "↢","\\u21A2", "↽","\\u21BD", "↼","\\u21BC", "⇇","\\u21C7", "↔","\\u2194", "⇆","\\u21C6", "⇋","\\u21CB", "↭","\\u21AD", "⋋","\\u22CB", "⋚","\\u22DA", "≤","\\u2264", "≦","\\u2266", "⩽","\\u2A7D", "⩽","\\u2A7D", "⪨","\\u2AA8", "⩿","\\u2A7F", "⪁","\\u2A81", "⪃","\\u2A83", "⋚︀","\\u22DA\\uFE00", "⪓","\\u2A93", "⪅","\\u2A85", "⋖","\\u22D6", "⋚","\\u22DA", "⪋","\\u2A8B", "≶","\\u2276", "≲","\\u2272", "⥼","\\u297C", "⌊","\\u230A", "𝔩","\\uD835\\uDD29", "≶","\\u2276", "⪑","\\u2A91", "↽","\\u21BD", "↼","\\u21BC", "⥪","\\u296A", "▄","\\u2584", "љ","\\u0459", "≪","\\u226A", "⇇","\\u21C7", "⌞","\\u231E", "⥫","\\u296B", "◺","\\u25FA", "ŀ","\\u0140", "⎰","\\u23B0", "⎰","\\u23B0", "≨","\\u2268", "⪉","\\u2A89", "⪉","\\u2A89", "⪇","\\u2A87", "⪇","\\u2A87", "≨","\\u2268", "⋦","\\u22E6", "⟬","\\u27EC", "⇽","\\u21FD", "⟦","\\u27E6", "⟵","\\u27F5", "⟷","\\u27F7", "⟼","\\u27FC", "⟶","\\u27F6", "↫","\\u21AB", "↬","\\u21AC", "⦅","\\u2985", "𝕝","\\uD835\\uDD5D", "⨭","\\u2A2D", "⨴","\\u2A34", "∗","\\u2217", "_","\\u005F", "◊","\\u25CA", "◊","\\u25CA", "⧫","\\u29EB", "(","\\u0028", "⦓","\\u2993", "⇆","\\u21C6", "⌟","\\u231F", "⇋","\\u21CB", "⥭","\\u296D", "‎","\\u200E", "⊿","\\u22BF", "‹","\\u2039", "𝓁","\\uD835\\uDCC1", "↰","\\u21B0", "≲","\\u2272", "⪍","\\u2A8D", "⪏","\\u2A8F", "[","\\u005B", "‘","\\u2018", "‚","\\u201A", "ł","\\u0142", "<","\\u003C", "<","\\u003C", "⪦","\\u2AA6", "⩹","\\u2A79", "⋖","\\u22D6", "⋋","\\u22CB", "⋉","\\u22C9", "⥶","\\u2976", "⩻","\\u2A7B", "⦖","\\u2996", "◃","\\u25C3", "⊴","\\u22B4", "◂","\\u25C2", "⥊","\\u294A", "⥦","\\u2966", "≨︀","\\u2268\\uFE00", "≨︀","\\u2268\\uFE00", "∺","\\u223A", "¯","\\u00AF", "¯","\\u00AF", "♂","\\u2642", "✠","\\u2720", "✠","\\u2720", "↦","\\u21A6", "↦","\\u21A6", "↧","\\u21A7", "↤","\\u21A4", "↥","\\u21A5", "▮","\\u25AE", "⨩","\\u2A29", "м","\\u043C", "—","\\u2014", "∡","\\u2221", "𝔪","\\uD835\\uDD2A", "℧","\\u2127", "µ","\\u00B5", "µ","\\u00B5", "∣","\\u2223", "*","\\u002A", "⫰","\\u2AF0", "·","\\u00B7", "·","\\u00B7", "−","\\u2212", "⊟","\\u229F", "∸","\\u2238", "⨪","\\u2A2A", "⫛","\\u2ADB", "…","\\u2026", "∓","\\u2213", "⊧","\\u22A7", "𝕞","\\uD835\\uDD5E", "∓","\\u2213", "𝓂","\\uD835\\uDCC2", "∾","\\u223E", "μ","\\u03BC", "⊸","\\u22B8", "⊸","\\u22B8", "⋙̸","\\u22D9\\u0338", "≫⃒","\\u226B\\u20D2", "≫̸","\\u226B\\u0338", "⇍","\\u21CD", "⇎","\\u21CE", "⋘̸","\\u22D8\\u0338", "≪⃒","\\u226A\\u20D2", "≪̸","\\u226A\\u0338", "⇏","\\u21CF", "⊯","\\u22AF", "⊮","\\u22AE", "∇","\\u2207", "ń","\\u0144", "∠⃒","\\u2220\\u20D2", "≉","\\u2249", "⩰̸","\\u2A70\\u0338", "≋̸","\\u224B\\u0338", "ʼn","\\u0149", "≉","\\u2249", "♮","\\u266E", "♮","\\u266E", "ℕ","\\u2115", " ","\\u00A0", " ","\\u00A0", "≎̸","\\u224E\\u0338", "≏̸","\\u224F\\u0338", "⩃","\\u2A43", "ň","\\u0148", "ņ","\\u0146", "≇","\\u2247", "⩭̸","\\u2A6D\\u0338", "⩂","\\u2A42", "н","\\u043D", "–","\\u2013", "≠","\\u2260", "⇗","\\u21D7", "⤤","\\u2924", "↗","\\u2197", "↗","\\u2197", "≐̸","\\u2250\\u0338", "≢","\\u2262", "⤨","\\u2928", "≂̸","\\u2242\\u0338", "∄","\\u2204", "∄","\\u2204", "𝔫","\\uD835\\uDD2B", "≧̸","\\u2267\\u0338", "≱","\\u2271", "≱","\\u2271", "≧̸","\\u2267\\u0338", "⩾̸","\\u2A7E\\u0338", "⩾̸","\\u2A7E\\u0338", "≵","\\u2275", "≯","\\u226F", "≯","\\u226F", "⇎","\\u21CE", "↮","\\u21AE", "⫲","\\u2AF2", "∋","\\u220B", "⋼","\\u22FC", "⋺","\\u22FA", "∋","\\u220B", "њ","\\u045A", "⇍","\\u21CD", "≦̸","\\u2266\\u0338", "↚","\\u219A", "‥","\\u2025", "≰","\\u2270", "↚","\\u219A", "↮","\\u21AE", "≰","\\u2270", "≦̸","\\u2266\\u0338", "⩽̸","\\u2A7D\\u0338", "⩽̸","\\u2A7D\\u0338", "≮","\\u226E", "≴","\\u2274", "≮","\\u226E", "⋪","\\u22EA", "⋬","\\u22EC", "∤","\\u2224", "𝕟","\\uD835\\uDD5F", "¬","\\u00AC", "¬","\\u00AC", "∉","\\u2209", "⋹̸","\\u22F9\\u0338", "⋵̸","\\u22F5\\u0338", "∉","\\u2209", "⋷","\\u22F7", "⋶","\\u22F6", "∌","\\u220C", "∌","\\u220C", "⋾","\\u22FE", "⋽","\\u22FD", "∦","\\u2226", "∦","\\u2226", "⫽⃥","\\u2AFD\\u20E5", "∂̸","\\u2202\\u0338", "⨔","\\u2A14", "⊀","\\u2280", "⋠","\\u22E0", "⪯̸","\\u2AAF\\u0338", "⊀","\\u2280", "⪯̸","\\u2AAF\\u0338", "⇏","\\u21CF", "↛","\\u219B", "⤳̸","\\u2933\\u0338", "↝̸","\\u219D\\u0338", "↛","\\u219B", "⋫","\\u22EB", "⋭","\\u22ED", "⊁","\\u2281", "⋡","\\u22E1", "⪰̸","\\u2AB0\\u0338", "𝓃","\\uD835\\uDCC3", "∤","\\u2224", "∦","\\u2226", "≁","\\u2241", "≄","\\u2244", "≄","\\u2244", "∤","\\u2224", "∦","\\u2226", "⋢","\\u22E2", "⋣","\\u22E3", "⊄","\\u2284", "⫅̸","\\u2AC5\\u0338", "⊈","\\u2288", "⊂⃒","\\u2282\\u20D2", "⊈","\\u2288", "⫅̸","\\u2AC5\\u0338", "⊁","\\u2281", "⪰̸","\\u2AB0\\u0338", "⊅","\\u2285", "⫆̸","\\u2AC6\\u0338", "⊉","\\u2289", "⊃⃒","\\u2283\\u20D2", "⊉","\\u2289", "⫆̸","\\u2AC6\\u0338", "≹","\\u2279", "ñ","\\u00F1", "ñ","\\u00F1", "≸","\\u2278", "⋪","\\u22EA", "⋬","\\u22EC", "⋫","\\u22EB", "⋭","\\u22ED", "ν","\\u03BD", "#","\\u0023", "№","\\u2116", " ","\\u2007", "⊭","\\u22AD", "⤄","\\u2904", "≍⃒","\\u224D\\u20D2", "⊬","\\u22AC", "≥⃒","\\u2265\\u20D2", ">⃒","\\u003E\\u20D2", "⧞","\\u29DE", "⤂","\\u2902", "≤⃒","\\u2264\\u20D2", "<⃒","\\u003C\\u20D2", "⊴⃒","\\u22B4\\u20D2", "⤃","\\u2903", "⊵⃒","\\u22B5\\u20D2", "∼⃒","\\u223C\\u20D2", "⇖","\\u21D6", "⤣","\\u2923", "↖","\\u2196", "↖","\\u2196", "⤧","\\u2927", "Ⓢ","\\u24C8", "ó","\\u00F3", "ó","\\u00F3", "⊛","\\u229B", "⊚","\\u229A", "ô","\\u00F4", "ô","\\u00F4", "о","\\u043E", "⊝","\\u229D", "ő","\\u0151", "⨸","\\u2A38", "⊙","\\u2299", "⦼","\\u29BC", "œ","\\u0153", "⦿","\\u29BF", "𝔬","\\uD835\\uDD2C", "˛","\\u02DB", "ò","\\u00F2", "ò","\\u00F2", "⧁","\\u29C1", "⦵","\\u29B5", "Ω","\\u03A9", "∮","\\u222E", "↺","\\u21BA", "⦾","\\u29BE", "⦻","\\u29BB", "‾","\\u203E", "⧀","\\u29C0", "ō","\\u014D", "ω","\\u03C9", "ο","\\u03BF", "⦶","\\u29B6", "⊖","\\u2296", "𝕠","\\uD835\\uDD60", "⦷","\\u29B7", "⦹","\\u29B9", "⊕","\\u2295", "∨","\\u2228", "↻","\\u21BB", "⩝","\\u2A5D", "ℴ","\\u2134", "ℴ","\\u2134", "ª","\\u00AA", "ª","\\u00AA", "º","\\u00BA", "º","\\u00BA", "⊶","\\u22B6", "⩖","\\u2A56", "⩗","\\u2A57", "⩛","\\u2A5B", "ℴ","\\u2134", "ø","\\u00F8", "ø","\\u00F8", "⊘","\\u2298", "õ","\\u00F5", "õ","\\u00F5", "⊗","\\u2297", "⨶","\\u2A36", "ö","\\u00F6", "ö","\\u00F6", "⌽","\\u233D", "∥","\\u2225", "¶","\\u00B6", "¶","\\u00B6", "∥","\\u2225", "⫳","\\u2AF3", "⫽","\\u2AFD", "∂","\\u2202", "п","\\u043F", "%","\\u0025", ".","\\u002E", "‰","\\u2030", "⊥","\\u22A5", "‱","\\u2031", "𝔭","\\uD835\\uDD2D", "φ","\\u03C6", "ϕ","\\u03D5", "ℳ","\\u2133", "☎","\\u260E", "π","\\u03C0", "⋔","\\u22D4", "ϖ","\\u03D6", "ℏ","\\u210F", "ℎ","\\u210E", "ℏ","\\u210F", "+","\\u002B", "⨣","\\u2A23", "⊞","\\u229E", "⨢","\\u2A22", "∔","\\u2214", "⨥","\\u2A25", "⩲","\\u2A72", "±","\\u00B1", "±","\\u00B1", "⨦","\\u2A26", "⨧","\\u2A27", "±","\\u00B1", "⨕","\\u2A15", "𝕡","\\uD835\\uDD61", "£","\\u00A3", "£","\\u00A3", "≺","\\u227A", "⪳","\\u2AB3", "⪷","\\u2AB7", "≼","\\u227C", "⪯","\\u2AAF", "≺","\\u227A", "⪷","\\u2AB7", "≼","\\u227C", "⪯","\\u2AAF", "⪹","\\u2AB9", "⪵","\\u2AB5", "⋨","\\u22E8", "≾","\\u227E", "′","\\u2032", "ℙ","\\u2119", "⪵","\\u2AB5", "⪹","\\u2AB9", "⋨","\\u22E8", "∏","\\u220F", "⌮","\\u232E", "⌒","\\u2312", "⌓","\\u2313", "∝","\\u221D", "∝","\\u221D", "≾","\\u227E", "⊰","\\u22B0", "𝓅","\\uD835\\uDCC5", "ψ","\\u03C8", " ","\\u2008", "𝔮","\\uD835\\uDD2E", "⨌","\\u2A0C", "𝕢","\\uD835\\uDD62", "⁗","\\u2057", "𝓆","\\uD835\\uDCC6", "ℍ","\\u210D", "⨖","\\u2A16", "?","\\u003F", "≟","\\u225F", ""","\\u0022", ""","\\u0022", "⇛","\\u21DB", "⇒","\\u21D2", "⤜","\\u291C", "⤏","\\u290F", "⥤","\\u2964", "∽̱","\\u223D\\u0331", "ŕ","\\u0155", "√","\\u221A", "⦳","\\u29B3", "⟩","\\u27E9", "⦒","\\u2992", "⦥","\\u29A5", "⟩","\\u27E9", "»","\\u00BB", "»","\\u00BB", "→","\\u2192", "⥵","\\u2975", "⇥","\\u21E5", "⤠","\\u2920", "⤳","\\u2933", "⤞","\\u291E", "↪","\\u21AA", "↬","\\u21AC", "⥅","\\u2945", "⥴","\\u2974", "↣","\\u21A3", "↝","\\u219D", "⤚","\\u291A", "∶","\\u2236", "ℚ","\\u211A", "⤍","\\u290D", "❳","\\u2773", "}","\\u007D", "]","\\u005D", "⦌","\\u298C", "⦎","\\u298E", "⦐","\\u2990", "ř","\\u0159", "ŗ","\\u0157", "⌉","\\u2309", "}","\\u007D", "р","\\u0440", "⤷","\\u2937", "⥩","\\u2969", "”","\\u201D", "”","\\u201D", "↳","\\u21B3", "ℜ","\\u211C", "ℛ","\\u211B", "ℜ","\\u211C", "ℝ","\\u211D", "▭","\\u25AD", "®","\\u00AE", "®","\\u00AE", "⥽","\\u297D", "⌋","\\u230B", "𝔯","\\uD835\\uDD2F", "⇁","\\u21C1", "⇀","\\u21C0", "⥬","\\u296C", "ρ","\\u03C1", "ϱ","\\u03F1", "→","\\u2192", "↣","\\u21A3", "⇁","\\u21C1", "⇀","\\u21C0", "⇄","\\u21C4", "⇌","\\u21CC", "⇉","\\u21C9", "↝","\\u219D", "⋌","\\u22CC", "˚","\\u02DA", "≓","\\u2253", "⇄","\\u21C4", "⇌","\\u21CC", "‏","\\u200F", "⎱","\\u23B1", "⎱","\\u23B1", "⫮","\\u2AEE", "⟭","\\u27ED", "⇾","\\u21FE", "⟧","\\u27E7", "⦆","\\u2986", "𝕣","\\uD835\\uDD63", "⨮","\\u2A2E", "⨵","\\u2A35", ")","\\u0029", "⦔","\\u2994", "⨒","\\u2A12", "⇉","\\u21C9", "›","\\u203A", "𝓇","\\uD835\\uDCC7", "↱","\\u21B1", "]","\\u005D", "’","\\u2019", "’","\\u2019", "⋌","\\u22CC", "⋊","\\u22CA", "▹","\\u25B9", "⊵","\\u22B5", "▸","\\u25B8", "⧎","\\u29CE", "⥨","\\u2968", "℞","\\u211E", "ś","\\u015B", "‚","\\u201A", "≻","\\u227B", "⪴","\\u2AB4", "⪸","\\u2AB8", "š","\\u0161", "≽","\\u227D", "⪰","\\u2AB0", "ş","\\u015F", "ŝ","\\u015D", "⪶","\\u2AB6", "⪺","\\u2ABA", "⋩","\\u22E9", "⨓","\\u2A13", "≿","\\u227F", "с","\\u0441", "⋅","\\u22C5", "⊡","\\u22A1", "⩦","\\u2A66", "⇘","\\u21D8", "⤥","\\u2925", "↘","\\u2198", "↘","\\u2198", "§","\\u00A7", "§","\\u00A7", ";","\\u003B", "⤩","\\u2929", "∖","\\u2216", "∖","\\u2216", "✶","\\u2736", "𝔰","\\uD835\\uDD30", "⌢","\\u2322", "♯","\\u266F", "щ","\\u0449", "ш","\\u0448", "∣","\\u2223", "∥","\\u2225", "­","\\u00AD", "­","\\u00AD", "σ","\\u03C3", "ς","\\u03C2", "ς","\\u03C2", "∼","\\u223C", "⩪","\\u2A6A", "≃","\\u2243", "≃","\\u2243", "⪞","\\u2A9E", "⪠","\\u2AA0", "⪝","\\u2A9D", "⪟","\\u2A9F", "≆","\\u2246", "⨤","\\u2A24", "⥲","\\u2972", "←","\\u2190", "∖","\\u2216", "⨳","\\u2A33", "⧤","\\u29E4", "∣","\\u2223", "⌣","\\u2323", "⪪","\\u2AAA", "⪬","\\u2AAC", "⪬︀","\\u2AAC\\uFE00", "ь","\\u044C", "/","\\u002F", "⧄","\\u29C4", "⌿","\\u233F", "𝕤","\\uD835\\uDD64", "♠","\\u2660", "♠","\\u2660", "∥","\\u2225", "⊓","\\u2293", "⊓︀","\\u2293\\uFE00", "⊔","\\u2294", "⊔︀","\\u2294\\uFE00", "⊏","\\u228F", "⊑","\\u2291", "⊏","\\u228F", "⊑","\\u2291", "⊐","\\u2290", "⊒","\\u2292", "⊐","\\u2290", "⊒","\\u2292", "□","\\u25A1", "□","\\u25A1", "▪","\\u25AA", "▪","\\u25AA", "→","\\u2192", "𝓈","\\uD835\\uDCC8", "∖","\\u2216", "⌣","\\u2323", "⋆","\\u22C6", "☆","\\u2606", "★","\\u2605", "ϵ","\\u03F5", "ϕ","\\u03D5", "¯","\\u00AF", "⊂","\\u2282", "⫅","\\u2AC5", "⪽","\\u2ABD", "⊆","\\u2286", "⫃","\\u2AC3", "⫁","\\u2AC1", "⫋","\\u2ACB", "⊊","\\u228A", "⪿","\\u2ABF", "⥹","\\u2979", "⊂","\\u2282", "⊆","\\u2286", "⫅","\\u2AC5", "⊊","\\u228A", "⫋","\\u2ACB", "⫇","\\u2AC7", "⫕","\\u2AD5", "⫓","\\u2AD3", "≻","\\u227B", "⪸","\\u2AB8", "≽","\\u227D", "⪰","\\u2AB0", "⪺","\\u2ABA", "⪶","\\u2AB6", "⋩","\\u22E9", "≿","\\u227F", "∑","\\u2211", "♪","\\u266A", "¹","\\u00B9", "¹","\\u00B9", "²","\\u00B2", "²","\\u00B2", "³","\\u00B3", "³","\\u00B3", "⊃","\\u2283", "⫆","\\u2AC6", "⪾","\\u2ABE", "⫘","\\u2AD8", "⊇","\\u2287", "⫄","\\u2AC4", "⟉","\\u27C9", "⫗","\\u2AD7", "⥻","\\u297B", "⫂","\\u2AC2", "⫌","\\u2ACC", "⊋","\\u228B", "⫀","\\u2AC0", "⊃","\\u2283", "⊇","\\u2287", "⫆","\\u2AC6", "⊋","\\u228B", "⫌","\\u2ACC", "⫈","\\u2AC8", "⫔","\\u2AD4", "⫖","\\u2AD6", "⇙","\\u21D9", "⤦","\\u2926", "↙","\\u2199", "↙","\\u2199", "⤪","\\u292A", "ß","\\u00DF", "ß","\\u00DF", "⌖","\\u2316", "τ","\\u03C4", "⎴","\\u23B4", "ť","\\u0165", "ţ","\\u0163", "т","\\u0442", "⃛","\\u20DB", "⌕","\\u2315", "𝔱","\\uD835\\uDD31", "∴","\\u2234", "∴","\\u2234", "θ","\\u03B8", "ϑ","\\u03D1", "ϑ","\\u03D1", "≈","\\u2248", "∼","\\u223C", " ","\\u2009", "≈","\\u2248", "∼","\\u223C", "þ","\\u00FE", "þ","\\u00FE", "˜","\\u02DC", "×","\\u00D7", "×","\\u00D7", "⊠","\\u22A0", "⨱","\\u2A31", "⨰","\\u2A30", "∭","\\u222D", "⤨","\\u2928", "⊤","\\u22A4", "⌶","\\u2336", "⫱","\\u2AF1", "𝕥","\\uD835\\uDD65", "⫚","\\u2ADA", "⤩","\\u2929", "‴","\\u2034", "™","\\u2122", "▵","\\u25B5", "▿","\\u25BF", "◃","\\u25C3", "⊴","\\u22B4", "≜","\\u225C", "▹","\\u25B9", "⊵","\\u22B5", "◬","\\u25EC", "≜","\\u225C", "⨺","\\u2A3A", "⨹","\\u2A39", "⧍","\\u29CD", "⨻","\\u2A3B", "⏢","\\u23E2", "𝓉","\\uD835\\uDCC9", "ц","\\u0446", "ћ","\\u045B", "ŧ","\\u0167", "≬","\\u226C", "↞","\\u219E", "↠","\\u21A0", "⇑","\\u21D1", "⥣","\\u2963", "ú","\\u00FA", "ú","\\u00FA", "↑","\\u2191", "ў","\\u045E", "ŭ","\\u016D", "û","\\u00FB", "û","\\u00FB", "у","\\u0443", "⇅","\\u21C5", "ű","\\u0171", "⥮","\\u296E", "⥾","\\u297E", "𝔲","\\uD835\\uDD32", "ù","\\u00F9", "ù","\\u00F9", "↿","\\u21BF", "↾","\\u21BE", "▀","\\u2580", "⌜","\\u231C", "⌜","\\u231C", "⌏","\\u230F", "◸","\\u25F8", "ū","\\u016B", "¨","\\u00A8", "¨","\\u00A8", "ų","\\u0173", "𝕦","\\uD835\\uDD66", "↑","\\u2191", "↕","\\u2195", "↿","\\u21BF", "↾","\\u21BE", "⊎","\\u228E", "υ","\\u03C5", "ϒ","\\u03D2", "υ","\\u03C5", "⇈","\\u21C8", "⌝","\\u231D", "⌝","\\u231D", "⌎","\\u230E", "ů","\\u016F", "◹","\\u25F9", "𝓊","\\uD835\\uDCCA", "⋰","\\u22F0", "ũ","\\u0169", "▵","\\u25B5", "▴","\\u25B4", "⇈","\\u21C8", "ü","\\u00FC", "ü","\\u00FC", "⦧","\\u29A7", "⇕","\\u21D5", "⫨","\\u2AE8", "⫩","\\u2AE9", "⊨","\\u22A8", "⦜","\\u299C", "ϵ","\\u03F5", "ϰ","\\u03F0", "∅","\\u2205", "ϕ","\\u03D5", "ϖ","\\u03D6", "∝","\\u221D", "↕","\\u2195", "ϱ","\\u03F1", "ς","\\u03C2", "⊊︀","\\u228A\\uFE00", "⫋︀","\\u2ACB\\uFE00", "⊋︀","\\u228B\\uFE00", "⫌︀","\\u2ACC\\uFE00", "ϑ","\\u03D1", "⊲","\\u22B2", "⊳","\\u22B3", "в","\\u0432", "⊢","\\u22A2", "∨","\\u2228", "⊻","\\u22BB", "≚","\\u225A", "⋮","\\u22EE", "|","\\u007C", "|","\\u007C", "𝔳","\\uD835\\uDD33", "⊲","\\u22B2", "⊂⃒","\\u2282\\u20D2", "⊃⃒","\\u2283\\u20D2", "𝕧","\\uD835\\uDD67", "∝","\\u221D", "⊳","\\u22B3", "𝓋","\\uD835\\uDCCB", "⫋︀","\\u2ACB\\uFE00", "⊊︀","\\u228A\\uFE00", "⫌︀","\\u2ACC\\uFE00", "⊋︀","\\u228B\\uFE00", "⦚","\\u299A", "ŵ","\\u0175", "⩟","\\u2A5F", "∧","\\u2227", "≙","\\u2259", "℘","\\u2118", "𝔴","\\uD835\\uDD34", "𝕨","\\uD835\\uDD68", "℘","\\u2118", "≀","\\u2240", "≀","\\u2240", "𝓌","\\uD835\\uDCCC", "⋂","\\u22C2", "◯","\\u25EF", "⋃","\\u22C3", "▽","\\u25BD", "𝔵","\\uD835\\uDD35", "⟺","\\u27FA", "⟷","\\u27F7", "ξ","\\u03BE", "⟸","\\u27F8", "⟵","\\u27F5", "⟼","\\u27FC", "⋻","\\u22FB", "⨀","\\u2A00", "𝕩","\\uD835\\uDD69", "⨁","\\u2A01", "⨂","\\u2A02", "⟹","\\u27F9", "⟶","\\u27F6", "𝓍","\\uD835\\uDCCD", "⨆","\\u2A06", "⨄","\\u2A04", "△","\\u25B3", "⋁","\\u22C1", "⋀","\\u22C0", "ý","\\u00FD", "ý","\\u00FD", "я","\\u044F", "ŷ","\\u0177", "ы","\\u044B", "¥","\\u00A5", "¥","\\u00A5", "𝔶","\\uD835\\uDD36", "ї","\\u0457", "𝕪","\\uD835\\uDD6A", "𝓎","\\uD835\\uDCCE", "ю","\\u044E", "ÿ","\\u00FF", "ÿ","\\u00FF", "ź","\\u017A", "ž","\\u017E", "з","\\u0437", "ż","\\u017C", "ℨ","\\u2128", "ζ","\\u03B6", "𝔷","\\uD835\\uDD37", "ж","\\u0436", "⇝","\\u21DD", "𝕫","\\uD835\\uDD6B", "𝓏","\\uD835\\uDCCF", "‍","\\u200D", "‌","\\u200C", }; void MKstate::setup_entities_json_to_c() { entities_json_to_c_.set(entities_json_to_c_g_); is_setup_entities_json_to_c_=1; }