From 2a7d26a8b08fa6776529e6b39aa09e7557a570f9 Mon Sep 17 00:00:00 2001
From: Bertrand Lorentz
Date: Fri, 29 Mar 2013 17:50:07 +0100
Subject: [PATCH] audit: Add gen-apidiff-html tool to generate apidiff reports
The gen-apidiff-html tool takes all apidiff files in a directory, merges
them and then applies mono-api.xsl to produce a nice HTML page that
shows the information about the API changes.
The various resources needed by the HTML page (images, CSS, javascript)
are added in the html/ directory.
This is all adapted from an older version of the tools in Mono git
master, under mcs/tools/corcompare.
---
audit/gen-apidiff-html.cs | 73 +++++
audit/html/c.gif | Bin 0 -> 150 bytes
audit/html/cormissing.css | 213 ++++++++++++++
audit/html/cormissing.js | 584 ++++++++++++++++++++++++++++++++++++++
audit/html/d.gif | Bin 0 -> 137 bytes
audit/html/e.gif | Bin 0 -> 861 bytes
audit/html/en.gif | Bin 0 -> 111 bytes
audit/html/f.gif | Bin 0 -> 90 bytes
audit/html/i.gif | Bin 0 -> 90 bytes
audit/html/m.gif | Bin 0 -> 101 bytes
audit/html/n.gif | Bin 0 -> 65 bytes
audit/html/p.gif | Bin 0 -> 111 bytes
audit/html/r.gif | Bin 0 -> 73 bytes
audit/html/s.gif | Bin 0 -> 127 bytes
audit/html/sc.gif | Bin 0 -> 70 bytes
audit/html/se.gif | Bin 0 -> 73 bytes
audit/html/sm.gif | Bin 0 -> 76 bytes
audit/html/st.gif | Bin 0 -> 101 bytes
audit/html/sx.gif | Bin 0 -> 73 bytes
audit/html/tb.gif | Bin 0 -> 49 bytes
audit/html/tm.gif | Bin 0 -> 64 bytes
audit/html/tp.gif | Bin 0 -> 67 bytes
audit/html/w.gif | Bin 0 -> 81 bytes
audit/html/y.gif | Bin 0 -> 92 bytes
audit/makefile | 5 +-
audit/mono-api.xsl | 541 +++++++++++++++++++++++++++++++++++
26 files changed, 1415 insertions(+), 1 deletion(-)
create mode 100644 audit/gen-apidiff-html.cs
create mode 100644 audit/html/c.gif
create mode 100644 audit/html/cormissing.css
create mode 100644 audit/html/cormissing.js
create mode 100644 audit/html/d.gif
create mode 100644 audit/html/e.gif
create mode 100644 audit/html/en.gif
create mode 100644 audit/html/f.gif
create mode 100644 audit/html/i.gif
create mode 100644 audit/html/m.gif
create mode 100644 audit/html/n.gif
create mode 100644 audit/html/p.gif
create mode 100644 audit/html/r.gif
create mode 100644 audit/html/s.gif
create mode 100644 audit/html/sc.gif
create mode 100644 audit/html/se.gif
create mode 100644 audit/html/sm.gif
create mode 100644 audit/html/st.gif
create mode 100644 audit/html/sx.gif
create mode 100644 audit/html/tb.gif
create mode 100644 audit/html/tm.gif
create mode 100644 audit/html/tp.gif
create mode 100644 audit/html/w.gif
create mode 100644 audit/html/y.gif
create mode 100644 audit/mono-api.xsl
diff --git a/audit/gen-apidiff-html.cs b/audit/gen-apidiff-html.cs
new file mode 100644
index 000000000..b04e0c9b0
--- /dev/null
+++ b/audit/gen-apidiff-html.cs
@@ -0,0 +1,73 @@
+//
+// gen-apidiff-html.cs - Converts a set of apidiff files to HTML by
+// merging them and applying an XSL file.
+//
+// Author:
+// Bertrand Lorentz (bertrand.lorentz@gmail.com)
+//
+// Copyright (C) 2013 Bertrand Lorentz
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Xsl;
+
+namespace Mono.AssemblyCompare
+{
+ public class Driver
+ {
+ static int Main (string [] args)
+ {
+ if (args.Length != 2) {
+ Console.WriteLine ("Usage: mono gen-apidiff-html.exe ");
+ return 1;
+ }
+
+ string diff_dir = args[0];
+ string out_file = args[1];
+
+ var all = new XmlDocument ();
+ all.AppendChild(all.CreateElement ("assemblies"));
+ foreach (string file in Directory.EnumerateFiles(diff_dir, "*.apidiff")) {
+ Console.WriteLine ("Merging " + file);
+ var doc = new XmlDocument ();
+ doc.Load (file);
+ foreach (XmlNode child in doc.GetElementsByTagName ("assembly")) {
+ XmlNode imported = all.ImportNode (child, true);
+ all.DocumentElement.AppendChild (imported);
+ }
+ }
+
+ var transform = new XslCompiledTransform ();
+ transform.Load ("mono-api.xsl");
+ var writer = new StreamWriter (out_file);
+
+ Console.WriteLine (String.Format ("Transforming to {0}...", out_file));
+ transform.Transform (all.CreateNavigator (), null, writer);
+ writer.Close ();
+
+ return 0;
+ }
+ }
+}
+
diff --git a/audit/html/c.gif b/audit/html/c.gif
new file mode 100644
index 0000000000000000000000000000000000000000..02c347efd0b42a6a8be1239b8f1f65d386017246
GIT binary patch
literal 150
zcmZ?wbhEHb6krfw*v!DtzyQQR03!Y~03i?ng+Mfj!T^dtS-@gCAQEH-1B= 0 && fView)
+ {
+ eltLink.src = 'tm.gif';
+ elt.className = elt.className.slice (0, ich);
+ }
+ }
+}
+
+function firstElement (elt)
+{
+ var c = elt.firstChild;
+ while (c != null) {
+ if (c.nodeType == 1) // Node.ELEMENT_NODE (IE6 does not recognize it)
+ return c;
+ c = c.nextSibling;
+ }
+ return null;
+}
+
+function trimSrc (strSrc)
+{
+ return strSrc.slice (strSrc.lastIndexOf ('/') + 1, strSrc.lastIndexOf ('.'));
+}
+
+function getChildrenByTagName (elt, strTag)
+{
+ strTag = strTag.toLowerCase ();
+ var rgChildren = new Array ();
+ var eltChild = firstElement (elt);
+ while (eltChild)
+ {
+ if (eltChild.tagName && eltChild.tagName.toLowerCase () == strTag)
+ rgChildren.push (eltChild);
+ eltChild = eltChild.nextSibling;
+ }
+ return rgChildren;
+}
+
+function viewAll (elt, dictTypes)
+{
+ var fView = isShown (elt, dictTypes);
+
+ var aCounts = new Array (4);
+ for (i = 0; i < 4; i++)
+ aCounts [i] = 0;
+ var rgElts = getChildrenByTagName (elt, 'DIV');
+ for (iElt in rgElts) {
+ var aChildRet = viewAll (rgElts [iElt], dictTypes);
+ if (aChildRet != null) {
+ fView = true;
+ for (i = 0; i < 4; i++)
+ aCounts [i] += aChildRet [i];
+ }
+ }
+
+ elt.style.display = fView ? '' : 'none';
+
+ if (!fView)
+ return null;
+
+ rgShownDivs = getChildrenByTagName (elt, 'DIV');
+ for (i = 0; i < rgShownDivs.length; i++) {
+ var cDiv = rgShownDivs [i];
+ if (cDiv.style.display == 'none')
+ continue;
+ incrementCount (cDiv, aCounts, dictTypes);
+ }
+
+ // update the numbers
+ rgSpans = getChildrenByTagName (elt, 'SPAN');
+ for (iSpan in rgSpans) {
+ var cSpan = rgSpans [iSpan];
+ var cImage = firstElement (cSpan);
+ if (cImage == null)
+ continue;
+ switch (trimSrc (cImage.src)) {
+ case 'st': cSpan.lastChild.nodeValue = ": " + aCounts [0]; break;
+ case 'sm': cSpan.lastChild.nodeValue = ": " + aCounts [1]; break;
+ case 'sx': cSpan.lastChild.nodeValue = ": " + aCounts [2]; break;
+ case 'se': cSpan.lastChild.nodeValue = ": " + aCounts [3]; break;
+ }
+ }
+ return aCounts;
+}
+
+function isShown (elt, dictTypes)
+{
+ if (!isShownMarkType (elt, dictTypes))
+ return false;
+
+ return true;
+}
+
+function isShownMarkType (elt, dictTypes)
+{
+ var rgImages = getChildrenByTagName (elt, 'IMG');
+ var cImages = rgImages.length;
+ for (var iImage = 0; iImage < cImages; iImage++)
+ {
+ var strImage = trimSrc (rgImages [iImage].src);
+ if (dictTypes [strImage])
+ return true;
+ }
+ return false;
+}
+
+function incrementCount (cDiv, aCounts, dictTypes)
+{
+ switch (cDiv.className) {
+ case 'y': case 'y_': // assembly
+ case 'n': case 'n_': // namespace
+ // types
+ case 'c': case 'c_': case 'i': case 'i_':
+ case 'en': case 'en_': case 'd': case 'd_':
+ // members
+ case 'r': case 'r_': case 'x': case 'x_': case 'm': case 'm_':
+ case 'f': case 'f_': case 'e': case 'e_': case 'p': case 'p_':
+ case 'o': case 'o_': case 'a': case 'a_':
+ var rgImgs = getChildrenByTagName (cDiv, 'IMG');
+ for (iImg = 0; iImg < rgImgs.length; iImg++) {
+ var cImg = rgImgs [iImg];
+ if (cImg.className != 't')
+ continue;
+ var stype = trimSrc (cImg.src);
+ if (!dictTypes [stype])
+ continue;
+ switch (stype) {
+ case "st": aCounts [0]++; break;
+ case "sm": aCounts [1]++; break;
+ case "sx": aCounts [2]++; break;
+ case "se": aCounts [3]++; break;
+ default:
+ continue;
+ }
+ break;
+ }
+ break;
+ }
+}
+
+/* just for debugging use now.
+function firstInnerText (elt)
+{
+ var s = elt.innerText;
+ if (s != null)
+ return s;
+ var n = elt.firstChild;
+ while (n != null) {
+ s = n.nodeValue;
+ if (s != null && s.replace (/^\s+/g, '') != '')
+ return s;
+ s = firstInnerText (n);
+ if (s != null)
+ return s;
+ n = n.nextSibling;
+ }
+ return s;
+}
+*/
+
+function getView (elt)
+{
+ var eltLink = firstElement (elt);
+ if (eltLink != null && eltLink.className == 't') // toggle
+ {
+ var ich = elt.className.indexOf ('_');
+ if (ich < 0)
+ return true;
+ }
+ return false;
+}
+
+function getParentDiv (elt)
+{
+ if (elt)
+ {
+ do
+ {
+ elt = elt.parentNode;
+ }
+ while (elt && elt.tagName != 'DIV');
+ }
+
+ return elt;
+}
+
+function getName (elt)
+{
+ var rgSpans = getChildrenByTagName (elt, 'SPAN');
+ for (var iSpan = 0; iSpan < rgSpans.length; iSpan ++)
+ {
+ var span = rgSpans [iSpan];
+ if (span.className == 'l') // label
+ {
+ if (span.innerText)
+ return span.innerText;
+ else
+ return span.firstChild.nodeValue;
+ }
+ }
+ return null;
+}
+
+function clickHandler (evt)
+{
+ var elt;
+ if (document.layers)
+ elt = evt.taget;
+ else if (window.event && window.event.srcElement)
+ {
+ elt = window.event.srcElement;
+ evt = window.event;
+ }
+ else if (evt && evt.stopPropagation)
+ elt = evt.target;
+
+ if (!elt.className && elt.parentNode)
+ elt = elt.parentNode;
+
+ if (elt.className == 'l') // label
+ {
+ var strClass;
+ var strField;
+ var strNamespace;
+ var strAssembly;
+ var strFieldType;
+
+ elt = getParentDiv (elt);
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'x') // constructor
+ {
+ strField = 'ctor';
+ elt = getParentDiv (elt);
+ }
+ else
+ if (strEltClass == 'm' || // method
+ strEltClass == 'p' || // property
+ strEltClass == 'e' || // event
+ strEltClass == 'f') // field
+ {
+ strFieldType = strEltClass;
+ strField = getName (elt);
+ var match = strField.match ( /[\.A-Z0-9_]*/i );
+ if (match)
+ strField = match [0];
+ elt = getParentDiv (elt);
+
+ }
+
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'c' || // class
+ strEltClass == 's' || // struct
+ strEltClass == 'i' || // struct
+ strEltClass == 'd' || // delegate
+ strEltClass == 'en') // enum
+ {
+ strClass = getName (elt);
+ if (strEltClass == 'en')
+ strField = null;
+ elt = getParentDiv (elt);
+ }
+
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'n')
+ {
+ strNamespace = getName (elt);
+ elt = getParentDiv (elt);
+ }
+
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'y')
+ {
+ strAssembly = getName (elt);
+ }
+
+ if (evt.ctrlKey)
+ {
+ var strRoot = 'http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/';
+ var strExtra = '';
+
+ if (strAssembly)
+ {
+ if (strAssembly == 'mscorlib')
+ strAssembly = 'corlib';
+ else if (strAssembly == 'System.Xml')
+ strAssembly = 'System.XML';
+
+ strRoot = strRoot + strAssembly + '/';
+ if (strNamespace)
+ {
+ strRoot = strRoot + strNamespace + '/';
+ if (strClass)
+ {
+ strRoot += strClass + '.cs';
+ strExtra += '?view=markup';
+ }
+ }
+ window.open (strRoot + strExtra, 'CVS');
+ }
+ }
+ else if (strNamespace)
+ {
+ if (document.getElementById ('TargetMsdn1').checked)
+ {
+ var re = /\./g ;
+ strNamespace = strNamespace.toLowerCase ().replace (re, '');
+ if (strClass)
+ strNamespace += strClass.toLowerCase () + 'class';
+ if (strField)
+ strNamespace += strField;
+ if (strClass || strField)
+ strNamespace += 'topic';
+
+ window.open ('http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrf' + strNamespace + '.asp', 'MSDN');
+
+ }
+ else
+ {
+ if (strClass)
+ strNamespace += '.' + strClass;
+ if (strField)
+ strNamespace += '.' + strField;
+ if (document.getElementById ('TargetMonodoc').checked)
+ {
+ var category = null;
+ if (strClass == null)
+ category = "N:";
+ else if (strField == null)
+ category = "T:";
+ else {
+ switch (strFieldType) {
+ case 'f': category = "F:"; break;
+ case 'p': category = "P:"; break;
+ case 'm': category = "M:"; break;
+ case 'e': category = "E:"; break;
+ }
+ }
+ if (category != null)
+ window.open ('http://www.go-mono.com/docs/monodoc.ashx?link=' + category + strNamespace);
+ }
+ else
+ {
+ window.open ('http://msdn2.microsoft.com/library/' + strNamespace + '.aspx', 'MSDN');
+ }
+ }
+ }
+ }
+ else
+ {
+ if (elt.parentNode && elt.parentNode.className == 't') // toggle
+ elt = elt.parentNode;
+ else if (elt.className != 't') // toggle
+ return;
+
+ while (elt != null && elt.tagName != 'DIV')
+ elt = elt.parentNode;
+
+ if (evt.shiftKey)
+ {
+ var rgElts = getChildrenByTagName (elt, 'DIV');
+ var cElts = rgElts.length;
+ if (cElts != 0)
+ {
+ var fView = false;
+ var iElt;
+ for (iElt = 0; iElt < cElts; iElt ++)
+ {
+ if (getView (rgElts [iElt]))
+ {
+ fView = true;
+ break;
+ }
+ }
+ for (iElt = 0; iElt < cElts; iElt ++)
+ {
+ setView (rgElts [iElt], !fView);
+ }
+ }
+ }
+ else if (evt.ctrlKey)
+ {
+ setView (elt, true);
+ var eltParent = getParentDiv (elt);
+ while (eltParent)
+ {
+ var rgSiblings = getChildrenByTagName (eltParent, 'DIV');
+ var cSiblings = rgSiblings.length;
+ for (var iSibling = 0; iSibling < cSiblings; iSibling++)
+ {
+ var eltSibling = rgSiblings [iSibling];
+ if (eltSibling != elt)
+ {
+ setView (eltSibling, false);
+ }
+ }
+ elt = eltParent;
+ eltParent = getParentDiv (elt);
+ }
+ }
+ else
+ toggle (elt);
+ }
+
+ return false;
+}
+
+function filterTree ()
+{
+ var eltMissing = document.getElementById ('missing');
+ var eltTodo = document.getElementById ('todo');
+ var eltExtra = document.getElementById ('extra');
+ var eltErrors = document.getElementById ('errors');
+ var eltStable = document.getElementById ('stable');
+
+ var dictTypes = new Object ();
+ if (eltMissing.checked)
+ dictTypes ['sm'] = true;
+ if (eltTodo.checked)
+ dictTypes ['st'] = true;
+ if (eltErrors.checked)
+ dictTypes ['se'] = true;
+ if (eltExtra.checked)
+ dictTypes ['sx'] = true;
+ if (eltStable.checked)
+ dictTypes ['sc'] = true;
+
+ viewAll (document.getElementById ('ROOT'), dictTypes);
+}
+
+function addAndFilter ()
+{
+ var newInput = document.getElementById ('NewFilterTarget');
+ var newAttr = newInput.value;
+ if (newAttr.length > 0) {
+ var selection = document.getElementById ('FilteredAttributes');
+ var newElem = document.createElement ('option');
+ newElem.appendChild (document.createTextNode (newAttr));
+ selection.appendChild (newElem);
+ newInput.value = '';
+ filterTree ();
+ }
+}
+
+function removeAndFilter ()
+{
+ var selection = document.getElementById ('FilteredAttributes');
+ if (selection.selectedIndex >= 0) {
+ var newInput = document.getElementById ('NewFilterTarget');
+ if (newInput.value.length == 0)
+ newInput.value = selection.options [selection.selectedIndex].firstChild.nodeValue;
+ selection.removeChild (selection.options [selection.selectedIndex]);
+ filterTree ();
+ }
+}
+
+function selectMissing ()
+{
+ toggleFilter ('missing');
+}
+
+function selectTodo ()
+{
+ toggleFilter ('todo');
+}
+
+function selectExtra ()
+{
+ toggleFilter ('extra');
+}
+
+function selectErrors ()
+{
+ toggleFilter ('errors');
+}
+
+function selectStable ()
+{
+ toggleFilter ('stable');
+}
+
+function toggleAttributeFilter (attrName)
+{
+ toggleFilter (attrName);
+}
+
+function toggleFilter (strFilter)
+{
+ var eltTodo = document.getElementById ('todo');
+ var eltMissing = document.getElementById ('missing');
+ var eltExtra = document.getElementById ('extra');
+ var eltErrors = document.getElementById ('errors');
+
+ var eltToggle = document.getElementById (strFilter);
+ if (window && window.event && window.event.shiftKey)
+ {
+ eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = false;
+ eltToggle.checked = true;
+ }
+ else
+ if (!eltTodo.checked && !eltMissing.checked && !eltExtra.checked && !eltErrors.checked)
+ {
+ eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
+ eltToggle.checked = false;
+ }
+ filterTree ();
+}
+
+function onLoad ()
+{
+ var eltMissing = document.getElementById ('missing');
+ var eltTodo = document.getElementById ('todo');
+ var eltExtra = document.getElementById ('extra');
+ var eltErrors = document.getElementById ('errors');
+ eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
+ filterTree ();
+}
+
+if (document.layers)
+{
+ document.captureEvents (Event.MOUSEUP);
+ document.onmouseup = clickHandler;
+}
+else if (document.attachEvent)
+{
+ document.attachEvent('onclick', clickHandler);
+}
+else if (document.addEventListener)
+{
+ document.addEventListener('click', clickHandler, false);
+}
+else
+ document.onclick = clickHandler;
+
diff --git a/audit/html/d.gif b/audit/html/d.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c9735952f33ce1c324694af50ec016013c1224b3
GIT binary patch
literal 137
zcmZ?wbhEHb6krfwSj524z|a5$2M!$g&+wmtf#Lsu5D5f|KUu)E4u}M)WnlJ;*mY%J
z0IQ>Rr?yLB;Y9&<)|AXy)73<>qhqpP?K;A+JV%cIkE*{)SabT}vvJ#!xHJ?B8O$6W
fFTO0eByS&*7Yrr54
zOK4GJG1x$Z#c)fIav~!tqNR_uWSNl_*^&zjij`3n)u@LQz0nz6(a6IOXfll*=!XOf
zVGS6hVM!}ISPVAMV6~i6nVhK1mXYXVEm>7o<12DuK{30s@e!vn0A93XG-|ODKcLAp
zcEAb2D1wdw09@<<>;<4+_zX^?=
zj4Vn|Y~?OE&nV?vHkTr_{)kCtFn5w4nF+_RhGfWpN&>1Ep^rJNf+re~SnMgEash$RK9`
literal 0
HcmV?d00001
diff --git a/audit/html/i.gif b/audit/html/i.gif
new file mode 100644
index 0000000000000000000000000000000000000000..56cd032a565f89845e0ac7ff7a332ec5d4495e5e
GIT binary patch
literal 90
zcmZ?wbhEHb6krfwn8?7;(9m$;zySsZhX4QnEB<5wG8h-n&}rR1`G*fZuHa$v51|rfXf^9sd50pGAy;!5RS0;T?Pc
literal 0
HcmV?d00001
diff --git a/audit/html/m.gif b/audit/html/m.gif
new file mode 100644
index 0000000000000000000000000000000000000000..75fe3586d48bb17baa6d988cd2492af535a73fd8
GIT binary patch
literal 101
zcmZ?wbhEHb6krfwSj50^;J|?fAYf?t&+wmtf#Lsu5D5f2AOfU@f!Qcx*PVX`r(D%!
yOD8FAxDz{_)zMLl1=izYEJSOWlnL?d$m
literal 0
HcmV?d00001
diff --git a/audit/html/n.gif b/audit/html/n.gif
new file mode 100644
index 0000000000000000000000000000000000000000..f6fa746304d8d763eec15a0ebcb39078b3b22ac1
GIT binary patch
literal 65
zcmZ?wbhEHb6krfwXkY+=|NsB%fM}2i1Cv5e|H{*Q8Te9!ua@{uyIA%obK#GkgWD#?
Pac){&J?q>X5e91jW_1^A
literal 0
HcmV?d00001
diff --git a/audit/html/p.gif b/audit/html/p.gif
new file mode 100644
index 0000000000000000000000000000000000000000..b79d0dd7edb10b694efddae3efd5c630810141fd
GIT binary patch
literal 111
zcmZ?wbhEHb6krfwSj524(9i%R4jeeZz`*eT|9>C}0g69azziJ_2~x|zY~r!&&c6x0
zmYy8>9eaFLMyXto#I74F}H9XEpPqi{XBr~m^4lhU02m8a)29qkl4SejdV
cJB3ec{&nA{8Esmfb5&Q@PI12O#>ij|0B;l;9{>OV
literal 0
HcmV?d00001
diff --git a/audit/html/s.gif b/audit/html/s.gif
new file mode 100644
index 0000000000000000000000000000000000000000..f2fd5c8aee22abf3fb7bddd26d8a404834e485c8
GIT binary patch
literal 127
zcmZ?wbhEHb6krfwSj51<(9qBT#{U_B5D0)mAX@P!3y8&_10q0b8JJxvcBTJ0FT$Q|
zxmmBXdx1cB#Ub&yO?%JKo+ogl{EHx)to||sfxd&X8w*t!7!EG|_@hLp
Q+iyi%;)T4Ow^xH#$XKq@BJ4)
literal 0
HcmV?d00001
diff --git a/audit/html/se.gif b/audit/html/se.gif
new file mode 100644
index 0000000000000000000000000000000000000000..1c46eaa588795488e4d65724de4a77e06fe3c5bc
GIT binary patch
literal 73
zcmZ?wbhEHbY+D@2z+epkbpaT&
literal 0
HcmV?d00001
diff --git a/audit/html/sm.gif b/audit/html/sm.gif
new file mode 100644
index 0000000000000000000000000000000000000000..0c7194786d5685c6767a440632b3bf4ea2624dd0
GIT binary patch
literal 76
zcmZ?wbhEHb*x10p@c;jR#h)w;AfN*xK=KSsvUB=7l{VVWaBehQ
a;FcO0Ju#NS-SKdT?2=t2?^cU2SOWktUKcw6
literal 0
HcmV?d00001
diff --git a/audit/html/st.gif b/audit/html/st.gif
new file mode 100644
index 0000000000000000000000000000000000000000..067582cb398506ed795358cbadf68d89996691a2
GIT binary patch
literal 101
zcmZ?wbhEHb{RaUct@x7##AVO{5g@e;%vu?0PKyHe
sCdI_GO>$jD#~0O*|_$N&HU
literal 0
HcmV?d00001
diff --git a/audit/html/sx.gif b/audit/html/sx.gif
new file mode 100644
index 0000000000000000000000000000000000000000..2c8ca54792980ba8d37687ee1b06f7a6a5009b9d
GIT binary patch
literal 73
zcmZ?wbhEHb1ev35*BQ=fyEGSOWly>mp_V
literal 0
HcmV?d00001
diff --git a/audit/html/y.gif b/audit/html/y.gif
new file mode 100644
index 0000000000000000000000000000000000000000..08f00d4ea11f8d253bff1cc22a94a23d41e0c30f
GIT binary patch
literal 92
zcmZ?wbhEHb6krfwn8?7;(9m$;zySsZhX4QnEB<5wG8h
+
+
+
+
+
+
+
+
+
+
+ Gtk# API Status
+
+
+
+
+
+
+
Gtk# API Status
+
+
+
+
+
+
+
+
+
+ Legend :
+
+
+ |
+ Assembly |
+ |
+ |
+ Namespace |
+ |
+ |
+ Class |
+ |
+ |
+ Struct |
+
+
+ |
+ Interface |
+ |
+ |
+ Delegate |
+ |
+ |
+ Enum |
+ |
+ |
+ Method |
+
+
+ |
+ Field |
+ |
+ |
+ Property |
+ |
+ |
+ Event |
+ |
+ |
+ Attribute |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ c
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ w
+
+
+
+
+
+
+
+
+
+
+
+
+ d
+
+
+
+
+
+
+
+
+
+
+
+
+ en
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ p
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ e
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ x
+ m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ f
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ o
+ m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _
+
+
+
+
+
+ se.gif
+ t
+
+
+
+
+
+ st.gif
+ t
+
+
+
+
+ No TODO description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ a
+ tb
+
+
+
+
+
+
+
+
+
+ :
+
+ %
+
+
+
+
+ :
+
+
+
+
+ :
+
+
+
+
+ :
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WARNING:
+
+
+
+
+
+
+
+
+
+
+
+