;ò ¡+Fc@sjdZdkZeidƒeidƒdkZdkZdkZdkZdkZdkZdk Z dk Z dk Z dk Z dk Z dkZdkZdkZdkZdkZdkZdkZdkZdkay dkZWneefj o eZnXeidƒdZdZdZdZdZ d Z!d d d d dddgZ"dZ#dZ$dZ%dZ&dfd„ƒYZ'd„Z(d„Z)d„Z*d„Z+e i,dƒZ-e i,dƒZ.e i,dƒZ/e i,dƒZ0e i,dƒZ1hd e<d!e<de+<d"e<d#e<d e.<de.<d e-<d e-<d e-<de-<d$e/<d%e.<d&e.<d'e.<d(e/<d)e/<d*e.<d+e.<d,e.<d-e/<d.e/<d/e/<d0e/<d1e/<d2e/<d3e0<d4e+<d5e-<d6e<d7e+<d8e-<d9e+<d:e-<d;e-<d<e-<d=e.<d>e1<d?e1<d@e-<dAe.<dBe<dCe<dDe<dEedT„Z?dU„Z@dV„ZAeedWdX„ZBe i,dYƒZCe i,dZƒZDd[„ZEd\„ZFhd]d^<d_d`<dadb<dcdd<dedf<dgdh<didjt.i>i?|i|iƒ|_nIt)i*i+|iƒ|_dk@a.t.i>i?|i|i|i%iAƒ|_d|_Wq$t.i4j ot5i6d|iƒ‚q$t.iBj o}t5i6tD|ƒƒ‚q$Xq(t5i6d|idƒ‚n|io|i i(dƒo|idjo"|i i(dƒ o|itEj o"|i d|i d<|i d=n|i d|i d<|i d=d}n|io |itFj o`|i idƒ|_ }tG|i||ƒ|_|itjo1tHd||t.iI|itJƒpµtHd ||t.iK|it"ƒp“tHd||t.iK|it"ƒpqtH|id||t.iK|it"ƒpHtHd||t.iK|it"ƒp&tH|id||t.iK|it"ƒ}|o4|\|_ |_|_t|i ƒ|_ d}qPt5i6d|i dƒ‚n|idjoÚt}|it.iIjo'tN|i ƒdjo|i ddjo|i d |i d }nO|it.iKjo'tN|i ƒdjo|i d djo|i d }n|o"||_ t|ƒ|_ d}q:q>n|i o'|it.iKjo|iO|i dƒot5i6d|ddƒ‚n|itjor|i o tP|_q |it.iKjo-|i i(dƒo t"|_q tQ|_q |it.iIjo|i i(d ƒo|i i(d!ƒo tJ|_q |i i(d"ƒo tR|_q |i i(d#ƒo.|i i(d$ƒ o tS|_q tT|_q |i i(dƒp|i iUd%jo<|i id&tƒtVtWfjo tX|_q t|_q tY|_q n|it.iKjoN| d d'jo=|itEj o-|itPj o|it"j o |itFj o d}n|o|iiZ|i[ƒƒnt|_\|it.iIjot]|i ƒ|_\nt5i^d(ƒ|i|ƒdS()Niscvsrootsrootis only_with_tagspathrevsviews PATH_INFOssparentiÿÿÿÿiùÿÿÿs.tar.gzscvssš%s not found! The wrong path for this repository was configured, or the server on which the CVS tree lives may be down. Please try again in a few minutes.sCVSROOTssvns %s not found! The wrong path for this repository was configured, or the server on which the Subversion tree lives maybe down. Please try again in a few minutes.skThe root "%s" is unknown. If you believe the value is correct, then please double-check your configuration.s404 Repository not foundsrevsrevisions.diffs root.tar.gzs -root.tar.gzs-roots%s: unknown locations 404 Not FoundiþÿÿÿsAtticstarballsr1sr2sannotatesgraphs makeimageslogs content-types/sstartup(_sselfscfgsNones view_funcsrepossrootnamesroottypesrootpathspathtypeswheres query_dicts path_partsspathrevsneeds_redirectsserversparamssitemssnamesvaluess_validate_params_viewssgetsgetenvs path_infos _path_partssdocroot_magic_paths _path_joinsview_docscheckout_magic_pathsoldstyle_checkout_magic_pathspops view_checkoutsoptionsscheckout_magicsdownload_tarballsview_roots_magicsroot_as_url_componentsgenerals default_roots cvs_rootsshas_keysosspathsnormpaths use_rcsparses vclib.ccvssvclibsccvssCCVSRepositorys vclib.bincvssbincvssBinCVSRepositorys ReposNotFoundsdebugsViewVCExceptionsenvirons svn_rootssresmatchs_re_rewrite_urls vclib.svn_rassvn_rassvnsSubversionRepositorys vclib.svnssvn_pathsInvalidRevisionsexsstrs view_revisionsredirect_pathrevs_repos_pathtypes _strip_suffixsFILEs view_diffsDIRsresults attic_partsslens is_forbiddens view_rootssview_directorys view_annotates view_cvsgraphsview_cvsgraph_imagesdefault_file_viewsviewcvs_mime_types alt_mime_types view_markupsview_logsredirectsget_urls mime_types guess_mimest_end( sselfsneeds_redirectscfgsexsresultspathrevs attic_partss path_partssnamesvaluess path_info((s lib/viewvc.pys run_viewvcysD                             "         5  ""     == 4     &    &"  d   icKs©t|if|ƒ\}}ti|ƒ}|ot i |t ƒd|}nt i |t ƒ}|o||odpd}n|o|ii|ƒ}n|SdS(s›Constructs a link to another ViewVC page just like the get_link function except that it returns a single URL instead of a URL split into componentss?s&N(sapplysselfsget_linksargssurlsparamsscompats urlencodesqssurllibsquotes_URL_SAFE_CHARSsresultspartialsescapesserver(sselfsescapespartialsargssqssurlsparamssresult((s lib/viewvc.pysget_url†scKsSt|if|ƒ\}}|iiti |t ƒƒ}t |ƒ}||fSdS(säConstructs a link to another ViewVC page just like the get_link function except that it returns a base URL suitable for use as an HTML form action and a string of HTML input type=hidden tags with the link parameters.N(sapplysselfsget_linksargssurlsparamssserversescapesurllibsquotes_URL_SAFE_CHARSsactionsprepare_hidden_valuess hidden_values(sselfsargssurls hidden_valuessparamssaction((s lib/viewvc.pysget_form˜s  c CsÚ|i}|tjo |i}n|tjo|iiƒ}n |iƒ}|tj|tjjpt ‚|t jp|t jp |t jot}}n$|tjo|i}|i}n|t jp |tj } |i} |t jo |iio| dt} nt}|t j o»|iioWy|d}Wntj o|i}n X|d=|tj o| d|} qàqäy|d}Wn$tj o|i}|d   ( # 9  F)  (s__name__s __module__s__init__s run_viewvcsget_urlsget_formsNonesget_link(((s lib/viewvc.pysRequestZs   ÿ cCsttti|dƒƒSdS(s9Split up a repository path into a list of path componentss/N(sfiltersNonesstringssplitspath(spath((s lib/viewvc.pys _path_parts0scCsRd}x*|D]"}|djoPn|d}q W|o||dSn|SdS(s,Collapse leading slashes in the script name You only get multiple slashes in the script name when users accidentally type urls like http://abc.com//viewvc.cgi/, but we correct for it because we output the script name in links and web browsers interpret //viewvc.cgi/ as http://viewvc.cgi/ is/iN(sispathsc(spathsisc((s lib/viewvc.pys_normalize_path6s cCs yt|}Wn)tj otid|dƒ‚nX|tjodSnt|dƒo3|i|ƒ otid|dƒ‚ndSn||ƒdS(sÖValidate whether the given value is acceptable for the param name. If the value is not allowed, then an error response is generated, and this function throws an exception. Otherwise, it simply returns None. s,An illegal parameter name ("%s") was passed.s400 Bad RequestNsmatchs2An illegal value ("%s") was passed as a parameter.( s _legal_paramssnames validatorsKeyErrorsdebugsViewVCExceptionsNoneshasattrsmatchsvalue(snamesvalues validator((s lib/viewvc.pys_validate_paramJs    cCsdS(N((svalue((s lib/viewvc.pys_validate_regexfss^[a-z]+$s^[0-9]+$s^[-_.a-zA-Z0-9:~\[\]/]*$s^[-_.a-zA-Z0-9/]+$s.^(\d\d\d\d-\d\d-\d\d(\s+\d\d:\d\d(:\d\d)?)?)?$srootsviewsp1sp2spathrevs dir_pagestarts log_pagestarts hidecvsrootsannotatesgraphs makeimagestarballsparentsr1str1sr2str2srevsrevisions content-typesbranchs branch_matchsdirsfiles file_matchswhos who_matchs querysortsdateshourssmindatesmaxdatesformatslimits orig_paths orig_pathtypes orig_pathrevs orig_viewcCsti|dƒSdS(Ns/(sstringsjoins path_parts(s path_parts((s lib/viewvc.pys _path_join²scCsšt|ƒ}|d| |jop|}t|dƒ|jo |d=n|d| |ds(srequestsget_linksNonesurlsparamsscompats urlencodesurllibsquotes_URL_SAFE_CHARSsserversescapeslinksstagsstagsappends_itemsnamessort(srequeststagsslinkssurlstagsparams((s lib/viewvc.pys prep_tagsus!"*cCsti|ƒdSdS(Ni(s mimetypess guess_typesfilename(sfilename((s lib/viewvc.pys guess_mime„scCs|o|dddfjSdS(Ns image/gifs image/jpegs image/png(s mime_type(s mime_type((s lib/viewvc.pysis_viewable_image‡scCs| p|d djSdS(Nistext/(s mime_type(s mime_type((s lib/viewvc.pysis_textŠscCs| p |djSdS(Ns text/plain(s mime_type(s mime_type((s lib/viewvc.pys is_plain_textscCs7|iiot|ƒp t|ƒotSntSdS(sGDetermine whether file should be viewed through markup page or sent rawN(scfgsoptionss allow_markupsis_viewable_images mime_typesis_texts view_markups view_checkout(s mime_typescfg((s lib/viewvc.pys default_views'iÿÿÿÿc Csó|o t|ƒpt}|p|i}|djo |i}nt}}}|i dt d|dt i dhd|<d|\1s(\1@\2(scgisescapeshtmlsressubs_re_rewrite_urls_re_rewrite_email(shtml((s lib/viewvc.pyshtmlifyÐscCsEt||ii ƒ}t|ƒ|iijo|d}n|SdS(Ns...(shtmlifyslogscfgsoptionss short_log_lenssslen(slogscfgss((s lib/viewvc.pys format_logÖsissecondi<sminuteishouri€Qsdayi€: sweeki (smonthi€3ásyearcCsš|djodSnt|}|djo|d}d|}n|d}d|d}yt|ii i |ƒ}Wnt j onX||SdS( s/Get some time text, possibly internationalized.isis _singulars%d s_pluralssN( snums _time_descsintervalstextsattrsfmtsgetattrsrequestskvsi18nstimesAttributeError(srequestsintervalsnumsattrstextsfmt((s lib/viewvc.pys get_time_textæs     cCs2y|iiiiSWntj o dSnXdS(Nsvery little time(srequestskvsi18nstimes little_timesAttributeError(srequest((s lib/viewvc.pys little_timeùscCsttiƒƒ|}|djot|ƒSntiƒ}|iƒd}x<|t |ƒjo(|d||joPn|d}qPW||d}t ||||ƒ}|o |djoK||}||d}t ||||ƒ}|o|d|}qn|SdS(Niiis, (slongstimessecss little_timesrequests _time_descskeyssbreaksssortsislensvalues get_time_textsssextendedsext(srequestssecssextendedsvaluesextsisbreaksss((s lib/viewvc.pys html_timeÿs(    c CsY|i}hd|<dt<d|i<d|iitjo|idtp |ii<d|i i |i ƒ<d|i <d|i i |i ƒ<d t<d t|ƒ<d t<d t<d t<dt<dt<dt|i<}|itijod|d Àss | (sctxsfpsflushspopens pipe_cmdssselfscmdsspipes copy_streamsclosesNonesIOErrorsdebugsViewVCExceptionsstringsjoinsmap(sselfsctxspipe((s lib/viewvc.pys__call__²s   !cCs|iƒdS(N(sselfsclose(sself((s lib/viewvc.pys__del__ÃscCs(|io|iiƒt|_ndS(N(sselfsfpsclosesNone(sself((s lib/viewvc.pyscloseÆs  (s__name__s __module__s__doc__s__init__s__call__s__del__sclose(((s lib/viewvc.pys MarkupShell«s    sMarkupEnscriptcBstZd„Zd„ZRS(NcCsqtiitii|iidƒƒddddddg}ddd g}t i ||||gƒ||_ dS( Nsenscripts--colors--language=htmls--pretty-prints-os-sseds-ns/^
$/,/<\/PRE>$/p(sosspathsnormpathsjoinscfgsoptionss
enscript_pathsenscript_cmdssed_cmdsMarkupShells__init__sselfsfpsfilename(sselfscfgsfpsfilenamessed_cmdsenscript_cmd((s
lib/viewvc.pys__init__Ìs
!cCs¢tiƒ}ztii||iƒ}zTt	|i
t|dƒƒ|i
iƒt
|_
||idd\1s\1(ssysspathsinsertscfgsoptionsspy2html_pathspy2htmls	PyFontifysImportErrorsNonescgisescapesfpsreadshtmlsPrettyPrintsfontifysppsset_mode_rawhtml_colorsressubs_re_rewrite_urls_re_rewrite_email(sfpscfgsppshtmlspy2htmls	PyFontify((s
lib/viewvc.pysmarkup_stream_python
s	
	
cCs-|iiotSnt|ii|ƒSdS(N(scfgsoptionssuse_phpsNones	MarkupPHPsphp_exe_pathsfp(sfpscfg((s
lib/viewvc.pysmarkup_stream_php#ss.phps.inccCss|tjodSn|iio3ti|ƒ}ti|ƒdti|dSntiti	|ƒƒdSdS(swReturns formatted date string in either local time or UTC.

  The passed in 'date' variable is seconds since epoch.

  sUnknown dates is UTCN(
sdatesNonescfgsoptionss
use_localtimestimes	localtimesasctimestznamesgmtime(sdatescfgs	localtime((s
lib/viewvc.pysmake_time_string9s

$cCs6|tjodSntidti|ƒƒdSdS(suReturns formatted date string in UTC, formatted for RSS.

  The passed in 'date' variable is seconds since epoch.

  sUnknown dates%a, %d %b %Y %H:%M:%Ss UTCN(sdatesNonestimesstrftimesgmtime(sdatescfg((s
lib/viewvc.pysmake_rss_time_stringGs
cCs|iiiotiddƒ‚n|i}t|ƒ\}}|i	i
||ƒ\}
}	t
|t|	ddƒo|
iƒdSnt||	|ƒ}|ihd|i<dt<dt<dt<d	t<d
t<dt<dt<d
t<dt<dt<dt<dt<ƒ|iio°hdd<}|i	i||	|ƒ}|d}|ihdt|i|ƒ<d	|i<d
|i<dt|iƒ<d|i<ƒ|itj	ot||idƒ|d||
|i5dƒ}qåt?|
ƒ}n||d<|i@iAƒtB|d|ƒdS(NsMarkup view is disableds
403 Forbiddensweakis	mime_typeslogsdatesagosauthorsbranchesstagss
branch_pointsschangedssizesstates
vendor_branchsprevssvn_latest_logiÿÿÿÿscvssdeadicCs|iS(N(sxsname(sx((s
lib/viewvc.pys‡ss, s	view_funcsparamssrevisionsescapes
smarkup(Csrequestscfgsoptionss allow_markupsdebugsViewVCExceptions _orig_pathspathsrevsrepossopenfilesfpsrevisionscheck_freshnesssNonesclosesnav_header_datasdatasupdates mime_typesshow_log_in_markupsitemlogsrevssentrysmake_time_stringsdatesauthorschangedshtmlifyslogssizes html_timesroottypes branch_numbersbranchsprevsparentsdeadsstringseztsbooleansjoinsmapsbranchesstagss branch_pointss markup_fpsis_viewable_imagesget_urls view_checkoutsurlsosssplitexts path_partssbasenamesextsmarkup_streamerssgetsstreamers use_enscriptsMarkupEnscripts use_highlightsMarkupHighlightsMarkupPipeWrappersserversheaders generate_page(srequestscfgsbasenamesstreamers markup_fpsrevsbranchsrevssprevsrevisionsfpspathsdatasurlsextsentrysoptions((s lib/viewvc.pys view_markupQsV    …  X ±       cCsGttti|dƒƒ}ttti|dƒƒ}t||ƒSdS(Ns.(smapsintsstringssplitsrev1srev2scmp(srev1srev2((s lib/viewvc.pysrevcmp©scCsNg}x1|iƒD]#\}}|id||fƒqWti|dƒSdS(sEreturns variables from params encoded as a invisible HTML snippet. s,sN(s hidden_valuessparamssitemssnamesvaluesappendsstringsjoin(sparamss hidden_valuessnamesvalue((s lib/viewvc.pysprepare_hidden_values®s  cCsa|djodpd}|djo |djo d}n|||d„}|i|ƒdS(NsdowniÿÿÿÿiscvssrevsdatecCsg|oQ|itijo|itijoqTdSqX|itijodSqXn|itj o |itj o¤|djo|t |i|iƒSqL|djo|t |i |i ƒSqL|djo|t |i |i ƒSqL|djo|t |i|iƒSqLn1|itj odSn|itj odSn|t |i|iƒSdS(Niÿÿÿÿisrevsdateslogsauthor(s group_dirssfile1skindsvclibsDIRsfile2srevsNonessortbysssrevcmpscmpsdateslogsauthorsname(sfile1sfile2ssortbys group_dirsss((s lib/viewvc.pys file_sort_cmpÀs*      (ssortdirsssroottypessortbys group_dirss file_sort_cmps file_datassort(s file_datasroottypessortdirssortbys group_dirssss file_sort_cmp((s lib/viewvc.pyssort_file_data·s  $cCs#tti|ƒti|ƒƒSdS(scase insensitive comparisonN(scmpsstringslowersxsy(sxsy((s lib/viewvc.pysicmpæscCs-t|ƒ}|iiƒt|d|ƒdS(Nsroots(scommon_template_datasrequestsdatasserversheaders generate_page(srequestsdata((s lib/viewvc.pys view_rootsês  c%CsÒ |idjoy|ii|iƒ} Wn(tij oti ddƒ‚nXti i |i|i | ƒ}t|tt|ƒddƒodSqn|i}h}|idjoBt|iid|iiƒƒ}|iio |ii|djod#|_?|i@|_@|i<ti>jo…|d jo|iA|i:ƒoqn|idjo'|iiBo|d jo |i:d$joqn|iCd%tDd&||i:d'ti>d(hd)dƒ|_E|idjo1|iCd%tFd(hd*|id(hd)dƒ|_Lq¦nW|i<ti=joC|idjo|i0o|d}|oqq™n|d}||i:} |idjo|iN|_NntO|i:ƒ|_PtQ|| |i|iPƒ\|_E|_R|_S|_T|_G|_U|iCd%tKd&| d'ti=d(hd)dƒ|_L|iiVo |idjo4|iCd%tWd&| d'ti=d(hd)dƒ|_Xq¦n|iY|ƒqWtZ|ƒ} | i\hd+|<d |<d |<d,t<d-|o t]|ƒpt<d.t<d/|iCd(hd d <d tt<d?t<ƒ|d@jo t}nd@}|d d1dddgjo-|iCd(hd || <d?|<ƒn…|idjot|| dD<|iCd%tFd(hd*|| o| dddjƒ|_?t@|| iAƒ|_At@|| iBƒ|_Bt@|| iCƒ|_CtDd„| iBƒ|_E| o|iF| ƒ o&tDd„| iAƒ|_Gd|| |ddfjƒ<dt%<d |<d!t=i>d"ƒ<d#t%<d$t%<d%t%<d&t%<d't=i>d"ƒ<d(t%<d)t%<d*t%<d+t%<ƒt_||ƒ}|iiao-|ibdhdt%<ƒ\|d,<|d-sssvns view_funcswherespathtypesparamsspathrevsescapesrevisionsr2sdefault_branchs mime_types rev_selectedshuman_readableshsls log_pagestartsentriess prefer_markupis view_hrefs download_hrefsdownload_text_hrefs annotate_hrefstag_prefer_markups tag_view_hrefstag_download_hrefstag_download_text_hrefstag_annotate_hrefslog_paging_actionslog_paging_hidden_valuesstr1str2sdiff_select_actionsdiff_select_hidden_valuesslogsort_actionslogsort_hidden_valuesscvs_tagssMAINstagss branch_tagss plain_tagssnameslog(rsrequestscfgs query_dictsgetsoptionss diff_formatslog_sortslogsortspathtypesvclibsDIRsroottypesdebugsViewVCExceptions cross_copiessrepossitemlogs path_partsspathrevs show_revsssortslogsort_date_cmpslogsort_rev_cmps selected_revsentriess name_printedscvssrevs_itemsentrysstringsdeadsstatesauthorschangedsmake_time_stringsdatesNonesagos html_timeshtmlifyslogssizes branch_points next_mains orig_paths copy_paths view_hrefs download_hrefsdownload_text_hrefs annotate_hrefs revision_hrefssel_for_diff_hrefsdiff_to_sel_hrefsdiff_to_prev_hrefsdiff_to_branch_hrefsdiff_to_main_hrefsprevsparents branch_numbersbranchseztsbooleans vendor_branchs prep_tagssbranchesstagss branch_pointssmaps tag_namesshas_keys branch_namessnextsrsfilenameswherescopy_revsget_urlsview_logsFILEs orig_hrefs copy_hrefsget_file_view_infos mime_types prefer_markups view_revisionsview_directorys view_diffsstrsserversescapesappendscommon_template_datasdatasupdates pathrev_formslastrevs use_pagesizesget_formstaginfositemsstagitemssreversesmainsaliasess branch_tagss plain_tagsstagsco_revs is_branchsintspagingsheaders generate_page( srequests show_revss diff_formats annotate_hrefscfgscvsslogsortstags prefer_markups branch_tagss revision_hrefsrevs view_hrefsbranchsprevs selected_revstagss name_printedstagitemssentriessdatas plain_tagsstaginfosbranchesspathtypeslastrevs download_hrefsrsmainsentrysdownload_text_hrefsoptions((s lib/viewvc.pysview_logKsT                              ' %"             4    1 '_ $  '  '   Ù - G)!>-B        &   cCsŠt|ƒ\}}|ii||ƒ\}}t|t |ƒ o;|i i |i i dƒp|ipdƒt|ƒn|iƒdS(Ns content-types text/plain(s _orig_pathsrequestspathsrevsrepossopenfilesfpsrevisionscheck_freshnesssNonesserversheaders query_dictsgets mime_types copy_streamsclose(srequestsfpsrevspathsrevision((s lib/viewvc.pys view_checkout\s -c Cs |iii otiddƒ‚nt|dƒ\}}dk }|i dt dhdt <dt      cCs\|tjotSnyti|ƒ}Wntj o |SnXtti|ƒ|ƒSdS(N( sdate_strsNonescompats cvs_strptimesdates ValueErrorsmake_time_stringstimegmscfg(sdate_strscfgsdate((s lib/viewvc.pysrcsdiff_date_reformat% s  s*^[-+*]{3} [^\t]+\t([^\t]+)\t((\d+\.)*\d+)$s!@@ \-([0-9]+).*\+([0-9]+).*@@(.*)cCsÜtiti|ƒƒ}|ii}|djot|ƒ|jo%ti dd|dd|ƒ}n|oti |ddƒ}nti |dd ƒ}t |ƒ}ti |d d ƒ}ti |d d ƒ}|SdS(Nis(s.s)s\1s s nbsp;s snbsp;ss&ss&\
( sstrings expandtabssrstripstextscfgsoptionss hr_breakableslensressubsreplaceshtmlify(stextscfgs hr_breakable((s lib/viewvc.pysspaced_html_text1 s  % s DiffSourcecBs,tZd„Zd„Zd„Zd„ZRS(NcCsU||_||_t|_t|_d|_t|_d|_g|_ g|_ dS(Niÿÿÿÿs no-changes( sfpsselfscfgsNones save_lines line_numbersidxslastsstatesleft_cols right_col(sselfsfpscfg((s lib/viewvc.pys__init__F s        cCs|||ijo |iSn||idjo tƒ‚nx9no1|iƒ}|o||_||_|Sq?qFWdS(Ni(sidxsselfslastsDiffSequencingErrors_get_rowsitem(sselfsidxsitem((s lib/viewvc.pys __getitem__U s     c Cs¸|id djo(|iƒ}|o|Snd|_n|io|i}t|_n|iiƒ}| o`|idjod|_t ddƒSn|i p|i od|i|_tSnt ‚n|d d jo„d|_g|_ g|_ t i|ƒ}t|idƒƒd |_t dd d |id ƒd |idƒd|idƒƒSn|ddjod|i|_tSn|d}t|d |iƒ}|djoa|idjo0|id |_t ddd|d|iƒSnd|_|i i|ƒtSn|djo!d|_|i i|ƒtSn|i p|i o!||_d|i|_tSn|id |_t ddd|d|d|iƒSdS(Nisflushsdumps no-changessdonestypesflush-is@@isheadersline_info_leftsline_info_rightsline_info_extraiis\s+saddsrights line_numberspre-change-adds-spre-change-removescontextsleft(sselfsstates _flush_rowsitems save_lineslinesNonesfpsreadlines_itemsleft_cols right_cols IndexErrors_re_extract_infosmatchsintsgroups line_numbers diff_codesspaced_html_textscfgsoutputsappend(sselfsitems diff_codesoutputslinesmatch((s lib/viewvc.pys_get_rowe sd                  cCs |i o|i otSn|idjo#tddd|iidƒƒSntdddtidƒdtidƒƒ}|io+tid ƒ|_ |iidƒ|_ n|ioG|i d |_ tid ƒ|_ |iidƒ|_|i |_ n|SdS( Nsflush-pre-change-removestypesremovesleftischanges have_lefts have_righti(sselfsleft_cols right_colsNonesstates_itemspopseztsbooleansitems have_leftslefts line_numbers have_rightsright(sselfsitem((s lib/viewvc.pys _flush_row° s #   (s__name__s __module__s__init__s __getitem__s_get_rows _flush_row(((s lib/viewvc.pys DiffSourceE s   KsDiffSequencingErrorcBstZRS(N(s__name__s __module__(((s lib/viewvc.pysDiffSequencingErrorÆ scCsœt} } } }}g}|ti jod}d}n+|ti jod}d}n t}}|o|o d}t|ƒ} t|ƒ} x|os|iƒ}| oPn|t|ƒ |joYti|ƒ}|o"|idƒ} |idƒ} n|o|d d|}qþnÚ|t|ƒ |jo_ti|ƒ}|o"|idƒ} |idƒ}n|o|d d|}nd}nd|d d jot}d}nCti|d ƒdjpti|d ƒdjot}d}n|i|ƒq•Wn| o | |jo ti d | |fdƒ‚n|o ||jo ti d ||fdƒ‚n| | |ti"|dƒfSdS(Ns--- s+++ s*** iiiÿÿÿÿs %s iisBins not foundsillegal options3rcsdiff found revision %s, but expected revision %ss500 Internal Server Errors(#sNonesdate1sdate2slog_rev1slog_rev2sflags header_liness diff_typesvclibsUNIFIEDsf1sf2sCONTEXTsparsingslenslen_f1slen_f2sfpsreadlineslines_re_extract_revsmatchsgroupssym1ssym2s_RCSDIFF_IS_BINARYsstringsfinds_RCSDIFF_ERRORsappendsrev1sdebugsViewVCExceptionsrev2sjoin(sfps diff_typesrev1srev2ssym1ssym2sf1sf2sparsingslen_f1slen_f2sdate1sdate2slog_rev1slog_rev2s header_linessmatchsflagsline((s lib/viewvc.pysdiff_parse_headersÉ s^        2   cCsä|ii|ƒot|i|ƒ}n³|idjo™yC|i}tti i ||i |i |ƒ|i |ƒƒƒ}WqÜtij otiddƒ‚qÜtij otiddƒ‚qÜXn |i}|SdS(Nssvns-Invalid path(s) or revision(s) passed to diffs400 Bad Request(srequests query_dictshas_keys query_keys _path_partsspartssroottypesrepossvclibssvns get_locationswheres_getrevsbase_revsrevsInvalidRevisionsdebugsViewVCExceptions ItemNotFounds path_parts(srequests query_keysrevsbase_revsrepossparts((s lib/viewvc.pys_get_diff_path_parts s       c Csr|i}|d} }|d} }t}}|djo4|i dtƒ} | ot i ddƒ‚q±nBt i |dƒ}|djo |} n|| } ||d }|djo:|i d tƒ} | ot i ddƒ‚nd }nBt i |dƒ}|djo |} n|| } ||d }|id jocy4t|ii| ƒƒ} t|ii| ƒƒ} Wq¬tij ot i d dƒ‚q¬Xnt|d| |iƒ}t|d| |iƒ}yTt| | ƒdjo:| | f\} } ||f\}}||f\}}nWn%tj ot i d dƒ‚nX||| | ||fSdS(Nsr1sr2stextstr1s.Missing revision from the diff form text fields400 Bad Requests:iÿÿÿÿistr2sssvns"Invalid revision(s) passed to diffsp1sp2i(srequests query_dictsrev1sr1srev2sr2sNonessym1ssym2sgetsdebugsViewVCExceptionsstringsfindsidxsroottypesstrsreposs_getrevsvclibsInvalidRevisions_get_diff_path_partsspathrevsp1sp2srevcmps ValueError( srequestsp2sidxsr1sr2s query_dictssym2ssym1sp1srev1srev2((s lib/viewvc.pys setup_diff sV                cCsR|i}|i}t|ƒ\} } } }}}|i d|i i djodpdƒ}|djo ti}n1|djo ti}ntid|dƒ‚y"|ii| | | ||ƒ}Wn(tij otiddƒ‚nXt||| |||ƒ\}}} } |iidƒti i!| ƒt"|ƒ|i#ƒdS(Ns diff_formatscsusDiff format %s not understoods400 Bad Requests-Invalid path(s) or revision(s) passed to diffs text/plain($srequestscfgs query_dicts setup_diffsp1sp2srev1srev2ssym1ssym2sgetsoptionss diff_formatsformatsvclibsCONTEXTs diff_typesUNIFIEDsdebugsViewVCExceptionsrepossrawdiffsfpsInvalidRevisionsdiff_parse_headerssdate1sdate2sflagsheaderssserversheaderssyssstdoutswrites copy_streamsclose(srequestscfgs query_dictssym2ssym1sdate1sdate2sfpsformatsrev1sflagsp2sp1sheaderss diff_typesrev2((s lib/viewvc.pys view_patchR s,   #      "  c Cs |i}|i}t|ƒ\}}}}}}t |t d||fddƒodSnt }h}d}|id|iiƒ}|djo ti}n•|djo ti}n{|djoti}d |d d%|ƒg}q¦t?||ƒ}qªt@|tA|ƒt dƒ} n|i-hd&tB| |ƒ<d'tB| |ƒ<d(| <d)|<d*|<d+|<ƒ|iCiDƒtE|d,|ƒdS(-Ns%s-%ssweakiis diff_formatscsssliscontextshsusDiff format %s not understoods400 Bad Requestsfunouts ignore_whitesignore_keyword_substiis-Invalid path(s) or revision(s) passed to diffs path_lefts path_rightsrev_lefts rev_rightstag_lefts tag_rights annotate_hrefsparamssdiff_format_actionsdiff_format_hidden_valuess view_funcsescapes patch_hrefswherespathtypesannotatestypes date_lefts date_rightsraw_diffschangess sidebysidesunifiedsdiff(Fsrequestscfgs query_dicts setup_diffsp1sp2srev1srev2ssym1ssym2scheck_freshnesssNones diff_types diff_optionsshuman_readablesgetsoptionss diff_formatsformatsvclibsCONTEXTs SIDE_BY_SIDEsUNIFIEDsdebugsViewVCExceptions hr_funoutshr_ignore_whiteshr_ignore_keyword_substsfps sidebysidesunifieds hr_intralinesidiffsrepossopenfilesf1s readliness lines_leftsclosesf2s lines_rightsrawdiffsInvalidRevisionscommon_template_datasdatasupdates _path_joinscopys orig_paramssget_formsget_urls view_patchsallow_annotates view_annotatesFILEsdiff_parse_headerssdate1sdate2sflagsheaderss raw_diff_fpschangess_items DiffSourcesMarkupPipeWrappershtmlifysrcsdiff_date_reformatsserversheaders generate_page(srequestsunifiedsf2sf1scfgs query_dictssym2ssym1s orig_paramssdate1s raw_diff_fpsdate2s lines_lefts lines_rightsfpshuman_readablesformatsrev1sflagsdatas sidebysides diff_optionssp2sp1sheaderss diff_typesrev2schanges((s lib/viewvc.pys view_diffs sž  #               =    %  [        U ssviewvcsustars00c CsÝ| o%|ddjo d}q-d}n| o%|ddjo d}qZd}n| o d} nt|ƒdjoYt|d t|ƒdd d d d ƒ|i|ƒ|id d t|ƒd dƒnti d|d|d|d|d|d|ƒ}ti d||||| | d| d| | ƒ }| oOd}|||}d }x2tt|ƒƒD]}|t||ƒ}qtWn|ti dd|ƒ|}|d dt|ƒ}|i|ƒdS(Niÿÿÿÿs/iíi¤s5s0sids ././@LongLinkisLsiÿis100s 8s 8s 8s 12s 12ss%07os%011osc 100s 6s 2s 32s 32s 8s 8s 155ss s8s(smodesnamestypefragsprefixslensgenerate_tarball_headersoutswritesstructspacksuidsgidssizesmtimesblock1slinknamesmagicsversionsunamesgnamesdevmajorsdevminorsblock2schksums dummy_chksumsblocksrangesisord(soutsnamessizesmodesmtimesuidsgidstypefragslinknamesunamesgnamesdevmajorsdevminorsprefixsmagicsversionschksumsblock1sblock2s dummy_chksumsisblock((s lib/viewvc.pysgenerate_tarball_headerë sR     % '    cCsz|i|} |ii| |ihƒ} |ii| |i| hƒ| i d„ƒ|io|idd}n|i d}|o|t |ƒd}n|i dj} |tjosd}xj| D]^}| o*|itijp|itjp|ioqÈn|i|jo |i}qÈqÈWn|i|ƒ| ot||d|ƒnxM| D]E}|itijoqan| o|itjp|ioqan| o,x!|D]}t||d|ƒq·W|2n| o+ti|iƒ} | ti!d@dB}nd }|ii#| |i$g|iƒd}|i&ƒ} |i(ƒt|||i$t)| ƒ||iƒ|i*| ƒ|i*d d t)| ƒd d ƒqaWxÂ| D]º}|i+p|iti,joq±n| oH|i-i.|i$ƒp$| o|i-i/i0o |i$d joq±q+n|i djo|ipt}t2||||i$g||ƒq±W|d3dS(NcCst|i|iƒS(N(scmpsasnamesb(sasb((s lib/viewvc.pys) siÿÿÿÿs/scvsismtimeimi€i¤siÿisCVSROOTssvn(3srequests path_partssreldirsrep_pathsreposslistdirspathrevsentriessdirlogsssortstar_dirsrootnames _path_joinsroottypescvss dir_mtimesNonesfileskindsvclibsFILEsrevsdeadsdatesstacksappendsgenerate_tarball_headersoutsdirsossstatspathsinfosST_MODEsmodesopenfilesnamesfpsreadscontentsscloseslenswriteserrorssDIRscfgs is_forbiddensoptionss hide_cvsrootsmtimesgenerate_tarball(soutsrequestsreldirsstacks dir_mtimesfpstar_dirsfilesmtimescontentssentriessinfosrep_pathscvssmodesdir((s lib/viewvc.pysgenerate_tarball$ sj    4 !&   '=  $cCs‘|iii otiddƒ‚n|iidƒti i ƒt i dddfgƒ}t||ggƒ|iddƒ|iƒdS( NsTarball generation is disableds 403 Forbiddensapplication/octet-streamsgzips-cs-nsi(srequestscfgsoptionss allow_tarsdebugsViewVCExceptionsserversheaderssyssstdoutsflushspopens pipe_cmdssfpsgenerate_tarballswritesclose(srequestsfp((s lib/viewvc.pysdownload_tarball~ s   cCs/|idjotddƒ‚nt|ƒ}|i}y|ii|idƒƒ}Wn(t i j ot iddƒ‚nXt i i|i|ƒ\} }} }t| |iƒ}t|tt|ƒddƒodSn|iii}t|id |ƒƒ}t}t}t} t}|ot!|ƒ|joLt!|ƒ|}|i"ƒ}d |d <|i$d |d dƒ}|| }nS|ot!|ƒ|jo8|} |i"ƒ}t|d <|i$d |d dƒ}nx|D]•} t| _&| _'| _(| _)| i*t i+jod p| i*t i,jodpt}| i-djp | i-djo| i. od | _/d | _0nt}| i*t i+jot2}| i/omhdt|ƒ<dt|ƒ<dt| i3ƒ<}|i$dt4d| i5d| i*d |d dƒ| _'q3n| i*t i,jo t6}n| i*o·| i-djot| i3ƒ} | i8}nt|ƒ} | i5}|i$d|d|d| i*d hd| | i3| _?| `5| `8| `3qÝWt}}|d joA|i$dtBdtdtd hdt|dƒRevision view not supported for CVS repositories at this time.s400 Bad RequestsrevisionsInvalid revisions 404 Not Foundsweakis limit_changesisparamssescapesfilesdirsaddedsreplacedspathrevsr1sr2s view_funcswherespathtypesdeletedsrevsauthorsdateslogsagoschangess prev_hrefs next_hrefs more_changessmore_changes_hrefs first_changessfirst_changes_hrefsjump_rev_actionsjump_rev_hidden_values(KsrequestsroottypesViewVCExceptionscommon_template_datasdatas query_dictsreposs_getrevsgetsrevsvclibsInvalidRevisionsdebugssvnsget_revision_infosdatesauthorsmsgschangessmake_time_stringscfgsdate_strscheck_freshnesssNonesstrsoptionss limit_changesscfg_limit_changessints more_changessmore_changes_hrefs first_changessfirst_changes_hrefslenscopysparamssget_urlschanges view_hrefs diff_hrefstypeslog_hrefspathtypesFILEsDIRsactionsis_copys text_modss prop_modss view_funcs view_markupsbase_revs view_diffsfilenamesview_directoryslink_revs base_paths link_wheresview_logseztsbooleanspaths copy_pathscopy_revs prev_rev_hrefs next_rev_hrefs view_revisionsyoungestsupdateshtmlifys html_timesget_formsserversheaders generate_page(srequests query_dictsfirst_changes_hrefsauthorsrevs next_rev_hrefs more_changessparamsscfg_limit_changesslink_revsmsgschangesdates first_changess limit_changessdatas view_funcsmore_changes_hrefs prev_rev_hrefschangess link_wherespathtypesdate_str((s lib/viewvc.pys view_revision s¼   $    :+   6                     œ ) cCs:|iiio&|itijo|iddgjSdS(s9Returns true if querying is supported for the given path.scvsssvnN(srequestscfgscvsdbsenabledspathtypesvclibsDIRsroottype(srequest((s lib/viewvc.pysis_query_supported scCst|ƒ o&tid|i|ifdƒ‚nt|ƒ}|idt dhdt <ƒ\|d<|d<|i i dd ƒ|d<|i i d d ƒ|d <|i i d d ƒ|d <|i i d d ƒ|d <|i i dd ƒ|d<|i i dd ƒ|d<|i i dd ƒ|d<|i i ddƒ|d<|i i ddƒ|d<|i i ddƒ|d<|i i dd ƒ|d<|i i dd ƒ|d s*   !c Cs)dg}|iiddƒ} | oY|idƒd| jo|idƒn|idƒ|id|ii| ƒƒn|iid dƒ}|oEt |ƒd jo|id ƒn|id |ii|ƒƒn|iid dƒ}|iiddƒ}|o!|id|ii|ƒƒn|idƒ|o!|id|ii|ƒƒn|iiddƒ}|djo0|id|ii|iiddƒƒƒn^|djo|idƒn@|djo|idƒn"|djo|idƒn|djo|idƒnæ|djoØ|iiddƒ} |iid dƒ}| o|od!d"f\}}nd#d$f\}}| o3tt| ƒ|iƒ} |id%|| fƒn|o3tt|ƒ|iƒ}|id%||fƒqnti|dƒSd&S('s)Generate a sentance describing the query.s Checkins sdirssto s,ssubdirectoriess subdirectorys %s sfileisand sto file %s swhosbranchson branch %s son all branches sby %s sdateshourssin the last %s hourss2sdaysin the last daysweeksin the last weeksmonthsin the last monthsallssince the beginning of timesexplicitsmindatesmaxdatesbetweensandssincesbefores%s %s N(sretsrequests query_dictsgetsdirsappendsserversescapesfileslenswhosbranchsdatesmindatesmaxdatesw1sw2smake_time_strings parse_datescfgsstringsjoin( srequestsw1sbranchsmaxdatesw2swhosretsfilesdatesdirsmindate((s lib/viewvc.pys english_queryZ sZ    !!! ! 0     cCsvti|dƒ}tt|dƒdƒ|dt?| ƒ|i ƒt8jƒ}tAttBiC|dƒƒ}|o5|ddjo |i iEiFp|i iG|dƒoqQn|iiHtd|d|ii|ƒd|ii|i)ƒƒd|ii|iƒƒd | d!|i-ƒd"tI|iJƒƒd#tI|iKƒƒd$|d%| d&| d'|d(|d)|d*|ƒƒqQW|SdS(+Ns num_filessfilesissvns %s://%s%ssHTTPSsonshttpsshttps HTTP_HOSTs view_funcsparamssrevisionsescapeis s/s%s/%ssRemovespathrevswherespathtypesChangesr1sr2s diff_formatsCVSROOTsdatesdirsfilesauthorsrevsbranchsplussminusstypesdir_hrefslog_hrefs view_hrefs download_hrefs prefer_markups diff_href(Ls_itemslensfilesscommitseztsbooleans limited_filessGetDescriptionsdescshtmlifyslogs format_logsrequestscfgs short_logsserversescapes GetAuthorsauthorsmake_rss_time_stringsGetTimesrss_datesroottypes GetRevisionsrevsgetenvsget_urls view_revisionsrss_urlsNones dir_strips len_stripsfs commit_timesmake_time_strings GetTypeStrings change_typesprev_revsrev_prevs GetDirectorysdirnamesGetFilesfilenamesAssertionErrorsparamss GetBranchsview_directorysvclibsDIRsdir_hrefsview_logsFILEslog_hrefs diff_hrefs view_hrefs download_hrefs view_markups view_checkoutscopysdiff_href_paramssupdates view_diffs default_views guess_mimes prefer_markupsfiltersstringssplits dir_partssoptionss hide_cvsroots is_forbiddensappendsints GetPlusCounts GetMinusCount(srequestsfiless limited_filess dir_strips len_strips prefer_markupsdirnamesdiff_href_paramss view_hrefslog_hrefsdir_hrefsrevsfilenamesrev_prevs dir_partssparamss commit_times change_typesdescs diff_hrefsfs download_hrefscommit((s lib/viewvc.pys build_commit– s˜A         1 %      ( ? cCsÝ|iidƒ|odGHdGHdGHdGHHndGHdGHdSx˜|D]}x‡|iD]|}|idjo+d |it |iƒ|i |i fGHqU|id jo+d |it |iƒ|i |i fGHqUqUWqEWdS( Ns text/plains8# This page can be saved as a shell script and executed.s@# It should be run at the top of your work area. It will updates;# your working copy to back out the changes selected by thes# query.s(# No changes were selected by the query.s# There is nothing to back out.scvsscvs update -j %s -j %s %s/%sssvnssvn merge -r %s:%s %s/%s( srequestsserversheaderscommitsscommitsfilessfileinfosroottypesrevsprev_revsdirsfile(srequestscommitssfileinfoscommit((s lib/viewvc.pys query_backoutû s$ +c,Cso t|ƒ o&tid|i|ifdƒ‚n|iiddƒ}|iiddƒ}|iiddƒ}(|iiddƒ}|iid dƒ}+|iid dƒ}|iid dƒ} |iid d ƒ}|iid dƒ}|iiddƒ}|iiddƒ}|iiddƒ} |iidƒ}t|iiddƒƒ}'t|iid|iiiƒƒ}hdd<dd<dd<dd<dd<}hd d<dd<dd<}$hdd<dd<dd<dd<dd<d d<}|i|ƒ o d}n|i|+ƒ o d}+n|i| ƒ o d} n|$i|ƒ o d }n|i|ƒ o d}nt|ƒ}t| ƒ} dkati |iƒ}ti"||i#ƒ\}}| otid!|iƒ‚nti&ƒ}|i(|ƒ|djo |d"jo|i)dƒn|o|i)||ƒn|(oqx¹t*i+|(d#ƒD]V}t-||i.t*i/|ƒgƒ}|i1|dƒ|i1d$ti2|ƒdƒqWnLt-||i.ƒ}*|*o1|i1|*dƒ|i1d$ti2|*ƒdƒn|o|i3||+ƒn|o|i4|| ƒn|i5|ƒ|djo|i6t|ƒƒn¹|djo|i7dƒn›|djo|i7d%ƒn}|djo|i7d&ƒn_|djonN|d jo@|t8j o|i9|ƒn| t8j o|i:| ƒqIn|'o|i;|'ƒn(|d'jo|i;|iii<ƒn|i=|ƒ|i>i?|i@|ƒƒ}g}d}d}d(}#|iFoÒg}d} |iFdiIƒ}%|iFdiKƒ}&t-|ƒ}x`|iFD]U})|)iOƒ|#jo|)iOƒ}#n|t|)iPƒƒ}|t|)iQƒƒ}|)iIƒ}"|iSd)joJ|%|"jo9| ptT|ƒ|jo|iU|)ƒqd} qq!nM|&|)iKƒjo9| ptT|ƒ|jo|iU|)ƒqd} qntT|ƒo |iUtV||| |ƒƒn|)g}d} |"}%|)iKƒ}&qWtT|ƒo |iUtV||| |ƒƒq¤ntWiX|iSd)jo|djp |djƒ} |iZd*t[d+dƒ} |ii]ƒ}d,|d<|iZd-|d+dƒ}!|ii]ƒ}d|d<|iZd-|d+dƒ}|#djota||#ƒodSqyn|d,jotb||ƒdSntc|ƒ} | iehd.|<d/tf|ƒ<d0| <d1|!<d2|<d3|<d4| <d |<d5|<d|<d6|<ƒ|d'jo$|i>igd7ƒth|d'| ƒn|i>igƒth|d8| ƒdS(9Ns(Can not query project root "%s" at "%s".s 403 Forbiddensbranchss branch_matchsexactsdirsfiles file_matchswhos who_matchs querysortsdateshourss2smindatesmaxdatesformatslimitis limit_changesislikesglobsregexsnotregexsauthorsdaysweeksmonthsallsexplicits3The root '%s' was not found in the commit database sHEADs,s%s/%%iisrssiÿÿÿÿscvss view_funcsescapesbackoutsparamsssqls english_querysqueryform_hrefs backout_hrefs plus_counts minus_counts show_branchscommitsslimit_changes_hrefstext/xmls query_results(isis_query_supportedsrequestsdebugsViewVCExceptionsrootnameswheres query_dictsgetsbranchs branch_matchsdirsfiles file_matchswhos who_matchs querysortsdateshourssmindatesmaxdatesformatsintslimitscfgsoptionss limit_changess match_typess sort_typess date_typesshas_keys parse_datescvsdbsConnectDatabaseReadOnlysdbsFindRepositorysrootpaths repos_roots repos_dirsCreateCheckinQuerysquerys SetRepositorys SetBranchsstringssplitssubdirs _path_joins path_partssstripspaths SetDirectorys EscapeLikesSetFiles SetAuthors SetSortMethodsSetFromDateHoursAgosSetFromDateDaysAgosNonesSetFromDateObjectsSetToDateObjectsSetLimits rss_row_limitsRunQuerysserversescapesCreateSQLQueryStringssqlscommitss plus_counts minus_countsmod_times commit_listsfiless limited_filessGetDescriptionIDs current_descs GetRevisions current_revs dir_stripscommitsGetTimes GetPlusCounts GetMinusCountsdescsroottypeslensappends build_commitseztsbooleans show_branchsget_urlsview_queryformsqueryform_hrefscopysparamss backout_hrefslimit_changes_hrefscheck_freshnesss query_backoutscommon_template_datasdatasupdates english_querysheaders generate_page(,srequests branch_matchs repos_dirs minus_counts querysorts dir_stripsfilesqueryslimit_changes_hrefsdatas show_branchsqueryform_hrefsmaxdates who_matchs plus_counts date_typessparamsssubdirsbranchscommitssmindatesfilessformats repos_rootswhosdbshourss match_typesssqlsdatespaths limit_changess limited_filess backout_hrefsdescsmod_times sort_typess current_descs current_revslimitsdirscommitswheres file_match((s lib/viewvc.pys view_query s 3!<          #%!                     $2         v  scosdiffsgraphimgslogsmarkupspatchsquerys queryformsrootsstarsredirect_pathrevcCs|h}x4|iiiƒD] }|ii|dg||