tag:blogger.com,1999:blog-17182328975444242372024-02-06T21:28:12.094-08:00The Battey MuseA blog dedicated to hard and soft software development problems.Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.comBlogger37125tag:blogger.com,1999:blog-1718232897544424237.post-67253673932298664112019-09-13T08:46:00.001-07:002019-09-13T08:46:46.326-07:00Using Redis as Data Store<a href="https://redis.io/" target="_blank">Redis</a>, if you're not familiar with it, is a high performance, in-memory, key-value database. It is transient in nature, meaning it doesn't have a built-in means to <a href="https://redis.io/topics/introduction" target="_blank">store data to non-volitile memory</a> (you know solid state drives, hard disk, optical disk, magnetic tape, floppy disk, barrel memory, clay cuneiform). Redis has it's own protocol that is for the most part ASCII/UTF-8 based with support for non-ASCII/UTF-8 keys and values. Redis has a relatively <a href="https://redis.io/topics/security" target="_blank">simplistic security model</a> with a single optional password for access. Further Redis doesn't support in-transit encryption directly and relies on firewall and encrypted proxy layers instead.<br />
<br />
There are a handful of use cases for Redis. Most of these focus on increasing the performance of web applications by holding data in memory instead of a more complex data store like a relational database, or NoSQL store like Mongo. Even thought it's relatively straight forward, Redis has advanced features like <a href="https://redis.io/topics/transactions" target="_blank">transactions</a> and <a href="https://redis.io/topics/cluster-tutorial" target="_blank">clustering</a> with <a href="https://redis.io/topics/sentinel" target="_blank">automatic fail-over</a>. Advanced features aside, I'd like to focus the caching use case with a couple different models, such as Write-Through and Least Recently Used.<br />
<br />
<h4>
Write-Through Caching</h4>
<a href="https://en.wikipedia.org/wiki/Cache_(computing)#WRITE-THROUGH" target="_blank">Write-Through Caching</a> (WTC) works best when Redis has enough memory to store all of the data you will use. Items in a WTC typically are never <a href="https://en.wikipedia.org/wiki/Cache_replacement_policies" target="_blank">evicted</a>, beause a WTC doesn't <a href="https://en.wikipedia.org/wiki/Lazy_loading" target="_blank">lazy-load</a>. From this standpoint you could call a WTC an in-memory database that trades performance for reliability. Redis counters this with <a href="https://redis.io/topics/sentinel" target="_blank">sentinal</a> capabilities. But automatic-failover doesn't help much if you have a complete power failure in your data center(s), or need to relocate your servers, and don't have a <a href="https://en.wikipedia.org/wiki/Hibernation_(computing)" target="_blank">hibernate</a> of option. So, you'll need to write-through to your backing store and have a method to resume from a full stop.<br />
<br />
What is write-through you ask? Basically, write creates, updates, and deletes to Redis when ever you would update your backing store. This way the two are always synchronized. Redis supports transactions, so it is possible to implement a <a href="https://en.wikipedia.org/wiki/Three-phase_commit_protocol" target="_blank">distributed commit</a> strategy. Think of something like this:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">begin_redis_transaction();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">update_redis();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">if (update_backing_store() is successful) </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> commit_redis_transaction();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">else</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> roll_back_transaction();</span><br />
<br />
When you read from a WTC, just query Redis, you don't need to do anything with the backing store. Except, if your Redis server stops for some reason, you'll need to pull all of the records from the backing store and update Redis w/o the write-through logic above.<br />
<br />
Some of the benefits of a WTC:<br />
<ul>
<li><b>Guaranteed performance</b> - reading is constant you don't pay a price for cache misses, because if it's not there, it doesn't exist.</li>
<li><b>Guaranteed accuracy</b> - the cache doesn't rely only on item life expectancy to update with new values.</li>
</ul>
WTC Considerations:<br />
<ul>
<li><b>Memory</b> - the Redis data store must be big enough to hold all of your cacheable data</li>
<li><b>Resumption</b> - after a catastrophic failure, it will take some time to reload the Redis store from the backing store, more for the more items you have.</li>
</ul>
<br />Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-63153034554654807402018-09-19T12:37:00.000-07:002018-09-19T12:37:06.811-07:00JSON ParsingJust because it's the current thing for exchanging information over the interwebz, and because I've needed a method to serialize custom properties for SAFMQ, I've developed a couple of JSON parsers.<br />
<br />
I know, I know... There are literally hundreds of JSON parsers (well tens for C++), but a bunch had requirements like C++11 (which is kinda old, but pretty new as far as SAFMQ goes).<br />
<br />
So I write one in C++, it uses std::vector<T>, std::map<K,T>, and std::string to manage it's contents. I also features custom validators to check numeric formats, and works on a byte-by-byte method of parsing, so it's pretty fast. Only slowed down by the time to place items in the vector/map for arrays and object members. Since it's C++ I overloaded the <span style="color: #3d85c6;"><span style="font-family: "Courier New", Courier, monospace;">operator[](int)</span></span> and <span style="color: #3d85c6;"><span style="font-family: "Courier New", Courier, monospace;">operator[](const std::string&)</span></span> to access items and members, and added methods to make it seem like a vector or map when you access contents. There's a set of cast operators to retrieve integers, doubles, and strings. I snached up some CppUnit code to throw a bunch of tests at it. CppUnit doesn't have code coverage built in, so my goal was to manually ensure I covered every branch. I feel pretty good about it.<br />
<br />
Then yesterday I decided to do the same in Java. I'm new to IntelliJ that we use at work so it was an opportunity to get more familiar with the IDE as well as check code coverage with jUnit what not. Like the C++ version it does a byte-by-byte parse, and leverages ArrayList<T> and HashMap<T> for items and members. Java doesn't have custom operators, so in come getters an setters. Overall, I'm pretty pleased, although I had to do some weird steps to ensure 100% code coverage (if/throw on a single line, remove an early check and put it deeper in the method, which lead to sub-optimal code). Most of it was because the overall structure of the program, double checking conditions in subsequent code, etc. Built this one with 100% coverage in a day, so I feel pretty good about it.<br />
<br />
<br />
<br />Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-27900260793631762322018-08-26T18:27:00.001-07:002018-08-26T18:27:44.020-07:00SAFMQ 0.8.5 Released todayHot off the press, SAFMQ 0.8.5, with updates for MacOS X, FreeBSD 11, Fedora Core 28, and test compilation for 64 bit Windows. The 64 bit installer for windows is on it's way...<br />
<br />
Check out the latest files: <a href="https://sourceforge.net/projects/safmq/files/SAFMQ/SAFMQ%200.8.5/">https://sourceforge.net/projects/safmq/files/SAFMQ/SAFMQ%200.8.5/</a><br />
<br />
Grab documentation on the project site: <a href="http://safmq.sourceforge.net/">http://safmq.sourceforge.net</a>Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-2167156693152602802018-08-17T13:21:00.002-07:002018-08-17T13:21:23.656-07:00Store and Forward Message QueueI'm looking back through my blog posts and it seems I've never posted about my long lived open source project <a href="http://safmq.sourceforge.net/" target="_blank">SAFMQ</a>.<br />
<br />
Just recently I've had some time to get back to it... As I'm looking at the traffic at <a href="https://sourceforge.net/projects/safmq/" target="_blank">Source Forge</a>, and I'm a little downtrodden. Back in the day (prior to 2014) there was such a thing as <a href="http://freshmeat.sourceforge.net/" target="_blank">FreshMeat</a> which became <a href="http://freecode.com/" target="_blank">Freecode</a> and died. Back then you could advertise your open source project, and you'd get a bunch of traffic sent your way. I'm not really sure why Freecode/FreshMeat went away, but the official reason was "The Freecode site has been moved to a static state effective June 18,
2014 due to low traffic levels and so that folks will focus on more
useful endeavors than site upkeep." I'm not sure what that really meant, because there were nearly 40 packages announced that day...<br />
<br />
Anyway, I'm back at, and some of the things I've been looking into are making it Mac OS compatible, improving some of the not-before/not-after X.509 cert management, and gathering performance tests on a bunch of platforms for comparisons. More to comeMatthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-71756866569460427982018-07-31T11:26:00.001-07:002018-07-31T11:26:42.129-07:00NPM and External Dependencies for PowerBI Custom VisualsThe custom slicer I built for Power BI has a few advanced UI features, clickable DIVs, a slider control, text input with validation. It may have been possible to develop all of those interactions myself, but why intent the wheel. jQuery and jQuery UI really add all of the features and simplify a lot of the coding.<br />
<br />
Here's a step-by-step process that I used to get jQuery and jQuery-UI into my visual.<br />
<ol>
<li>Start with <a href="https://docs.microsoft.com/en-us/power-bi/service-custom-visuals-getting-started-with-developer-tools" target="_blank">Use Developer tools to create custom visuals</a>.</li>
<li>Then add jQuery and the strong types to be TypeScript friendly:</li>
<ol>
<li><span style="font-family: "courier new" , "courier" , monospace;">npm install jquery</span></li>
<li><span style="font-family: "courier new" , "courier" , monospace;">npm install "@types/jquery"</span> </li>
</ol>
<li>Add jQuery UI (this was the hard part, see below).</li>
</ol>
I'm new to Node.js projects (do I capitalize Node.js, yes?), and I'm still getting familiar with the overall structure. The thing I'm getting off the bat is that the <span style="font-family: "courier new" , "courier" , monospace;">node_modules</span> folder is special. For one, it should be 100% managed by <a href="https://www.npmjs.com/" target="_blank">npm</a>. That means that stuff placed there shouldn't be committed to your code repository (I'm not there 100%, but I'm getting close). <br />
<br />
Full disclosure, I started by putting some non-TypeScript code there that I had written (CSS, custom JavaScript, etc.). But it's not an npm package, so it shouldn't be there. I moved it to my <span style="font-family: "courier new" , "courier" , monospace;">src </span>folder. Next, I tried and tried to use an npm package for jQuery UI. I tried the jquery-ui package, but it has to be built. Then I got some new info and tried the jquery-ui-dist package. But, I'm getting an error when compiling. Near the very last line of jquery-ui.css there's a rule:<br />
<br />
filter: Alpha(Opacity=.3);<br />
<br />
But, Node.js doesn't understand that rule and throws the error "<span style="font-family: "courier new" , "courier" , monospace;">error LESS style/visual.less : (1307,23) Could not parse alpha</span>". I did some searches and the only way to fix it is to modify the code. I don't want to modify the code in <span style="font-family: "courier new" , "courier" , monospace;">node_modules</span>.<br />
<br />
My fix was to download the vanilla version of jQuery UI. Then cherry pick only the assets I need to be successful. I grabbed <span style="font-family: "courier new" , "courier" , monospace;">jquery-ui.js<span style="font-family: "trebuchet ms" , sans-serif;">, </span>jquery-ui.min.js</span>, and the minimal items from the <span style="font-family: "courier new" , "courier" , monospace;">css </span>folder in the distribution. For the timebeing they are in a jquery-ui folder in node_modules. I know I just got done writing that this was bad, so my next step will be to move them to the <span style="font-family: "courier new" , "courier" , monospace;">src </span>folder. Optimally, it would be great if I could just use the jquery-ui-dist package, but it seems that I can't, yet...<br />
<br />
<br />Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-14852290649865446132018-07-31T11:26:00.000-07:002020-06-29T10:35:01.508-07:00Removing Document Edit Protections from Word DOCX filesEver wanted to edit a Word document that had editing disabled? Typically you need to have a password to be able to edit the file, but if you really want to get rid of it, there's a pretty straight forward process.<br />
<br />
<ol>
<li>Unzip the DOCX file (it's just a ZIP file after all) into a directory some where.
<ul><ul>
<li>This produces the following:</li>
<ul>
<li>[Content_Types].xml</li>
<li>_rels (sub directory)</li>
<li>docProps (sub directory)</li>
<li>word (sub directory) </li>
</ul>
</ul>
</ul>
</li>
<li>Using your favorite text editor (I used VIM), edit the file word/settings.xml</li>
<li>Remove the XML tag: <w:documentProtection/></li>
<li>Zip up the three (3) directories and the [Content_Types].xml file and make sure the extension on the zip file is DOCX.</li>
</ol>
<br />
You're ready to go. You've now removed the protections on a Word Document. Be careful with your new found powers, young padawan. Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com1tag:blogger.com,1999:blog-1718232897544424237.post-62068365879807628802018-07-06T11:46:00.001-07:002018-07-06T14:43:56.339-07:00Power BI Custom Visual Design Considerations<span style="font-size: normal;">Back at the Power BI custom slicer... We ran into an intermittent bug that would happen when you first open a report and when you switch between tabs. The root cause comes from a feature where the first or last item is automatically chosen, something handy when you want to see the latest data based on a range of dates.</span><br />
<span style="font-size: normal;"><br /></span>
<span style="font-size: normal;">Some background on Power BI Custom visuals, they are TypeScript (JavaScript) based, and are defined by the interface IVisual. As of v1.11.0, the IVisual interface has three methods:</span><br />
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">update(options: VisualUpdateOptions): void</span></li>
<li><span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">destroy?(): void</span></li>
<li><span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">eumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstanceEnumeration</span></li>
</ul>
<span style="font-size: normal;"><span style="font-family: inherit;">There's also a constructor that receives a <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">VisualConstructorOptions</span></span> object, and a bunch of methods that aren't documented, yet. Turns out that <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span> is called immediately after the constructor, and after every call to <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">ISelectionManager.applySelectionFilter()</span></span> (APF here on, which changes the filters applied to any connected visuals). When APF is called and the selection is the same as it was before, there's a good chance that it won't trigger an update, which is nice because people like to double click stuff.</span></span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiIaopgXmZegHLT3cjGIjP8PuywhsgZnR6E7d3yYcb1pXHPOeZ2YKR5ytTsrZNsrzw-eaw3-d9lJ4GoVmWtZPaAJdBC2zOCmj52OuQSZIRZgS41K1MzanBWQv5QQMFrV6bA1pxioIolZ0W/s1600/PBISlicerV1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="251" data-original-width="463" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiIaopgXmZegHLT3cjGIjP8PuywhsgZnR6E7d3yYcb1pXHPOeZ2YKR5ytTsrZNsrzw-eaw3-d9lJ4GoVmWtZPaAJdBC2zOCmj52OuQSZIRZgS41K1MzanBWQv5QQMFrV6bA1pxioIolZ0W/s320/PBISlicerV1.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Here the slider sent an on change when the selected value was updated programmatically.</td></tr>
</tbody></table>
<span style="font-size: normal;"><br /></span>
<span style="font-size: normal;"><span style="font-family: inherit;">The kicker is when your custom visual changes the selection and calls APF during a call to <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span>. Mine did, on every call, and the only thing keeping it from an infinite loop of updates was the under-the-covers check to see if the selection was the same. But what if there was a delay in the selection updates, and it caused a cycle between an old selection and the one that was just forced? Infinite loop...</span></span><br />
<span style="font-size: normal;"><br /></span>
<span style="font-size: normal;"><span style="font-family: inherit;">I tried all kinds of things. First, I thought that there was a direct path between APF and <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span>, so I put some Boolean locks around the code calling APF to avoid stack overflows and stop the loop. But, even though it looks like it on the stack inspector, the selection changed events are detected in some sort of async loop instead inline with stack execution. Then I tried to make the code as clean as possible, but that didn't help. The piece of information I was missing? The very first call to <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span> after the constructor restored the previous selection filter w/o having to call APF. <a href="http://community.powerbi.com/t5/Developer/Calling-ISelectionManager-applySelectionFilter-from-IVisual/m-p/450593" target="_blank">Support on the Power BI board</a>, said to never call APF from <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span>, because it can cause an infinite loop, and testing showed that the previous selection was always pre-choosen when the report loads (as long as you store the selection under the property "general" when it changes, more on that later). So don't call APF </span></span><span style="font-size: normal;"><span style="font-family: inherit;">from <span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: normal;">update()</span><span style="font-family: inherit;"><span style="font-size: x-small;">. </span></span></span></span></span></span><br />
<span style="font-size: normal;"><br /></span>
<span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;">But I really wanted to pick the first or last item by default. The change was to be sure to never call APF from </span></span></span></span><span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-family: inherit;"><span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span></span></span> more than once. I was already detecting the first call to</span></span></span></span><span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-family: inherit;"><span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;"> update()</span></span></span></span> after the constructor, then it was just a matter of:</span></span></span></span><br />
<ul>
<li><span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;">If it isn't the first call to </span></span></span></span><span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-family: inherit;"><span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span></span></span> don't call APF.</span></span></span></span></li>
<li><span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;">If it's the first call to </span></span></span></span><span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-family: inherit;"><span style="font-size: normal;"><span style="font-family: "courier new" , "courier" , monospace;">update()</span></span></span></span> and only if the current selection isn't the one you want call APF.</span></span></span></span></li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi33pHfWL1zCkT3ybo4VB9VoBgqZ1LwuSCAo3_kUk0fU8bn1DfjQurjbeU1mCcNZVtqfY3brmex0PXOOc4trPFdHcSffeM6FSg1P-3yDfFiSaE5loNhSXnptAIB67e4c39pb_rRfMgpfo6O/s1600/PBISlicerV1.1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="247" data-original-width="463" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi33pHfWL1zCkT3ybo4VB9VoBgqZ1LwuSCAo3_kUk0fU8bn1DfjQurjbeU1mCcNZVtqfY3brmex0PXOOc4trPFdHcSffeM6FSg1P-3yDfFiSaE5loNhSXnptAIB67e4c39pb_rRfMgpfo6O/s320/PBISlicerV1.1.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In this version, onChange() isn't called during a call to update()</td></tr>
</tbody></table>
<span style="font-family: inherit; font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;"><span style="font-size: normal;">With this change to the logic, APF could only be called w/o user intervention once after the report loads, and so no loop.</span></span></span></span>Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-45180345111336872422018-05-10T11:52:00.001-07:002018-05-10T11:52:23.488-07:00Coding PowerBI Custom VisualsIn my last post I discussed a need for a new slicer visual for Power BI. There's only one slicer visual built into Power BI. It's pretty good in most cases. The Power BI Slicer visual provides the following selection modes:<br />
<ul>
<li>List - for all types</li>
<li>Dropdown List - for all types</li>
<li>After, Before, Between, Relative - for dates</li>
<li>Between, Less than or equal, Greater than or equal - for numeric values</li>
</ul>
Pretty powerful set of choices. Plus Power BI provides special handling for the slicer visual. When you cut and paste a slicer from one page to another page, Power BI offers to automatically synchronize choices. And if you didn't go that route, the View tab in the Ribbon has a checkbox to show the "Sync slicers" pane. Selecting the Slicer visual in the report area will update the Sync Slicers pane, and show you all of the other pages where a Slicer is using the same field to filter content on the page. Overall a valuable feature for reports with multiple pages of related information.<br />
<br />
But... What if you have a need to filter a report by a single discrete value out of a large set of values? The List/Dropdown List isn't a very good option, and if it's dates, the range selection can be clumsy...<br />
<br />
So with that said, I jumped right into building my own slicer. Requirements:<br />
<ul>
<li>Work with large set of discrete values</li>
<li>Provide forward and backward paging</li>
<li>Provide a thumb to drag</li>
<li>Provide a text box for direct entry</li>
</ul>
Also, it should have some validation on text entry and paging to keep it in bounds. It would also be nice to remember the last selection, or default to the first value or last value when reloading the report.<br />
<br />
This was the easy part. Next up, I'll write up the steps I took to put the feature together.Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-51180789885858259732018-04-30T09:23:00.002-07:002018-04-30T09:23:11.640-07:00Power BI Custom VisualsThe last few weeks I've journeyed into the strange realm of PowerBI Custom Visuals. My goal was to create a new slicer that picks a single value from large set of values. We have a need to look at daily reported values. The Range picker won't work well because it's difficult to pick single day. The drop down works well when there's only a handful of items. But, what if you're working with a timeline, especially when there will be hundreds or thousands of choices.<br />
<br />
In, comes the custom visual. I blended a jQuery UI Slider with a text input box, and two spans styled as buttons. The user can use the increment and decrement buttons to move to the next item, click the bar or drag the thumb to zoom to a location, or enter the exact value they are looking for. There's some validation built in. For instance, manually entered values are checked against the list of possibles. The user can't make the control increment or decrement pas the end of the sets...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpOn2P9OD1yXn3gB2orIh2SxSYQ7XsM5q4a3RUb3-N7_YGd9VR2j59KDiDzjd8b1UUfrfORp_2B_DdmSTHN6BD0F-Fdr5tN05MbnZu-5xrW48tSYWdXDnzJfOanp4x_uBYccn9Yel8Muy/s1600/SingleValueSlider.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="312" data-original-width="649" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpOn2P9OD1yXn3gB2orIh2SxSYQ7XsM5q4a3RUb3-N7_YGd9VR2j59KDiDzjd8b1UUfrfORp_2B_DdmSTHN6BD0F-Fdr5tN05MbnZu-5xrW48tSYWdXDnzJfOanp4x_uBYccn9Yel8Muy/s400/SingleValueSlider.PNG" width="400" /></a></div>
<br />
Next post, getting into the dirty work of implementing the visual. The whole thing is a TypeScript project following the Node.js patterns. NPM works great to add some of the common features, but the uncommon ones? I may have not followed the specs perfectly when including custom JavaScript (jQuery UI + code to implement the combined UI elements), but it's working at the moment. I'll be digging into how exactly to bring these custom features into a project correctly, as it appears that "non project" code should be include through NPM...Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-4882687202773428842018-01-10T18:16:00.001-08:002018-01-12T08:21:59.754-08:00SharePoint CSOM failures 400 Bad RequestSo, I have a monolithic development farm (DC, SQL Server, SharePoint 2016) all in one VM that I use to develop solutions for SharePoint. I had Visual Studio 2015 installed, but my coworkers wanted to start using Visual Studio 2017.<br />
<br />
As you probably know, when you uninstall Visual Studio, it doesn't uninstall all of the stuff that comes along with it. So I removed all of the packages installed on the same date as Visual Studio 2015. The only thing is, I uninstalled WCF Data Services as well (v 5.6.0.0). I don't know why it wasn't listed on the day I installed SharePoint, maybe it was, and maybe I was a bit aggressive.<br />
<br />
Well it turns out that CSOM requests (<span style="color: #3d85c6;"><span style="font-family: "courier new" , "courier" , monospace;">Microsoft.SharePoint.Client.ServerRuntime</span></span>) and it is dependent on <span style="color: #3d85c6;"><span style="font-family: "courier new" , "courier" , monospace;">Microsoft.Data.Edm</span></span> and <span style="font-family: "courier new" , "courier" , monospace;"><span style="color: #3d85c6;">Microsoft.Data.OData</span> </span>(both v 5.6.0). These are both prerequisites for SharePoint 2016, but don't show up as a problem when just accessing the site. Here's the PowerShell code that would trigger the issue:<br />
<br />
<span style="color: #38761d;"><br /></span><span style="font-family: "courier new" , "courier" , monospace;"><span style="color: #6aa84f;"># $ctx is a valid, initialized ClientContext</span><br />$ctx.Load($ctx.Web)<br />$ctx.ExecuteQuery() # throws a 400 Bad Request exception</span><br />
<br />
<br />
I first found the problem by trying to access the site via CSOM. Then I upgraded to a newer CU and PSCONFIG.exe failed. Checking the PSCONFIG.exe log I found I had the same problem. That lead me to this support post <a href="https://social.technet.microsoft.com/Forums/en-US/ad12d96d-27a2-4320-a40a-85039c973e51/sharepoint-2016-configuration-failed?forum=sharepointadmin" target="_blank">SharePoint 2016 Configuration failed</a>, and it set me on the track to solve the issue.<br />
<br />
I first tried to replace the individual packages, but that didn't work very well (I couldn't seem to download the right packages). So I re-ran the SharePoint prerequisite installer and that was the key to success.<br />
<br />
Here's some of the errors from various logs that lead me to the solution. Maybe by posting these errors, it will draw people to this page if they come across a 400 Bad Request error from CSOM code.<br />
<br />
From the Upgrade log:<br />
<span style="color: #666666;"><span style="font-family: "courier new" , "courier" , monospace;"><span style="color: #999999;">Exception: Could not load file or assembly 'Microsoft.Data.Edm, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.<br /><br />Exception: Could not load file or assembly 'Microsoft.Data.OData, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.</span></span></span><br />
<br />
From the ULS Logs:<br />
<br />
<span style="color: #999999;"><span style="font-family: "courier new" , "courier" , monospace;">Error when processing types in server stub DLL Microsoft.SharePoint.Client.ServerRuntime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, Error=System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) at System.Reflection.Assembly.GetTypes() at Microsoft.SharePoint.Client.ProxyMap.ProcessOneAssembly(Assembly azzembly, ClientServiceHost processorSurrogate) at Microsoft.SharePoint.Client.ProxyMap.Init(ClientServiceHost processorSurrogate)<br /><br />System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Data.Edm, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. File name: 'Microsoft.Data.Edm, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' <br /><br />System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Data.OData, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. File name: 'Microsoft.Data.OData, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' </span></span>Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-65530206095103477182017-11-08T13:56:00.000-08:002017-11-08T13:56:00.355-08:00Connecting SharePoint On Premesis with Azure AD : Protocol Sequence<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: inherit;">As promised, here's a post on the design for a Security Token Service (<a href="https://en.wikipedia.org/wiki/SAML_2.0" target="_blank">Identity Provider</a>) that integrates SharePoint (2010, 2013, or 2016 take your pick, one service covers all versions) and Microsoft's Azure AD (a.k.a. Passport, Windows Live ID, XBox Live ID, Live ID, Windows ID). The premise for such: Microsoft used to provide <a href="https://technet.microsoft.com/en-us/library/ff973117(v=office.14).aspx" target="_blank">claims-based authentication for Windows Live IDs</a>, but seems to have lost interest in supporting the interface (the certificate expired October 29<sup>th</sup>, 2013). Further, SharePoint doesn't accept OAuth2 tokens (even though it will provide them for "Apps").</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: inherit;">Hence, an interface layer is required to translate OAuth2 tokens (provided by the <a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-scenarios" target="_blank">Azure AD login service</a>) to a SAML 2.0 token that can be consumed by SharePoint. The following diagram is a high level UML Sequence diagram depicting an unauthenticated Browser (<a href="https://en.wikipedia.org/wiki/SAML_2.0" target="_blank">User Agent</a>), SharePoint (<a href="https://en.wikipedia.org/wiki/SAML_2.0" target="_blank">Service Provider</a>), Security Token Provider (a.k.a. STS, <a href="https://en.wikipedia.org/wiki/SAML_2.0" target="_blank">Identity Provider</a>), and Azure AD (<a href="https://en.wikipedia.org/wiki/OAuth" target="_blank">OAuth 2.0 Identity Provider</a>).</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwPMuX4rcl28n_l_7kn3ts4d5UkUQfXHCye9iXQMuB71mJknMGjjrVjyv7xysc5iWU2dBP6vtXoK0xHGHSYRK0ttdyW6EQNGHmcFmbBzGgb3mm0OCvD-oao2p5uNuH1Na3xJRjehiLqi4H/s1600/LoginSequence.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="312" data-original-width="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwPMuX4rcl28n_l_7kn3ts4d5UkUQfXHCye9iXQMuB71mJknMGjjrVjyv7xysc5iWU2dBP6vtXoK0xHGHSYRK0ttdyW6EQNGHmcFmbBzGgb3mm0OCvD-oao2p5uNuH1Na3xJRjehiLqi4H/s1600/LoginSequence.png" /></a></div>
<br />
<br />
So you may ask: Why not use the <a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-saml-protocol-reference" target="_blank">Azure AD SAML protocol</a> endpoint? This is a really great question! When we started the project, information on the endpoint didn't come across our search scopes. Also, we had developed a number of Identity Providers integrated with web applications that inherited identity properties from a number of sources. Alas, as it turns out, none of these really mattered, because the Azure AD SAML protocol endpoint is described as an Oasis WS-Federation endpoint using three different signing certificates. This is something that SharePoint just cant consume (yet).<br />
<br />
Here's some of the reasons why the Azure AD SAML endpoint wouldn't work:<br />
<ul>
<li>SharePoint can't consume the WS-Federation Identity Provider Identity Provider descriptor directly.</li>
<li>Azure AD's Identity Provider endpoint lists three signing certificates, where SharePoint maps a single certificate to an Identity Provider</li>
<li>Azure AD requires a <a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-saml-protocol-reference" target="_blank">Metadata URI</a> from the Service Provider which SharePoint doesn't provide natively. </li>
<li>Azure AD provides so many SAML assertions that SharePoint just doesn't need. This isn't really a failure, but something that can cause the SharePoint "Share UI" to become confused when assigning claims.</li>
</ul>
Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-5460928583603278352017-10-30T08:30:00.001-07:002017-11-08T09:22:01.764-08:00Integrating your App with Office 365 and Azure ADHey all, I recently built a project that integrated Azure AD users (read this as Pasport, Xbox Live, Live ID, Windows ID, Azure AD, or what ever you really want) with SharePoint 2016 on-premises. Pretty straight forward task, build an OAuth2 application that converts to SAML 2.0 Passive Authentication, configure to authenticate with Azure AD and pass the info off to SharePoint.<br />
<br />
Microsoft has some really great examples, that are built right into the App registration portal at <a href="https://apps.dev.microsoft.com/">https://apps.dev.microsoft.com</a>. My task saw me building a "Web Platform" app. The how-to was straight forward, and I followed the steps in from the Guided Setup option when I registered my App. I choose "Server-side Web App," with the ASP.Net Web App (OWIN) guided setup.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg28wHavTlW-DjKIz2ra49gDJjrHJrCKHuBppU_7AgdoHsw1TIdn_DYjcPGAid12uzH2I24IDLpA3E4w4JqkU3TJ4R0-6T69J0kmWc48MNhmxorEOgapwPfKWnyg0Z0UqW1gn89tRjwqkvv/s1600/registerapp.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="742" data-original-width="1218" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg28wHavTlW-DjKIz2ra49gDJjrHJrCKHuBppU_7AgdoHsw1TIdn_DYjcPGAid12uzH2I24IDLpA3E4w4JqkU3TJ4R0-6T69J0kmWc48MNhmxorEOgapwPfKWnyg0Z0UqW1gn89tRjwqkvv/s400/registerapp.PNG" width="400" /></a></div>
The walk through is really great and even points some optimizations to ensure all of your MVC app is secured, vs. only the sign-in and sign-out actions. The example even provided a second controller (/claims) that helps you debug the results you get back from Microsoft.<br />
<span style="font-size: large;"><br /></span>
<br />
<h3>
<span style="font-size: large;">The Pros</span></h3>
<br />
Probably the best thing about the sample is that it immediately shows authentication against the "Common" logon portal. This is essential for the application we were building, as very few of the users logging in would be from our organization. The other thing was that it just worked straight out of the box.<br />
<br />
Everything was straight forward, copy code, add it to your app. Git some OWN packages and link them in too. Took me less than an hour to get everything up and running.<br />
<br />
<h3>
<span style="font-size: large;">The Cons</span></h3>
<br />
So, Microsoft didn't follow their own best practices when putting the sample together with the default App registration.<br />
<br />
It turns out that the whole system works great with the Office 365 out of the box security configuration. But some of our clients opted to configure their tenant to disallow users from consenting to data sharing. There's one setting that is either labeled differently in the Admin Portal and again in Azure AD configuration, or one directly changes the other (in the end they're a single setting). In the <span style="background-color: white;"><span style="color: #666666;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Admin Portal it's <span style="color: #999999;">Settings -> Services & Add-ins -> Integrated apps</span></span></span></span>. In Azure AD it's <span style="color: #999999;"><span style="background-color: white;"><span style="color: #666666;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Azure Active Directory -> User Settings -> Enterprise Applications, Users can consent to apps accessing company data on their behalf</span></span></span> </span>(See below for screenshots).<br />
<br />
When these are disabled, a Global Administrator must consent to the application to allow non-administrators the ability to log-on. Without that special consent, the admins can logon but no-one else.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZai1vBDiJc3MwqUjRrnduySxsnbe0Xl9Ywvk6E1Sx4CV-MABJDZAXZSUzJiFfAC9-zrxixgZL2uwr4knjn2brUnW91hVDJXJbvWwqi8-ouaKibi4eULITjcQI7Vta-a9uOCwqrGtrsHsa/s1600/admincenter-apps.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="614" data-original-width="1342" height="91" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZai1vBDiJc3MwqUjRrnduySxsnbe0Xl9Ywvk6E1Sx4CV-MABJDZAXZSUzJiFfAC9-zrxixgZL2uwr4knjn2brUnW91hVDJXJbvWwqi8-ouaKibi4eULITjcQI7Vta-a9uOCwqrGtrsHsa/s200/admincenter-apps.PNG" width="200" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMHwXfOBQtcw7WnMJ8Q2VU6MmM864XTnjEWjLDyuMleZN1bpk43S_ihbZowGjSEltlJ2oMFFy-WkxZyD46Vb6P4whnKPBufqqXXE6RZMiKKNIVx50im4wL7BTZ0huzXggD9R53zbSB2wBX/s1600/aad-apps.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="408" data-original-width="1354" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMHwXfOBQtcw7WnMJ8Q2VU6MmM864XTnjEWjLDyuMleZN1bpk43S_ihbZowGjSEltlJ2oMFFy-WkxZyD46Vb6P4whnKPBufqqXXE6RZMiKKNIVx50im4wL7BTZ0huzXggD9R53zbSB2wBX/s320/aad-apps.PNG" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
Try as we might we just couldn't shake the error:<br />
<br />
<div style="padding-left: 30pt; padding-right: 30pt;">
<span style="font-size: x-small;"><span style="font-family: "arial" , "helvetica" , sans-serif;">You can't access this application<br /><FooBar App> needs permission to access resources in your organization that only an admin can grant. Please ask an admin to grant permission to this app before you can use it.</span></span></div>
<br />
We followed every direction given to compose the admin authorization consent URL and consent to the application. Finally, based on a single article on <a href="https://stackoverflow.com/questions/46689484/microsoft-graph-api-aadsts90094-the-grant-requires-admin-permission" target="_blank">Stack Overflow</a>, we learned that the "Dynamic Scope" must match the "Microsoft Graph Permissions" configured in you application. When a Global Admin consents to an application, he/she is only consenting to those <span style="color: #999999;">Permissions </span>found in the App Registration, and not to a <span style="color: #999999;">Scope </span>passed in the consent URI. Supposedly, it was a new change...<br />
<br />
<h3>
The Fix</h3>
I wasn't sure how to harmonize the Microsoft Graph Permissions with what every my client was sending. To my knowledge, it wasn't sending anything. Then I started digging. In Step 2 of the guided setup (Titled Setup), you add a class derived from <span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><span style="color: #3d85c6;">Object </span></span>called <span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><span style="color: #3d85c6;">Startup</span></span>. <span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><span style="color: #999999;">OWIN </span></span>apparently looks for this class when the assembly is loaded. I highlighted a line below.<br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">class</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">Startup</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;">{</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> clientId = </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">ConfigurationManager</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.AppSettings[</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">"ClientId"</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">];</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> redirectUri = </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">ConfigurationManager</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.AppSettings[</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">"RedirectUri"</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">];</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">static</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> tenant = </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">ConfigurationManager</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.AppSettings[</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">"Tenant"</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">];</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> authority = </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">String</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.Format(</span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">CultureInfo</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.InvariantCulture, </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">ConfigurationManager</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.AppSettings[</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">"Authority"</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">], tenant);</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"><summary></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> Configure OWIN to use
OpenIdConnect </span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"></summary></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"><param name="</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">app</span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">"></param></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">void</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> Configuration(</span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">IAppBuilder</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> app)</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>{</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>app.SetDefaultSignInAsAuthenticationType(</span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">CookieAuthenticationDefaults</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.AuthenticationType);</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>app.UseCookieAuthentication(</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">CookieAuthenticationOptions</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">());</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>app.UseOpenIdConnectAuthentication(</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">OpenIdConnectAuthenticationOptions</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>{</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>ClientId =
clientId,</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Authority =
authority,</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>RedirectUri
= redirectUri,</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>PostLogoutRedirectUri = redirectUri,</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="background-color: #fff2cc;">Scope = </span></span><span style="background-color: #fff2cc;"><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">OpenIdConnectScopes</span></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="background-color: #fff2cc;">.OpenIdProfile</span>,</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>ResponseType
= </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">OpenIdConnectResponseTypes</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.IdToken,</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span>TokenValidationParameters = </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">
System.IdentityModel.Tokens.</span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">TokenValidationParameters</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">() </span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"> { ValidateIssuer = </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">false</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> },</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>Notifications = </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">OpenIdConnectAuthenticationNotifications</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>{</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>AuthenticationFailed = OnAuthenticationFailed</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>);</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"><summary></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> Handle failed
authentication requests by redirecting the user to the home page with an error
in the query string</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"></summary></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"><param name="</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">context</span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">"></param></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;">///</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt;"><returns></returns></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">private</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">Task</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">
OnAuthenticationFailed(</span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">AuthenticationFailedNotification</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><</span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">OpenIdConnectMessage</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">, </span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 3.5in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">OpenIdConnectAuthenticationOptions</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">> context)</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>{</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>context.HandleResponse();</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>context.Response.Redirect(</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">"/?errormessage="</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> +
context.Exception.Message);</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">return</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">Task</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">.FromResult(0);</span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: -1.0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<span style="color: black; font-family: Consolas; font-size: 9.5pt; line-height: 107%; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">}</span><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="375">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Unresolved Mention"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><span style="color: black; font-family: Consolas; font-size: 9.5pt; line-height: 107%; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;"></span><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="375">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Unresolved Mention"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><br />
<br />
It turns out that the configuration was requesting <span style="color: #999999;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">openid </span></span>and <span style="color: #999999;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">profile</span></span>, but the default registration for my app granted access to <span style="color: #999999;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">User.Read</span></span>. As soon as I updated my registration to use only openid and profile, then used the Administrative Consent URL we were golden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0SbaovRFQusr839Cf4JnYeaK8_Q2s2SAUmMuxdR5ekwYnmhUqHmZ1NgVdwtFlWSvLKNxG7zJ2Gkg-2RjE80G2BsdALLITBvqk9fMLd5au8YPbIWHWp_hwyMe2su2nf0WvyGsbFtztb8pt/s1600/graph-perm.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="185" data-original-width="765" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0SbaovRFQusr839Cf4JnYeaK8_Q2s2SAUmMuxdR5ekwYnmhUqHmZ1NgVdwtFlWSvLKNxG7zJ2Gkg-2RjE80G2BsdALLITBvqk9fMLd5au8YPbIWHWp_hwyMe2su2nf0WvyGsbFtztb8pt/s400/graph-perm.PNG" width="400" /></a></div>
<br />
By the way, the Admin Consent URI is different for the V2.0 login endpoint, and has some limited documentation. We used on like this:<br />
<span style="color: #999999;"><br /></span>
<span style="color: #999999;">https://login.microsoftonline.com/common/adminconsent?client_id=<span style="background-color: #fff2cc;"><APPID></span>&redirect_uri=<span style="background-color: #fff2cc;"><loginURL></span></span>
<br />
<br />
Just replace your App ID and Login redirect URL, and you'll be good to go! For more reading on Admin Consent see: <a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-scopes">https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-scopes</a>Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-10803705226720487672017-06-07T14:43:00.004-07:002017-06-07T14:46:00.844-07:00Email Enable a SharePoint Online List with Flow!<h2>
The Case </h2>
It seems like the use cases for SharePoint are a little wind blown. Maybe it's because SharePoint Foundation came free with every Windows Server license since 2003 or maybe it's because SharePoint (ahem Enterprise) comes free with every Office 365 tenant. Well anyway, one really good one is for a work support, or work ticket system. You might say CRM is the way to go, except that it's really expensive, and in many cases way overblown, IMHO.<br />
<br />
So, let's go with the work ticket system. You want, proactive notification, you want status updates as the ticket is worked, you want work history, and probably want some sort of effort tracking. What else do you say?.. You want to be able to send an email to a generic email box, that will kick off work to be done?<br />
<br />
Well, all of this was built in in SharePoint on-premises versions, but with a move to Office 365, not only do you loose out on custom server side code, and the entire on-premises BI stack (Business Intelligence to keep you in the know), you also loose out on incoming email/List integration. Not to mention you cant customize the outgoing email <span style="color: #999999;"><i>From</i> </span>or <span style="color: #999999;"><i>Reply-To</i></span> for your site collections, web application, or farm. You can't even specify them at a tenant level. I'm not really sure why Microsoft choose not to do this, but there are some <a href="https://support.microsoft.com/en-us/help/3134824/information-about-changes-to-the-address-that-is-used-to-send-notification-email-messages-from-sharepoint-online" target="_blank">obscure references</a> to mail being blocked in spam filters or something. I'm not sure who really wanted email addresses spoofed, a good admin <i>reply-to</i> for support is usually what you want anyway.<br />
<br />
Hey, we really wanted that functionality, and dang-it we want it in SharePoint Online, because ... CLOUD IS AWESOME NO MORE TOUCHY THE SERVIE NETZ! As an aside, why does it seem that many arguments for cloud services are the same arguments to get all of the "wage slave IT riffraff" out of site and into the basement? Well that's a whole other article<br />
<br />
<h2>
The Soln</h2>
Man, I like it when I use that weird abbreviation that comes from technical publications, makes me feel smart or whatever, go a way, it's my feeling don't be a buzz kill :)<br />
<br />
OK, now that I got that out of my system, the solution that is both CHEEP, and INCLUDED in your O365 subscription... <a href="https://flow.microsoft.com/" target="_blank">Microsoft Flow</a>!!!<br />
<br />
Flow is pretty convenient, but what it lacks for in documentation it makes up in obscurity. Right of the bat, it has a nice Web GUI, with all of those nice connecting lines and drag and drop type abilties, you don't even have to know anything about the PowerApps <a href="https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-workflow-definition-language" target="_blank">Workflow Definition Language</a> (ok, that one's a slight stretch). But really, the big ticket item is that it has built-in support for lots and lots of Cloud tech.<br />
<br />
For instance you could send an email to a GMail then have the attachments saved to a Drop Box folder. Or maybe when a new video is added to a Vimeo channel, you want to schedule an event on your calendar to remind you to watch it. I bet you have always wanted to fetch a row from Informix whenever a issue has been assigned to you in GitHub.<br />
<br />
Well, I never wanted those either, but I did want create an item in a SharePoint list when an email was sent to a service email box. Well there's triggers and actions for that (check out the <a href="https://flow.microsoft.com/en-us/services/" target="_blank">Services list</a>, it reads like an SSAS who's-who)!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqg31FSHZFZMSBBLMrxxwPtzcLEZQQkfoCRcCV9JUkAAap7JifZQ_myK-uj0OUXhdzVzu_Z4x4tr9bbSgBDO48P3x8iE3zulYC8k02-lxhJb0yGTpocaBXHxqZrFKKnxTobNZYp4V3O_dh/s1600/flow.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1036" data-original-width="1013" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqg31FSHZFZMSBBLMrxxwPtzcLEZQQkfoCRcCV9JUkAAap7JifZQ_myK-uj0OUXhdzVzu_Z4x4tr9bbSgBDO48P3x8iE3zulYC8k02-lxhJb0yGTpocaBXHxqZrFKKnxTobNZYp4V3O_dh/s320/flow.png" width="312" /></a>To the right is a screen capture of the Flow I built for a help-desk ticketing solution (sorry for the small size, click on it to zoom in, but you already knew that. Sorry, sorry, I think I'm<i> turning Canadian</i>). We wanted two critical features. <b>First</b>, when an email arrives, create a new SPO List Item. <b>Second</b>, if a user replies to an email correctly, add any comments from the email to an appending text field on the same list item. Here's how it works.<br />
<br />
<ol>
<li>Look for new emails in the email box. We used rules in our Outlook 365 account to move them to a folder based on the alias used, thus we can support multiple lists with a single O365 account.</li>
<li>When an email arrives, fetch the email received time stamp, and then do some edits on the html message body (more on that later).</li>
<li>Decide if the email we found conforms to a "Reply-To" format or if it's something else.</li>
<li>If it's something else:</li>
<ol>
<li>Create a new SPO List Item</li>
<li>Build a path to store attachments based on the Item's ID and email timestamp. Note: Flow doesn't support adding attachments to list items yet. That's coming, but as of yesterday (June 6th, 2017) that feature is <a href="https://powerusers.microsoft.com/t5/PowerApps-Ideas/Save-attachments-to-SharePoint-list-item/idi-p/8833/page/2#comments" target="_blank">Started</a>. </li>
<li>Save each of the attachments to a Document Library referenced in the path in the previous step</li>
</ol>
<li>Else when the email conforms to the correct Reply-To subject string</li>
<ol>
<li>Retrieve the SPO List Item ID from the email's Subject field</li>
<li>Update the SPO List Item using the ID and the email's message body. We specifically updated our "Appending Text" field, that you get when you use versioned list items</li>
<li>Calculate a path to store attachments like above.</li>
<li>Save each of the attachments to a Document Library</li>
</ol>
</ol>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY9PxoKpBxsYO6Dd1fufQ43QKBtNHt_UlhZPzTuu-8nIa1gHrhp8tcQQdF6VHDmgK3mcnJk0Xz2hqoevNlKl3X4yV_BO1CFiaTHM7raEM2qBcPsr8XDAcBVV0HSAeQ90dGbgZMUIXfVEQh/s1600/emailtarget.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="652" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY9PxoKpBxsYO6Dd1fufQ43QKBtNHt_UlhZPzTuu-8nIa1gHrhp8tcQQdF6VHDmgK3mcnJk0Xz2hqoevNlKl3X4yV_BO1CFiaTHM7raEM2qBcPsr8XDAcBVV0HSAeQ90dGbgZMUIXfVEQh/s400/emailtarget.png" width="162" /></a>Check out this beauty. A screen shot of the outcome. Yes, that is me eating cake. It was my birthday, OK! I deserved it, so boo to your comments! :)<br />
<br />
<br />
Some things to know:<br />
<ul>
<li>The attachments created an interesting problem. We can't yet add them to a List Item, and in-line pictures show up as broken empty image boxes. JavaScript (jQuery) to the rescue... That comment above about editing the email's HTML was some prep to insert the timestamp into the <span style="color: #674ea7;"><span style="font-family: "courier new" , "courier" , monospace;"><IMG></span></span> tags. Then jQuery on the forms to fix it up (more on this in another post).</li>
<li>I created an email box specifically for this List integration. I'm not sure what would happen if the email was marked read before Flow tried to process it.</li>
<li>I run the Flow process as the account that owns the email box. This ensures that it would have access to Outlook 365.</li>
<li>I granted the account read access to the entire site, and contribute access to the SharePoint List. With out read access to the site, the UI doesn't work quite right as it provides a drop down to select the list to interact with.</li>
<li>I could have created the flow as another account, but I would have had to create connections Outlook and SharePoint user id's in them. It is much easier to keep it all under one account, IMHO.</li>
<li>Getting help for Microsoft Flow from the internet is crazy hard, unless you include PowerApps or Power Apps in your Google/Bing/Yahoo/DuckDuckGo query. I'm new to Flow, so I suspect it was recently rebranded. It just showed up in my Charms in February, but there's references to it on the PowerApps <a href="https://powerusers.microsoft.com/" target="_blank">PowerUsers</a> site from a couple of years ago</li>
</ul>
Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-35877141486862984352016-07-31T18:12:00.003-07:002016-07-31T18:22:14.163-07:00Zen of Ducati Fuel System Maintenance<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs3j3xzXWv_Zrp3whP8TgpESdU6si_x_BuBfjOPuHQ7lH_L3S87GjsQPjGMCRF3t06tx0zxIKRoB_VuYBfH_uUHvGAANT0rWnkQv4Lb2_SB0Y-sSlC6Rvia0_etWJkzJvaVYj3CnE0Akct/s1600/IMG_20150704_174037_424.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs3j3xzXWv_Zrp3whP8TgpESdU6si_x_BuBfjOPuHQ7lH_L3S87GjsQPjGMCRF3t06tx0zxIKRoB_VuYBfH_uUHvGAANT0rWnkQv4Lb2_SB0Y-sSlC6Rvia0_etWJkzJvaVYj3CnE0Akct/s320/IMG_20150704_174037_424.jpg" width="320" /></a>So if you you were on my Facebook feed last last summer you would have seen this picture. Yes, that is my 1999 Ducati 900 Supersport, not running. I was about half way through a 30 mile round trip when the motor started to cough and sputter. My main ride had just spent about 14 days in the shop with work related to a check-engine light coming on that turned out to be a bunch of work related to the variable timing. With that thought in the back of my head I feared the worst. Needless to say, it was the 4th of July, and I had to call my wife so she could borrow her girlfriend's pickup and we hauled the Italian artwork home.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhukCmEnnPqNe1sJHVAgOTEYVfF-ehYCThQFrSJwF5H2ApscHxc9jH8_RP0rqIQ9pOK8vExh2R1JHb2APlCyoFDAyI5l_7Qrqvry3vyNbsNcpiEaEKyUPMOyq7_OpKkZdsL5i-Jr7BmrmKO/s1600/20160731_155224.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhukCmEnnPqNe1sJHVAgOTEYVfF-ehYCThQFrSJwF5H2ApscHxc9jH8_RP0rqIQ9pOK8vExh2R1JHb2APlCyoFDAyI5l_7Qrqvry3vyNbsNcpiEaEKyUPMOyq7_OpKkZdsL5i-Jr7BmrmKO/s200/20160731_155224.jpg" width="150" /></a>So, did I say that I was completely freaked out, thinking it was the fuel injection computer, clogged injectors, or maybe some set of sensors out that I wouldn't be able to diagnose, because 1999 Ducati 900 Supersports don't have and ODB-II port as far as I can tell. Obviously, this is more on the hardware side of things... And not really computer related.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjqShJAKRZjbKM39F6zzWnELKaa94wrbo62HdoGwk8YXkFkuUOc1NoWuWLWN2WD-zjIIzTtPsrWeD1yqnOAD4-OdTD7Xj6gwI1DwIWwRN7dpRNzrMNY3XHZKydJ1HldfuwQ0nb_nXzc_q0/s1600/20160731_181049.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjqShJAKRZjbKM39F6zzWnELKaa94wrbo62HdoGwk8YXkFkuUOc1NoWuWLWN2WD-zjIIzTtPsrWeD1yqnOAD4-OdTD7Xj6gwI1DwIWwRN7dpRNzrMNY3XHZKydJ1HldfuwQ0nb_nXzc_q0/s200/20160731_181049.jpg" width="150" /></a>Well, I let it set, and then took another look. I had just replaced the nut that holds the fuel level sensor (a fuel sender in Ducati speak) in. It had been leaking slowly, and although my wife complained of a gasoline smell, I never really could locate the leak, well until I did, and then well, three nuts later I finally found one that screwed on, sorta.<br />
<br />
First step is to drain the tank. I got it mostly drained with the handy little pump I picked up for about $7.00 at a local Harbor Freight tool store (don't try the tube and mouth method, don't ask me why I know not to do that, just don't). Next I removed the cap. There's four (4) screws that hold it on. The ring actually has six (6) plus one one more near the hinge, but it turns out the twelve, four, and seven o'clock screws are the only ones that actually attach. the other three are just for beauty.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9JOcVe7iiNjF0Aib2VA_MvYgnKprXXlo4nMn0YKyRUv6E2z2SyJSEiSxJlqExlgg_TjOZhqOsRXrWa6caxFTxeVisN8XbdDp7w4aiPjOsa_xVWAV1Iutq37PdYA6px8u1ARPtWGhB6ot2/s1600/20160731_180922.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9JOcVe7iiNjF0Aib2VA_MvYgnKprXXlo4nMn0YKyRUv6E2z2SyJSEiSxJlqExlgg_TjOZhqOsRXrWa6caxFTxeVisN8XbdDp7w4aiPjOsa_xVWAV1Iutq37PdYA6px8u1ARPtWGhB6ot2/s200/20160731_180922.jpg" width="200" /></a>Next, the fuel inlet is secured in place by a bunch of tiny hex (allen) screws. I don't know if you have to take them all the way out but I did, because I pulled and pulled but that stupid thing wouldn't come out. So, since I'm a tool using kind of sentient being, I used the handle of my mallet to give it some extra leverage. It popped right out.<br />
<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTrA1wq7bNyxaFmrQFPB9Ktkt2EhyphenhyphenR3Ouo-n1nog1WcgOh9V26PKt2fbi_KxH6o2c_0NLyosThw9Uf6WtK-y-cVQYVHhP3XHXtcELun3ZwsIJFoTENukG3qFlyqX3B9e6epG7RhNyzrRzG/s1600/20160731_180301.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTrA1wq7bNyxaFmrQFPB9Ktkt2EhyphenhyphenR3Ouo-n1nog1WcgOh9V26PKt2fbi_KxH6o2c_0NLyosThw9Uf6WtK-y-cVQYVHhP3XHXtcELun3ZwsIJFoTENukG3qFlyqX3B9e6epG7RhNyzrRzG/s200/20160731_180301.jpg" width="150" /></a>There are two hoses attached to the fuel inlet. They are attached to pipes that terminate outside the tank, and in a diagram they were labeled over pressure lines. Handily, the left one attaches to the left port and the right one on the right. So no need to label. I fully detached them so I could get my hands inside and dig around. Turns out that was a pretty good thing... (The picture to the right is actually as I was reassembling.)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpTNeNF9P6hOni3xqyyLRwYyuxAUW2xFO89uzIuHmg4voZ5tzOan3a64hSFvFx5VrTuT9FqIfQrswzm3XiVry8qTiHC-UKC_KdveYnm4N9Drbfrsf3mOBmVK2-k_l604frZ_zAe_YuCa8o/s1600/20160731_175938.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpTNeNF9P6hOni3xqyyLRwYyuxAUW2xFO89uzIuHmg4voZ5tzOan3a64hSFvFx5VrTuT9FqIfQrswzm3XiVry8qTiHC-UKC_KdveYnm4N9Drbfrsf3mOBmVK2-k_l604frZ_zAe_YuCa8o/s200/20160731_175938.jpg" width="200" /></a> Once I got the inlet off, I found that the rubber extender had fallen into the tank. So I grabbed that and reinstalled it on the inlet. The o-ring looked like it was breaking down, but after removing it and giving it a closer look it just had some crud that rubbed off.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDDi1b6rUCWYtUywbj7erN0GOpMSeYEMpJiGuKYem1_QsS9kIqawPoSyXlcUCdNpLZTXq1Cc9RocMBPCVJr8G6Dlh3HqAsmBWY6PxonTJyiRKm4hd28p8mIAjajN5ujl8qiMlN1nJgQSzS/s1600/20160731_163717.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDDi1b6rUCWYtUywbj7erN0GOpMSeYEMpJiGuKYem1_QsS9kIqawPoSyXlcUCdNpLZTXq1Cc9RocMBPCVJr8G6Dlh3HqAsmBWY6PxonTJyiRKm4hd28p8mIAjajN5ujl8qiMlN1nJgQSzS/s200/20160731_163717.jpg" width="150" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSlUAmH36RlVUg-GR6TL9BLRuk0-mU66Jr5oTFjNT0LDW-AnoLLrn4ilggJVHb1jgiCJJg0UKhxijYz1UuK5IIYhDdQHsEB1HOe7H6o3E6n0bCdH7uztm0QaY7XUxPda90XDuxjquwdO9A/s1600/20160731_174551.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSlUAmH36RlVUg-GR6TL9BLRuk0-mU66Jr5oTFjNT0LDW-AnoLLrn4ilggJVHb1jgiCJJg0UKhxijYz1UuK5IIYhDdQHsEB1HOe7H6o3E6n0bCdH7uztm0QaY7XUxPda90XDuxjquwdO9A/s200/20160731_174551.jpg" width="150" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-kgYnTNWlM9EExopJp7CTsVHrb6w_gMs8FRT9ZMdE9RwOi_wTD11_T8tJUG2sZQlveGCix5waEJn28bHGLs2ijuWjy3hyphenhyphenJXyoruBLWnHVTm84xrEWlW4JE_N5UQ4C9HfbbR1h5HzPhROa/s1600/20160731_175215.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-kgYnTNWlM9EExopJp7CTsVHrb6w_gMs8FRT9ZMdE9RwOi_wTD11_T8tJUG2sZQlveGCix5waEJn28bHGLs2ijuWjy3hyphenhyphenJXyoruBLWnHVTm84xrEWlW4JE_N5UQ4C9HfbbR1h5HzPhROa/s200/20160731_175215.jpg" width="150" /></a>Inside the tank was a whole other story. The reason I wanted to get in there was because the fuel lines had rotted down to the reinforcing braid. The guy at the parts store said that these should be replaced every two years, and well this bike is 17 years old. Silly me. In the bottom of the tank was all of the rubber bits. The bad part was that when I scooped them up, they turned into a black paste.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_CsoYrSzB3NLXUnd4OVOjCo046Arya3QeJsizXtVMaXTC0cmCon2WTqfVjE8VkwbB5dqoOJIdM6GRebZFw6fVKjqdJWXuwbx4JVrQjJGl4seSlDWGMZKsoInLWaK0Genkz-iDr2YPJzN5/s1600/20160731_174611.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_CsoYrSzB3NLXUnd4OVOjCo046Arya3QeJsizXtVMaXTC0cmCon2WTqfVjE8VkwbB5dqoOJIdM6GRebZFw6fVKjqdJWXuwbx4JVrQjJGl4seSlDWGMZKsoInLWaK0Genkz-iDr2YPJzN5/s200/20160731_174611.jpg" width="150" /></a>The job was then to get all of the gunk out. I ended up taking the fuel pump out too. Turns out that was a good decision. There's no way I'd be able to clamp on that two inch piece of hose between the pump and filter. On the right is a picture of the reassembled pump and filter. Notice how different the new hoses look?<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL9ndK0Jlrj9QUIqWmKqVz5_R7PYeV0FBO2vv_QXrT9JM7jTWfhxeizGA25JlVRBVx64jwUIsIQr52s-4DLNRlv9sBG3OxiteCFFOgMi-_k_EnyXQTWhrNEDE8HQGarn9Tj9KXUONHinga/s1600/20160731_175908.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL9ndK0Jlrj9QUIqWmKqVz5_R7PYeV0FBO2vv_QXrT9JM7jTWfhxeizGA25JlVRBVx64jwUIsIQr52s-4DLNRlv9sBG3OxiteCFFOgMi-_k_EnyXQTWhrNEDE8HQGarn9Tj9KXUONHinga/s200/20160731_175908.jpg" width="150" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrvkc8Ex2s519FBwdsQ1YfTpdnztFoL6ndA9N-qc6DinfOu5Tqwgqs4o0VshXnHDJE4a4nHFfl-sa2e7qrspqODWEVtycp1eL2FcgUSo5o7aqESv_oLrGunrO4w1Ety5QOl_MR3xJ_jXj4/s1600/20160731_175232.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrvkc8Ex2s519FBwdsQ1YfTpdnztFoL6ndA9N-qc6DinfOu5Tqwgqs4o0VshXnHDJE4a4nHFfl-sa2e7qrspqODWEVtycp1eL2FcgUSo5o7aqESv_oLrGunrO4w1Ety5QOl_MR3xJ_jXj4/s200/20160731_175232.jpg" width="150" /></a>I re-used the hose clamps that were there. Ones I've sen before either have a worm screw to tighten them down, or pinch together and use spring action to hold everything together. Not these. Instead of pinching the clamps to release them, they pinch and lock together. Overall they give a tighter lock, but like I said before, I'd never have been able to install them inside the tank.<br />
<br />
They all went back in pretty easy, and it was just a matter of reconnecting the fuel dump lines and replacing the inlet. The picture to the right shows the fuel pump remounted and the fuel filter connected to the line that heads out to the fuel rails.<br />
<br />
I'll give a big a shout-out to Blue over at <a href="http://www.ducatimonsterforum.org/index.php?topic=36513.0" target="_blank">Ducati Moster Forum</a> for good instructions on how to replace the black beauty ring that goes round the outside of the fuel inlet. That method of partially installing the inlet and then fitting the ring really did the trick.<br />
<br />
The picture below shows my 1988 Honda Hurricane (CBR-600F), in the background. It's got it's own fuel problems. One day. For now the Ducati is running again. It's back to starting with one revolution of the motor, which it hadn't done since about 2004 (I bought it in 2001). My guess is that the fuel inlet will be off the tank again sometime in the future.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHEJ1GG-4DStYs4zh3xCcH_KlZpRPBMOLYq7B_NtnprxKTGI-Kz90gK5eTfZ9JHE9yIhyphenhyphenvWbfmUDK76O4fSno3lnrSfzV_p5joNSgDz6K32FdPPP5eeu7FFJH2_HNo8t5Bx0Uj9RHuP2wV/s1600/20160731_182310.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHEJ1GG-4DStYs4zh3xCcH_KlZpRPBMOLYq7B_NtnprxKTGI-Kz90gK5eTfZ9JHE9yIhyphenhyphenvWbfmUDK76O4fSno3lnrSfzV_p5joNSgDz6K32FdPPP5eeu7FFJH2_HNo8t5Bx0Uj9RHuP2wV/s640/20160731_182310.jpg" width="640" /></a></div>
<br />
<div style="text-align: center;">
===</div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ9euL5D2pMXpYNHrVAcnibZliT-cicsVQeP5WfTnCLFS_Hx75nIw02vveCqwfHhkhEB3KrmYqVbTeBrO_GupvwBbJF3Krbvh2tA_jfV307o5Sn7wtTQzzo160U7c8wggWJNoBeKu5VAjK/s1600/20160731_185848.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ9euL5D2pMXpYNHrVAcnibZliT-cicsVQeP5WfTnCLFS_Hx75nIw02vveCqwfHhkhEB3KrmYqVbTeBrO_GupvwBbJF3Krbvh2tA_jfV307o5Sn7wtTQzzo160U7c8wggWJNoBeKu5VAjK/s200/20160731_185848.jpg" width="200" /></a>So it pays to pay attention at the gas pump. I only put enough gas in the tank to cover the fuel pump, then I was off to the gas station. With the rubber guide back in the tank it was hard to see the bottom of the thank when I was filling it, especially from the left side. As I was leaning in to take a look, my left leg got a little close to the exhaust. Well at least it will be a nice scar.<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-58845037387838028552016-06-05T19:05:00.002-07:002016-06-05T19:05:38.479-07:00Just Released, 5 years in the making, SAFMQ 0.8.4Hey, you can get your copy of <a href="https://sourceforge.net/projects/safmq/files/SAFMQ/SAFMQ%200.8.4" target="_blank">SAFMQ version 0.8.4 on SourceForge</a>. I know 5.5 years is too long between releases but, I've been busy...<br />
<br />
Release 0.8.4 comes with these updates:<br />
<ul>
<li>Updated for compatibility with OpenSSL 1.0.2h (most recent)</li>
<li>Windows installer package is built with OpenSSL 1.0.2h</li>
<li>Updates for compatibility with g++ 5.4.8 and 5.3.1</li>
<li>Updated for compatibility with Visual Studio 2010 </li>
<li>Test on:</li>
<ul>
<li>Fedora 23 (g++ 5.3.1)</li>
<li>FreeBSD 10.6 (g++ 5.4.8)</li>
<li>Windows (32bit)</li>
<li>Cygwin (g++ 5.3.1)</li>
</ul>
</ul>
So there you go, a fresh (incremental) release. The most important update is with OpenSSL, and the bug fixes to the TLS code.Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-6422598740797508492016-04-06T16:18:00.000-07:002016-04-06T16:24:46.641-07:00Install a SharePoint Publishing Design Package with PowerShellMicrosoft didn't provide a PowerShell cmdlet to install publishing design packages, and the <a href="https://gallery.technet.microsoft.com/Export-and-Import-0f41b376" target="_blank">one in the design gallery</a> is just kinda overkill. So I took it upon myself to make a simpler version, albeit it did require calling a couple of "internal" methods from the <span style="color: #45818e;"><span style="font-family: Verdana,sans-serif;">Microsoft.SharePoint.Publishing</span></span> <span style="font-size: small;"></span>library. Well, here goes have at it (you'll also see some reflection examples for calling internal constructors and methods).<br />
<br />
Oh, here's an important note. NOTE: MAKE SURE PUBLISHING INFRASTRUCTURE IS ENABLED FIRST. Otherwise it won't turn on, and you won't be able to access the Master page settings page even if you go directly to <span style="color: #45818e;"><span style="font-family: "verdana" , sans-serif;">ChangeSiteMasterPage.aspx</span></span>.<br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:DoNotShowRevisions/>
<w:DoNotPrintRevisions/>
<w:DoNotShowInsertionsAndDeletions/>
<w:DoNotShowPropertyChanges/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->
<br />
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkgreen; font-family: "lucida console"; font-size: 9.0pt;">#########################################################################</span><span style="font-family: "lucida console"; font-size: 9.0pt;"></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkgreen; font-family: "lucida console"; font-size: 9.0pt;">#</span><span style="font-family: "lucida console"; font-size: 9.0pt;"></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkgreen; font-family: "lucida console"; font-size: 9.0pt;">#<span style="mso-spacerun: yes;">
</span>Install-PublishingDesignPackage -Site <site url> -Path <package
path></span><span style="font-family: "lucida console"; font-size: 9.0pt;"></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkgreen; font-family: "lucida console"; font-size: 9.0pt;">#</span><span style="font-family: "lucida console"; font-size: 9.0pt;"></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkgreen; font-family: "lucida console"; font-size: 9.0pt;">#########################################################################</span><span style="font-family: "lucida console"; font-size: 9.0pt;"></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkblue; font-family: "lucida console"; font-size: 9.0pt;">param</span><span style="font-family: "lucida console"; font-size: 9.0pt;">(</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkgrey;">[</span><span style="color: deepskyblue;">Parameter</span>(Mandatory<span style="color: darkgrey;">=</span><span style="color: orangered;">$true</span>)<span style="color: darkgrey;">][</span><span style="color: teal;">string</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$Site</span><span style="color: darkgrey;">,</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkgrey;">[</span><span style="color: deepskyblue;">Parameter</span>(Mandatory<span style="color: darkgrey;">=</span><span style="color: orangered;">$true</span>)<span style="color: darkgrey;">][</span><span style="color: teal;">string</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$Path</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;">)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: orangered; font-family: "lucida console"; font-size: 9.0pt;">$DesignPackage</span><span style="font-family: "lucida console"; font-size: 9.0pt;"> <span style="color: darkgrey;">=</span> <span style="color: darkgrey;">[</span><span style="color: teal;">Microsoft.SharePoint.Publishing.DesignPackage</span><span style="color: darkgrey;">]</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: orangered; font-family: "lucida console"; font-size: 9.0pt;">$DesignPackageInfo</span><span style="font-family: "lucida console"; font-size: 9.0pt;"> <span style="color: darkgrey;">=</span> <span style="color: darkgrey;">[</span><span style="color: teal;">Microsoft.SharePoint.Publishing.DesignPackageInfo</span><span style="color: darkgrey;">]</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: orangered; font-family: "lucida console"; font-size: 9.0pt;">$BindingFlags</span><span style="font-family: "lucida console"; font-size: 9.0pt;"> <span style="color: darkgrey;">=</span> <span style="color: darkgrey;">[</span><span style="color: teal;">System.Reflection.BindingFlags</span><span style="color: darkgrey;">]</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkblue; font-family: "lucida console"; font-size: 9.0pt;">function</span><span style="font-family: "lucida console"; font-size: 9.0pt;"> <span style="color: blueviolet;">_Using</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">param</span> (</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkgrey;">[</span><span style="color: teal;">System.IDisposable</span><span style="color: darkgrey;">]</span>
<span style="color: orangered;">$inputObject</span> <span style="color: darkgrey;">=</span>
$(<span style="color: darkblue;">throw</span> <span style="color: darkred;">`</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: darkred;"> "The
parameter -inputObject is required."</span>)<span style="color: darkgrey;">,</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkgrey;">[</span><span style="color: teal;">ScriptBlock</span><span style="color: darkgrey;">]</span> <span style="color: orangered;">$scriptBlock</span> <span style="color: darkgrey;">=</span>
$(<span style="color: darkblue;">throw</span> <span style="color: darkred;">"The
parameter -scriptBlock is required."</span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">Try</span> {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkgrey;">&</span><span style="color: orangered;">$scriptBlock</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">Finally</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">if</span>
(<span style="color: orangered;">$inputObject</span> <span style="color: darkgrey;">-ne</span>
<span style="color: orangered;">$null</span>) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">if</span>
(<span style="color: orangered;">$inputObject</span><span style="color: darkgrey;">.</span>psbase
<span style="color: darkgrey;">-eq</span> <span style="color: orangered;">$null</span>)
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$inputObject</span><span style="color: darkgrey;">.</span>Dispose()</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">else</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$inputObject</span><span style="color: darkgrey;">.</span>psbase<span style="color: darkgrey;">.</span>Dispose()</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;">}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkblue; font-family: "lucida console"; font-size: 9.0pt;">function</span><span style="font-family: "lucida console"; font-size: 9.0pt;"> <span style="color: blueviolet;">Call-InternalConstructor</span>(<span style="color: darkgrey;">[</span><span style="color: teal;">System.Type</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$Type</span><span style="color: darkgrey;">,</span> <span style="color: darkgrey;">[</span><span style="color: teal;">Object</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$Parms</span>) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$ParmTypes</span>
<span style="color: darkgrey;">=</span> @()</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">foreach</span>(<span style="color: orangered;">$parm</span> <span style="color: darkblue;">in</span> <span style="color: orangered;">$Parms</span>) { <span style="color: orangered;">$ParmTypes</span>
<span style="color: darkgrey;">+=</span> <span style="color: orangered;">$parm</span><span style="color: darkgrey;">.</span>GetType() }</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">return</span> <span style="color: orangered;">$Type</span><span style="color: darkgrey;">.</span>GetConstructor(<span style="color: orangered;">$BindingFlags</span><span style="color: darkgrey;">::</span>NonPublic
<span style="color: darkgrey;">-bor</span> <span style="color: orangered;">$BindingFlags</span><span style="color: darkgrey;">::</span>Instance<span style="color: darkgrey;">,`</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: darkgrey;"> </span> <span style="color: orangered;">$null</span><span style="color: darkgrey;">,</span> <span style="color: orangered;">$ParmTypes</span><span style="color: darkgrey;">,</span> <span style="color: orangered;">$null</span>)<span style="color: darkgrey;">.</span>Invoke(<span style="color: orangered;">$Parms</span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;">}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: darkblue; font-family: "lucida console"; font-size: 9.0pt;">function</span><span style="font-family: "lucida console"; font-size: 9.0pt;"> <span style="color: blueviolet;">Call-InternalStaticMethod</span>(<span style="color: darkgrey;">[</span><span style="color: teal;">System.Type</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$Type</span><span style="color: darkgrey;">,</span> <span style="color: darkgrey;">[</span><span style="color: teal;">string</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$MethodName</span><span style="color: darkgrey;">,</span>
<span style="color: darkgrey;">[</span><span style="color: teal;">Object</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$Parms</span>) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$ParmTypes</span>
<span style="color: darkgrey;">=</span> @()</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">foreach</span>(<span style="color: orangered;">$parm</span> <span style="color: darkblue;">in</span> <span style="color: orangered;">$Parms</span>) { <span style="color: orangered;">$ParmTypes</span>
<span style="color: darkgrey;">+=</span> <span style="color: orangered;">$parm</span><span style="color: darkgrey;">.</span>GetType() }</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">return</span> <span style="color: orangered;">$Type</span><span style="color: darkgrey;">.</span>GetMethod(<span style="color: orangered;">$MethodName</span><span style="color: darkgrey;">,</span>
<span style="color: orangered;">$BindingFlags</span><span style="color: darkgrey;">::</span>NonPublic
<span style="color: darkgrey;">-bor`</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: darkgrey;"> </span><span style="color: orangered;">$BIndingFlags</span><span style="color: darkgrey;">::</span>Static<span style="color: darkgrey;">,</span> <span style="color: orangered;">$null</span><span style="color: darkgrey;">,</span> <span style="color: orangered;">$ParmTypes</span><span style="color: darkgrey;">,</span> <span style="color: orangered;">$null</span>)<span style="color: darkgrey;">.</span>Invoke(<span style="color: orangered;">$null</span><span style="color: darkgrey;">,</span> <span style="color: orangered;">$Parms</span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;">}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: "lucida console"; font-size: 9.0pt;">_using</span><span style="font-family: "lucida console"; font-size: 9.0pt;">(<span style="color: orangered;">$spsite</span>
<span style="color: darkgrey;">=</span> <span style="color: blue;">New-Object</span>
<span style="color: blueviolet;">Microsoft.SharePoint.SPSite</span>(<span style="color: orangered;">$Site</span>)) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">if</span> (<span style="color: orangered;">$spsite</span> <span style="color: darkgrey;">-ne</span> <span style="color: orangered;">$null</span>) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$Path</span>
<span style="color: darkgrey;">=</span> <span style="color: darkgrey;">[</span><span style="color: teal;">System.Io.Path</span><span style="color: darkgrey;">]::</span>Combine((<span style="color: blue;">pwd</span>)<span style="color: darkgrey;">.</span>path<span style="color: darkgrey;">,</span><span style="color: orangered;">$Path</span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$finfo</span>
<span style="color: darkgrey;">=</span> <span style="color: blue;">Dir</span> <span style="color: orangered;">$Path</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$pkg</span>
<span style="color: darkgrey;">=</span> <span style="color: blue;">Get-SPUserSolution</span>
<span style="color: navy;">-Site</span> <span style="color: orangered;">$Site</span>
<span style="color: orangered;">$finfo</span><span style="color: darkgrey;">.</span>Name
<span style="color: navy;">-ErrorAction</span> <span style="color: blueviolet;">SilentlyContinue</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">if</span>
( (<span style="color: orangered;">$pkg</span> <span style="color: darkgrey;">-eq</span>
<span style="color: orangered;">$null</span>) ) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">try</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$pkgInfo</span>
<span style="color: darkgrey;">=</span> <span style="color: blue;">Call-InternalConstructor</span>
<span style="color: orangered;">$DesignPackageInfo</span> (<span style="color: orangered;">$finfo</span><span style="color: darkgrey;">.</span>Name)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">_Using</span>(<span style="color: orangered;">$fileStream</span> <span style="color: darkgrey;">=</span>
<span style="color: blue;">New-Object</span> <span style="color: blueviolet;">System.IO.FileStream</span>(<span style="color: orangered;">$finfo</span><span style="color: darkgrey;">.</span>FullName<span style="color: darkgrey;">,`</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: darkgrey;"> [</span><span style="color: teal;">System.IO.FileMode</span><span style="color: darkgrey;">]::</span>Open<span style="color: darkgrey;">,</span> <span style="color: darkgrey;">[</span><span style="color: teal;">System.IO.FileAccess</span><span style="color: darkgrey;">]::</span>Read)) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">if</span>
(<span style="color: orangered;">$fileStream</span> <span style="color: darkgrey;">-ne</span>
<span style="color: orangered;">$null</span>) {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: darkblue;">try</span> {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">Call-InternalStaticMethod</span> <span style="color: orangered;">$DesignPackage</span>
<span style="color: darkred;">"Install" `</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: darkred;"> </span> (<span style="color: darkgrey;">[</span><span style="color: teal;">Microsoft.SharePoint.SPSite</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$spsite</span><span style="color: darkgrey;">,</span> <span style="color: orangered;">`</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: orangered;"> $pkgInfo</span><span style="color: darkgrey;">,</span> <span style="color: darkgrey;">[</span><span style="color: teal;">System.IO.Stream</span><span style="color: darkgrey;">]</span><span style="color: orangered;">$fileStream</span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: orangered;">$DesignPackage</span><span style="color: darkgrey;">::</span>Apply(<span style="color: orangered;">$spsite</span><span style="color: darkgrey;">,</span><span style="color: orangered;">$pkgInfo</span>)</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">catch</span> <span style="color: darkgrey;">[</span><span style="color: teal;">Exception</span><span style="color: darkgrey;">]</span> {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">Write-host</span> <span style="color: navy;">-ForegroundColor</span>
<span style="color: blueviolet;">Red</span> <span style="color: orangered;">$_</span><span style="color: darkgrey;">.</span>Exception<span style="color: darkgrey;">.</span>ToString()</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">else</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">Write-Host</span> <span style="color: navy;">-ForegroundColor</span> <span style="color: blueviolet;">Red</span> <span style="color: blueviolet;">Unable</span>
<span style="color: blueviolet;">to</span> <span style="color: blueviolet;">open</span>
<span style="color: orangered;">$finfo</span><span style="color: darkgrey;">.</span>FullName</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">catch</span>
<span style="color: darkgrey;">[</span><span style="color: teal;">Exception</span><span style="color: darkgrey;">]</span> {</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">Write-host</span>
<span style="color: navy;">-ForegroundColor</span> <span style="color: blueviolet;">Red</span>
<span style="color: orangered;">$_</span><span style="color: darkgrey;">.</span>Exception<span style="color: darkgrey;">.</span>ToString()</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">else</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">Write-Host</span>
<span style="color: navy;">-ForegroundColor</span> <span style="color: blueviolet;">Red</span>
<span style="color: orangered;">$finfo</span><span style="color: darkgrey;">.</span>Name
`</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="color: blueviolet;"> is</span> <span style="color: blueviolet;">already</span>
<span style="color: blueviolet;">in</span> <span style="color: blueviolet;">the</span>
<span style="color: blueviolet;">solution</span> <span style="color: blueviolet;">gallery</span>
<span style="color: blueviolet;">of</span> <span style="color: orangered;">$Site</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>} <span style="color: darkblue;">else</span>
{</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">Write-Host</span>
<span style="color: navy;">-ForegroundColor</span> <span style="color: blueviolet;">Red</span>
<span style="color: darkred;">"Unable to open site: "</span> <span style="color: orangered;">$Site</span></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: "lucida console"; font-size: 9.0pt;">}
</span></div>
<div class="MsoNormal">
<br /></div>
Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-46241535556231062282015-10-21T10:14:00.001-07:002015-10-21T10:15:40.934-07:00Create and Provision SP2013 Usage and Health ServiceOne of my clients migrated from SharePoint 2007 to SharePoint 2013. We took all of the steps to migrate to 2010 then migrate again to 2013. Things went fine and dandy, but we hit some snags.<br />
<br />
We had a limited hardware budget. One way to reduce costs was to re-use hardware as we migrated. Their SQL Server installation was in great shape, powerful and space to grow as we migrated. The only problem, it housed both production and a staging environment. This meant as we moved forward there could be 3 SQL instances with data at any one given time, and space got a little cramped.<br />
<br />
One of the surprises I had was how much space is taken up by the Usage and Health application. It was undoubtedly the largest database in the instance; larger than any of our content databases. It probably grew so large based on our search configuration and the level of re-arangement we were performing as the site was migrated.<br />
<br />
So, to limit data use, I put a hard size limit on the database. New data was flowing into the tables, but most of the sites were reporting zero activity. You may say that it could have been pretty accurate, but my client was concerned with the lack of data in reports.<br />
<br />
My next step was to decommission the existing Usage & Health service, and create a new one. You can't do that through the user interface, so I did a little digging and came up with PowerShell commands to get everything going.<br />
<br />
First off, allocate the new usage application:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><a href="https://technet.microsoft.com/en-us/library/ff607699.aspx" target="_blank">New-SPUsageApplication</a> -Name "Usage and Health Data Collection" `</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> -DatabaseServer "SQL2013"`</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> -DatabaseName "SP2013_UsageAndHealth"</span><br />
<br />
I knew I had an alias on the server's instance but I couldn't remember it. I looked it up by checking a content database's info in the<span style="background-color: white;"> <span style="color: #999999;"><i>Application Management > Manage Content Databases</i></span> sect</span>ion. I looked it up and it was SQL2013...<br />
<br />
The next step was to provision the proxy, with some pretty stock settings:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">$proxy = <a href="https://technet.microsoft.com/en-us/library/ff607727.aspx" target="_blank">Get-SPServiceApplicationProxy</a> `</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> | where {$_.TypeName -eq "Usage and Health Data Collection Proxy"}<br />$proxy.Provision()</span><br />
<br />
In some other blogs, it says we need to start the service on the individual server, but it's not showing up in my <span style="color: #999999;"><i>Services on Server</i></span> list. I double checked a system that I know is working fine, and it's not listed in the <span style="color: #999999;"><i>Services on Server</i></span> configuration page ether; so I think I'm good to go. I'll update with any changes as we go.Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-4790660226972002672015-08-18T19:05:00.003-07:002015-08-18T19:12:40.344-07:00Blury Images & BlogspotMy sister-in-law and fellow blogger, <a href="http://therichternest.blogspot.com/">Amber Richter</a>, has been running into some of the same issues that I have.<br />
<br />
Take for example the two pictures here of from her latest deco project (see below). They're both the same image, but Google/Blogger have an API that conveniently downsizes pictures, to reduce the time it takes to get them to your phone, tablet, PC, or whatever. Partially it's a hold over from the old days when browsers didn't have good image resizing, but with today's blog readers using phones and tablets, the smaller images make a big difference in download time.<br />
<br />
If you use Blogger's builtin WYSIWYG editor, you probably won't end up with issues like this. But if you use a external editor, or if you're like me and dive straight in to the HTML, you'll probably end up with something like the example below.<br />
<br />
Lets dive in and see just what is happening. Amber took both of these pictures with here digital camera, and the file name of the image is: DSCN0118.jpg<br />
<br />
But these two images have very distinct URLs.<br />
<br />
Version (1), blurry when shown at 640 pixels wide, URL: <br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><span style="color: #674ea7;"><span style="font-size: small;">https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEEmuL-GCea_vVwRyd8OExNyt8vdZzrCvOxL4opCt0OXf3pzpwPWlxnL0XkNKgjg0JyA5ca-dzkgr_OWaMWxbm8eWZSsPCekkLqTne-LKX-Trd-OgsNRjsq7C_ahO1C172-6w8s0Koj6A/<span style="background-color: #fff2cc;">s320</span>/DSCN0118.jpg</span></span></span><br />
<br />
Version (2), nice and sharp at 640 pixels wide, URL<br />
<span style="color: #674ea7;"><span style="font-size: small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEEmuL-GCea_vVwRyd8OExNyt8vdZzrCvOxL4opCt0OXf3pzpwPWlxnL0XkNKgjg0JyA5ca-dzkgr_OWaMWxbm8eWZSsPCekkLqTne-LKX-Trd-OgsNRjsq7C_ahO1C172-6w8s0Koj6A/<span style="background-color: #fff2cc;">s1600</span>/DSCN0118.jpg</span></span></span><br />
<br />
So what the difference? It's that directory just in front of the file name. Version (1) is s320 and Version (2) is s1600. The Blogger API is actually resizing the image on the server, shrinking or expanding the image so that the longest dimension matches the size listed in the path. Version (1) is being shrunk to 320 pixels wide. Version (2) is being shrunk also, as the original was probably much larger, but a 1600 x 1200 image is plenty big for the web.<br />
<br />
How can you fix it? If you're using the Blogger on-line editor, switch to HTML mode and search for your image. It will be in a tag that looks something like:<br />
<br />
<span style="color: #674ea7;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><img src="http://..../s320/DSCN1234.jpg" ... /></span></span><br />
<br />
If you're not used to editing HTML, just jump right in and go for it. Change that "sNNN" directory in the path and up or down the number to get the width you want. Remember the blog canvas is only about 700 pixels wide, so won't need to go much above that. If you wanted to go for the perfect fit, set the "s" directory to the same size as the width you need.<br />
<br />
If you're using an external editor, the process is the same, just look for that image URL and update the size directory to fit your need.<br />
<br />
Hey, give the pictures a click, and you'll see just how they really are different sizes.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEEmuL-GCea_vVwRyd8OExNyt8vdZzrCvOxL4opCt0OXf3pzpwPWlxnL0XkNKgjg0JyA5ca-dzkgr_OWaMWxbm8eWZSsPCekkLqTne-LKX-Trd-OgsNRjsq7C_ahO1C172-6w8s0Koj6A/s320/DSCN0118.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEEmuL-GCea_vVwRyd8OExNyt8vdZzrCvOxL4opCt0OXf3pzpwPWlxnL0XkNKgjg0JyA5ca-dzkgr_OWaMWxbm8eWZSsPCekkLqTne-LKX-Trd-OgsNRjsq7C_ahO1C172-6w8s0Koj6A/s320/DSCN0118.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Version (1) of the image from the s320 directory, the image is 320 pixels wide but expanded to 640.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEEmuL-GCea_vVwRyd8OExNyt8vdZzrCvOxL4opCt0OXf3pzpwPWlxnL0XkNKgjg0JyA5ca-dzkgr_OWaMWxbm8eWZSsPCekkLqTne-LKX-Trd-OgsNRjsq7C_ahO1C172-6w8s0Koj6A/s1600/DSCN0118.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEEmuL-GCea_vVwRyd8OExNyt8vdZzrCvOxL4opCt0OXf3pzpwPWlxnL0XkNKgjg0JyA5ca-dzkgr_OWaMWxbm8eWZSsPCekkLqTne-LKX-Trd-OgsNRjsq7C_ahO1C172-6w8s0Koj6A/s1600/DSCN0118.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Version (2) of the image from the s1600 directory, the image is 1600 pixels wide, and shrunk to 640.</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<br />Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-71672643396152303222015-07-01T10:51:00.000-07:002015-07-01T10:55:30.977-07:00How Literal Interpertation of SharePoint Planning leads to Poor SecurityI love the technical documentation from Microsoft. It's the best technical documentation form any vendor I've ever worked with. I love it, or at least I used to. <br />
<br />
<span style="background-color: #fff2cc;"><RANT></span>Microsoft's documentation for SharePoint's development API is pretty sparse, but since we can de-compile code (did I just say that?), we get the best documentation there is, the code itself. <span style="background-color: #fff2cc;"><ENDRANT></span><br />
<br />
OK, that was my rant, sorry everyone. What I really wanted to cover in this post was a tendency by a lot of my colleagues and clients to read <a href="https://technet.microsoft.com/en-us/library/cc263445.aspx">Plan for administrative and service accounts in SharePoint 2013</a> literally. I'm going to breakdown the Administrative and Service accounts. Jump straight to <a href="#Ugly">The Ugly</a>. <br />
<br />
<br />
<h2>
The Good</h2>
<ul>
<li><b>Server Farm Account</b> -- a.k.a. <i>Farm Account</i>: You must separate this account from the App Pool, otherwise: <span style="background-color: yellow;">DANGER WILL ROBINSON, DANGER!</span> Also, this account really needs to be a member of the local Administrators group on each of the farm's servers, otherwise you won't be able to deploy Web Applications or any Solutions that add code to the GAC.</li>
<li><b>Application Pool Identity</b> -- a.k.a. <i>App Pool</i>: Did you know that if you use the Farm Account as the App Pool account, it's possible to access all of the stored passwords from the Managed Accounts and Secure Store Service?</li>
<li><b>Default Content Access</b> -- a.k.a. <i>Search Crawl Account</i>, also bad idea to be the Farm Account, while this will work, the Search Crawl Account may need access to file shared and other web applications outside of SharePoint.</li>
<li><b>Synchronization Connection</b> -- a.k.a. <i>User Profile Service Account</i>. Since this account needs to have special access in Active Directory, it's best to separate it out. Some people re-use the Farm Account because the FIM components have to be run by that account anyway, but heck, do you really want all your eggs in one basket? Although the App Pool account is the most vulnerable to attacks, the Farm Account is second most, because it hosts Central Admin. Any code injected in 15/TEMPLATES/ADMIN runs as the Farm Account, so should the Farm Account really have access to all of your AD information?</li>
</ul>
<br />
<h2>
The Bad</h2>
There are so many possible service accounts to deploy in SP2013 (and SP2010 for that matter) that it gets a bit dizzying. It's all fine and good to create accounts for each of these, but it's a pain in the but to actually get them all in there, even if you're using <a href="https://autospinstaller.codeplex.com/">AutoSPInstaller</a>.<br />
<br />
The downside to using lots of service accounts, is that each different account must run in a separate memory context (Application Pool for those that only speak IIS). That means you're using 0.5 - 2 GB per service account or application pool whichever count is higher. The fewer accounts you configure, the fewer application pools you're required to run. The fewer application pools you run the less memory you need to run, and the less likely that the W3P instance gets swapped out or restarted. All this leads to higher overall performance.<br />
<br />
OK, so you say that you want a W3P service for each Web Application your farm hosts. Fine, but what do you get? You might be able to service web pages faster (more threads right), but probably not as SQL Server is the bottleneck in a SharePoint system. And if you think that separating App Pools by Web Application means that you can hot-install GAC code, think again. SharePoint only knows how to restart IIS not a single pool. Plus, you may have to restart the SharePoint Timer Service too if you have Feature Receivers.<br />
<br />
<h4>
Accounts that probably should be combined</h4>
So IMHO, all of these accounts should just be the Application Pool account:<br />
<ul>
<li>Access Services</li>
<li>Access Services 2013 </li>
<li>Business Data Connectivity service</li>
<li>Secure Store Service </li>
<li>Usage and Health Data Collection Service</li>
<li>Visio Graphics Service</li>
<li> Word Automation services</li>
<li> Excel Services</li>
<li> Managed Metadata Service</li>
<li> PerformancePoint Service</li>
<li>App Management Service</li>
<li> PowerPoint Conversion Service</li>
<li>Machine Translation service </li>
<li>Work Management</li>
<li>Distributed Cache (OK, so this actually needs access by the Farm and App Pool, so, it's weird). </li>
</ul>
All of these accounts must be the Farm Account by definition, so why are they mentioned by Microsoft (I don't know...).<br />
<ul>
<li> Security Token Service</li>
<li> Application Discovery and Load Balancer Service</li>
</ul>
<br />
<br />
<h2>
<a name="Ugly" style="color: black; text-decoration: none;">The Ugly</a></h2>
Here's my gripe. Almost everyone I speak to, who hasn't had any formal Information Assurance (read Computer Security) training reads the notes about the <b>Setup User Account</b>, and thinks this should be a single, <i>shared account</i>. Yep you read that right, <span style="background-color: #fff2cc;">shared account</span>! The first rule of Information Assurance is <span style="background-color: #fff2cc;">NO SHARED ACCOUNTS</span>! The minute you have an administrator who changes job positions or otherwise leaves the organization, you're screwed.<br />
<br />
I quote from Microsoft's "<a href="https://technet.microsoft.com/en-us/library/cc263445.aspx">Plan for Administrative and...</a>" <br />
<br />
<br />
<table border="1" cellpadding="5" cellspacing="0" style="width: 100%px;">
<tbody>
<tr>
<td style="border:1px solid black; vertical-align:top; padding:3px">Setup user account</td>
<td style="border:1px solid black; padding:3px">The user account that is used to run:<br />
<br />
If you run Windows PowerShell cmdlets that affect a database, this account must be a member of the<b> db_owner</b> fixed database role for the database.<br />
<ul>
<li>Setup on each server computer </li>
<li>SharePoint Products Configuration Wizard
The </li>
<li>Psconfig command-line tool </li>
<li>The Stsadm command-line tool</li>
</ul>
</td>
</tr>
</tbody></table>
<br />
Microsoft doesn't mention it, but this account is the initial Farm Administrator as well.<br />
<br />
What's the solution? Here's the best way to go about this:<br />
<ol>
<li>Create an AD Group called <i>SP Farm Admins</i> (or what ever makes sense to you)</li>
<li>Grant DBO to <i>SP Farm Admins</i> back on the SQL server before you even think of installing the SharePoint binaries.</li>
<li>Add <i>SP Farm Admins</i> to the Administrators group of each of the farm servers.</li>
<li>For each of the intended administrators from your organization, add them to the <i>SP Farm Admins</i> group.</li>
<li>Now, I'm assuming that you're one of the admins, log-in using your account and install SharePoint normally.</li>
<li>Use the PowerShell commandlet <span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">Add-SPShellAdmin</span></span> to add the SP Farm Admins as a shell-level administrator.</li>
<li>Add <i>SP Farm Admin</i> to the Farm Administrator's group in Central Admin. </li>
<li>You could think about adding <i>SP Farm Admin</i> to one of those weirdo groups that SharePoint supposedly needs, but I've never seen it actually required.</li>
</ol>
Now you're set. When you're ready to pull a Milton (<a href="http://www.imdb.com/title/tt0151804/">Office Space</a>, keep up people) and burn some bridges, all they have to do is disable your account, and anyone else who's a member of SP Farm Admin can take over and make sure each of those $0.01 transactions goes to that account in the Cayman Islands. Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-9090270503822179822015-05-07T09:54:00.002-07:002015-05-07T09:58:39.063-07:00Analytic & Sharepoint : Pros and ConsI've had the pleasure (or torture) of integrating four enterprise class analytic packages with SharePoint. I'm putting together this post to list out the pros and cons that I've experienced with each tool. I know it's not an exhaustive list, but I hope you'll find it useful if you're exploring analytics in SharePoint. <br />
<br />
All of these tools use external tools to develop dashboards and reports. Also, they each have the ability to produce many different types of charts and grid reports. All are interactive in one aspect or another, and are web-enabled (of course).<br />
<br />
<br />
<h2>
<span style="font-size: large;">SQL Server Reporting Services (SSRS)</span></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ2KsVWrGh1mwwDP-QESSe7Kkn_IDUhLu8w-dpELR7B1wTqtBWuoqAy6Qmwe0PNJufAiEr9-Wv0c2l4vJi1frpS4Bg2HU2n6h5sYTIFotiSbKlf9xfC5ApwuD6O24Q0Wwh72RfjdId8RGF/s1600/ssrs.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ2KsVWrGh1mwwDP-QESSe7Kkn_IDUhLu8w-dpELR7B1wTqtBWuoqAy6Qmwe0PNJufAiEr9-Wv0c2l4vJi1frpS4Bg2HU2n6h5sYTIFotiSbKlf9xfC5ApwuD6O24Q0Wwh72RfjdId8RGF/s320/ssrs.jpg" width="320" /></a></div>
Licensing:<br />
<ul>
<li>Included with SQL Server</li>
</ul>
Pros:<br />
<ul>
<li>Reports can be developed with Visual Studio or Report Builder (Free Download)</li>
<li>Works equally well with relational or dimensional data sources</li>
<li>Exports reports to PDF, Excel, and many other platforms</li>
<li>Produces "pixel perfect" reports for viewing online or printing</li>
<li>Includes geospatial analytical charting</li>
<li>Uses standard HTML capabilities to render reports on many browser platforms </li>
<li>Works well with "touch" devices (tables, phones)</li>
<li>Most flexible analytic tool listed </li>
<li>Data can be "blended" from multiple sources</li>
<li>Data may be loaded from any ADO.Net data source (SQL Server, Oracle, Excel, Access, etc.) </li>
</ul>
Cons:<br />
<ul>
<li>Requires the SSRS server to produce reports for users</li>
<li>Does not fully support "touch" interfaces for mouse-hover tool tips</li>
<li>Developing reports requires thorough knowledge of the data sources</li>
<li>Development user interface is geared toward experienced developers </li>
</ul>
<h2>
<span style="font-size: large;">Performance Point Services (PPS)</span></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicfFekxjv07utvSvOyv-kCT7obIiOE5Chg9OjhxBmWOCRI9Cj0JqPsbnICysBMiUcjXUTpzA9xi3zfDfCwgw8ptUoUPJI_DJEb9zG10jaBqPQ53zaXlDytgxwAulpWsDxoVNRZEOuengrP/s1600/pps.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicfFekxjv07utvSvOyv-kCT7obIiOE5Chg9OjhxBmWOCRI9Cj0JqPsbnICysBMiUcjXUTpzA9xi3zfDfCwgw8ptUoUPJI_DJEb9zG10jaBqPQ53zaXlDytgxwAulpWsDxoVNRZEOuengrP/s320/pps.jpg" width="320" /></a></div>
Licensing:<br />
<ul>
<li>Included with SharePoint Enterprise </li>
</ul>
<br />
Pros:<br />
<ul>
<li>Automatically detects the structure of the multidimensional data, allowing users to explore data via drill through. </li>
<li>Included in the SharePoint 2013 software distribution, no additional installation media required</li>
<li>When you drill-through items, only the affected components are refreshed, other KPIs and worksheets remain unaffected. </li>
<li>PPS dashboards are true dashboards, which consolidate wide data that can either be tied together or desperate. In this sense it is the only "true" dashboard tool presented here.</li>
</ul>
<br />
Cons:<br />
<ul>
<li>Does not include geospatial analytical charting, but can be augmented with SSRS</li>
<li>Requires SQL Server Analysis Services dimensional data to operate</li>
<li>Requires two-button mouse support for full capabilities (drill-through and mouse hovers)</li>
<li>Dashboard development must be conducted on a system that is on the same domain as the SharePoint server.</li>
<li>Development user interface is geared toward experienced developers </li>
</ul>
<h2>
<span style="font-size: large;">Power View (a.k.a. Power BI)</span></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii6T61tClA2gusWbhmkM8AQUFL2UqXsCV6QM_X1kCkYBXaQ_R3M7B5LfOsSFbY0attgmU5gzjQZIaO0EO0UFR3wu8DCI0kvHVM1dHehHKDnb0Uq2TAOc-wn4jx9VA7ELjavrA7TCtRxdiO/s1600/powerview.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii6T61tClA2gusWbhmkM8AQUFL2UqXsCV6QM_X1kCkYBXaQ_R3M7B5LfOsSFbY0attgmU5gzjQZIaO0EO0UFR3wu8DCI0kvHVM1dHehHKDnb0Uq2TAOc-wn4jx9VA7ELjavrA7TCtRxdiO/s320/powerview.jpg" width="320" /></a></div>
Licensing:<br />
<ul>
<li>Included with SharePoint Enterprise </li>
</ul>
Pros:<br />
<ul>
<li>Microsoft Excel or web-based tools are used to author dashboards</li>
</ul>
<ul>
<li>Supported in both Office 365 and on-premises SharePoint 2010 and 2013</li>
<li>Includes geospatial analytical charting</li>
<li>Utilizes HTML5 for cross browser and platform support</li>
<li>Works well with "touch" devices (tables, phones)</li>
<li>Data can be embedded in spreadsheets and automatically hosted by SSAS.</li>
</ul>
Cons:<br />
<ul>
<li>Requires a Multidimensional data source or Tabular data source for data</li>
<li>Not fully "touch" enabled, popup tool tips require mouse hover</li>
<li>Although some editing on PowerView dashboards can be done on-line, the best experience comes using Excel 2013. </li>
</ul>
<h2>
<span style="font-size: large;">Tableau</span></h2>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxFMan8bKTD7pil4bm95eQ-0E8yS0sO-aiNNBqZ7fu67CxSE5dqyrB0qYMc8l4yO8ki7Sb6MTu0Nbui9konOzW0HvniW5UEgK-p8i062A4Llh6fCxKmuAPyieH1NkFZCOiC_766mWZBvcP/s1600/tableau.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxFMan8bKTD7pil4bm95eQ-0E8yS0sO-aiNNBqZ7fu67CxSE5dqyrB0qYMc8l4yO8ki7Sb6MTu0Nbui9konOzW0HvniW5UEgK-p8i062A4Llh6fCxKmuAPyieH1NkFZCOiC_766mWZBvcP/s320/tableau.jpg" width="320" /></a>Licensing:<br />
<ul>
<li>Per core or per user licensing (<a href="http://onlinehelp.tableau.com/v6.1/server/licensing.htm">ref</a>)</li>
<li>Tableau Desktop licensed per user for development activities</li>
<li>Tableau Server or Tableau Online (cloud offering) for publishing, and separately licensed. </li>
<li>A <a href="https://www.interworks.com/blogs/bfair/2014/08/26/tableau-online-vs-tableau-server-5-things-consider">breakdown of costs</a> has put together by Brad Fair at Interworks.</li>
</ul>
Pros:<br />
<ul>
<li>Beautiful worksheets and dashboards out of the box</li>
<li>Developing worksheets and dashboards is a drag & drop activity.</li>
<li>Data can be "blended" from multiple sources</li>
<li>Tableau "packaged dashboards" (.twbx files) are self-contained, with some or all data embedded.</li>
<li>"twbx" files can be distributed to users who can view them using the free Tableau Viewer. </li>
<li>Works best with single "flat" data sources or with dimensional data such as SQL Server Analysis Services (SSAS)</li>
<li>Supports geospatial analysis and charting (i.e. plotting points on a map)</li>
<li>Software assurance (a.k.a. free upgrades) are included with maintenance costs </li>
</ul>
Cons:<br />
<ul>
<li>Relatively expensive, if you already have an investment in SQL Server or
some other BI suite with required yearly maintenance costs (see <a href="https://www.interworks.com/blogs/bfair/2014/08/26/tableau-online-vs-tableau-server-5-things-consider">breakdown of costs</a>)</li>
<li>Does not directly integrate into SharePoint, dashboards are shown via Page Viewer IFRAME HTML elements. </li>
<li>Not fully "touch" enabled, some features such as tool-tops require mouse-hover to show.</li>
<li>Tuning queries is difficult, since Tableau was designed for the embedded data model first</li>
<li>Tableau Online requires that reports be 100% "twbx" embedded data or have access to internet enabled data sources</li>
<li>When using dimensional data, textual reports (non numeric) are difficult, and the dimensional model must be tuned to support them, through "existence" facts.</li>
</ul>
<ul>
</ul>
Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-70170158996787373082015-02-26T09:05:00.000-08:002015-02-26T09:05:26.887-08:00Learning Management Systems for SharePoint<p>A few of my clients have inquired about LMS systems for SharePoint. What I found is that most of them focus on on-premises deployments, mostly because they've been around since the WSS3.0/MOSS days. It also seems that they have their own databases and custom web parts to work with content. But over all they seem to be competent and fairly feature compatible with Moodle.</p>
<p>So this is list is by no means exhaustive, but I think it gives a pretty good jumping off comparison between Moodle, SharePoint LMS, and ShareKnowledge (the latter two being SharePoint integrated LMS systems).<p>
<br/>
<style type="text/css">
td
{border-style: none;
border-color: inherit;
border-width: medium;
padding-top:1px;
padding-right:1px;
padding-left:1px;
color:black;
font-size:11.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Calibri, sans-serif;
text-align:general;
vertical-align:bottom;
white-space:nowrap;
}
.style1 {
height: 18.0pt;
width: 255pt;
color: #44546A;
font-size: 13.0pt;
font-weight: 700;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: general;
vertical-align: bottom;
white-space: nowrap;
border-left-style: none;
border-left-color: inherit;
border-left-width: medium;
border-right-style: none;
border-right-color: inherit;
border-right-width: medium;
border-top-style: none;
border-top-color: inherit;
border-top-width: medium;
border-bottom: 1.5pt solid #ACCCEA;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
}
.style2 {
width: 102pt;
color: #44546A;
font-size: 13.0pt;
font-weight: 700;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: center;
vertical-align: bottom;
white-space: nowrap;
border-left-style: none;
border-left-color: inherit;
border-left-width: medium;
border-right-style: none;
border-right-color: inherit;
border-right-width: medium;
border-top-style: none;
border-top-color: inherit;
border-top-width: medium;
border-bottom: 1.5pt solid #ACCCEA;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
}
.style3 {
width: 93pt;
color: #44546A;
font-size: 13.0pt;
font-weight: 700;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: center;
vertical-align: bottom;
white-space: nowrap;
border-left-style: none;
border-left-color: inherit;
border-left-width: medium;
border-right-style: none;
border-right-color: inherit;
border-right-width: medium;
border-top-style: none;
border-top-color: inherit;
border-top-width: medium;
border-bottom: 1.5pt solid #ACCCEA;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
}
.style4 {
width: 128pt;
color: #44546A;
font-size: 13.0pt;
font-weight: 700;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: center;
vertical-align: bottom;
white-space: nowrap;
border-left-style: none;
border-left-color: inherit;
border-left-width: medium;
border-right-style: none;
border-right-color: inherit;
border-right-width: medium;
border-top-style: none;
border-top-color: inherit;
border-top-width: medium;
border-bottom: 1.5pt solid #ACCCEA;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
}
.style5 {
height: 15.75pt;
color: #9C6500;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: general;
vertical-align: bottom;
white-space: nowrap;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
background: #FFEB9C;
}
.style6 {
color: #9C6500;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: center;
vertical-align: bottom;
white-space: nowrap;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
background: #FFEB9C;
}
.style7 {
height: 30.75pt;
width: 578pt;
color: black;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: general;
vertical-align: bottom;
white-space: normal;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
}
.style8 {
height: 15.0pt;
color: #9C6500;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: general;
vertical-align: bottom;
white-space: nowrap;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
background: #FFEB9C;
}
.style9 {
height: 15.0pt;
color: black;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: left;
vertical-align: bottom;
white-space: nowrap;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 9px;
padding-right: 1px;
padding-top: 1px;
}
.style10 {
color: black;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: center;
vertical-align: bottom;
white-space: nowrap;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
}
.style11 {
height: 15.0pt;
color: #9C6500;
font-size: 11.0pt;
font-weight: 400;
font-style: normal;
text-decoration: none;
font-family: Calibri, sans-serif;
text-align: left;
vertical-align: bottom;
white-space: nowrap;
border-style: none;
border-color: inherit;
border-width: medium;
padding-left: 1px;
padding-right: 1px;
padding-top: 1px;
background: #FFEB9C;
}
</style>
<body>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 771px;">
<colgroup>
<col style="mso-width-alt: 12434; mso-width-source: userset; width: 255pt;" width="340"></col>
<col style="mso-width-alt: 4973; mso-width-source: userset; width: 102pt;" width="136"></col>
<col style="mso-width-alt: 4534; mso-width-source: userset; width: 93pt;" width="124"></col>
<col style="mso-width-alt: 6253; mso-width-source: userset; width: 128pt;" width="171"></col>
</colgroup>
<tr height="24" style="height: 18.0pt;">
<td class="style1" height="24" width="340">
Feature</td>
<td class="style2" width="136">
Moodle</td>
<td class="style3" width="124">
SharePoint LMS</td>
<td class="style4" width="171">
ShareKnowledge LMS</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style8" height="20">
Enrollment</td>
<td class="style6">
</td>
<td class="style6">
</td>
<td class="style6">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Supervisor Assigned Course</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Elecctive Courses</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Cohort Enrollment (Group Enrollment)</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Guest Access</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes****</td>
<td class="style10">
Yes****</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Course Tracks</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Category Enrollment (Enroll in courses by category)</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
External Database</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Flat Files</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
IMS Enterprise</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
LDAP Enrollment</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Mnet - Linked Moodle Sites</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
PayPal</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style11" height="20">
User Interface</td>
<td class="style6">
</td>
<td class="style6">
</td>
<td class="style6">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Responsive Design</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes***</td>
<td class="style10">
Yes***</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Personalised Dashboards</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Collaborative Tools</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Calendar</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Drag & Drop Files</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Web based Text Editor</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Notifications</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Progress tracking<span style="mso-spacerun: yes;"> </span></td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Customizable Site Design</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Multilingual Capabilities</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Bulk Corse Creation</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes*</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Social Tagging</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Integrated Access Controls</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style11" height="20">
Course Capabilities</td>
<td class="style6">
</td>
<td class="style6">
</td>
<td class="style6">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Platform based Course & Quiz</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Randomized Questions</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Time Limits</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
SCORM Integration</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
AICC Integration</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
LTI External Web Site Integration</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Instructor Lead Course</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Self-paced Course</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Blended Instructor/Self-paced</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Multi Media Integration</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Peer and Self Assessment</td>
<td class="style10">
Yes</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Gradebook</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Scaled Grading</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Course Privacy</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Version Control</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Course Certificates</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style11" height="20">
Reporting</td>
<td class="style6">
</td>
<td class="style6">
</td>
<td class="style6">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Built in Reports</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Integrated Report Builder</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
External Integration</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes**</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style11" height="20">
Integration</td>
<td class="style6">
</td>
<td class="style6">
</td>
<td class="style6">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
AD Synchronization</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
HRIS Sintegration</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
Outlook Claendar & Notifications</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
WebEx, Lync, GoToWebinar, AdobyConnect</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
Yes</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td class="style9" height="20">
</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td height="20" style="height: 15.0pt;">
</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td colspan="2" height="20" style="height: 15.0pt; mso-ignore: colspan;">
* ShareKnowledge has a bulk question load capabilitiy as well</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td colspan="2" height="20" style="height: 15.0pt; mso-ignore: colspan;">
** Via SQL Server Reporting Services or other BI Reporting tools</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td colspan="2" height="20" style="height: 15.0pt; mso-ignore: colspan;">
*** Responsive Design must be built into the SharePoint installation</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
<tr height="20" style="height: 15.0pt;">
<td height="20" style="height: 15.0pt;">
**** Guest Users must be authenticated</td>
<td class="style10">
</td>
<td class="style10">
</td>
<td class="style10">
</td>
</tr>
</table>
</body>Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-58111745045330329942015-02-24T18:27:00.001-08:002015-02-24T18:27:39.218-08:00Pitfalls of Site Collection ConsolidationSo, you're considering consolidating Site Collections in SharePoint. I suspect that some of your reasons are:<br />
<ol>
<li>I feel like I have too many site collections.</li>
<li>It feels like it's difficult to manage the security of all of my site collections.</li>
<li>Publishing based navigation doesn't cross the site collection boundary.</li>
<li>We're really only hosting a single "site" in this web application anyway.</li>
</ol>
What do you loose when you consolidate Site Collections?<br />
<ul>
<li>Maximal, you can only have one Content Database per Site Collection.</li>
<ul>
<li>More content databases allow for different SQL Server based backup schedules based on the site collection's use.</li>
<li>Content Databases will be at their smallest (individually) when there's only one Site Collection in each database.</li>
<li>Content Databases can be distributed across multiple SQL Server instances, distributing the SQL workload across a SQL grid.</li>
</ul>
<li>Power Shell & Central Admin based backups all you to backup individual Site Collections.</li>
<ul>
<li>If you have one big site collection, your backup is going to be one big file.</li>
</ul>
</ul>
<br />
What do you gain by consolidating Site Collections?<br />
<ul>
<li>Security will be just as difficult.</li>
<ul>
<li>If you users are installing no-code solutions (i.e. site templates), they'll need to be site collection admins. This can get complicated quickly if users become an admin of the entire web app.</li>
<li>You'll still need to audit the entire hierarchy's ACLs to ensure you're protecting information appropriately.</li>
</ul>
<li>Publishing based navigation can be used to navigate everything in your site.</li>
<ul>
<li>Granted that your web-sites don't get deeper than your maximum menu depth. That's typically 2-3 levels based on what you've munged in stock Master Pages.</li>
<li>With 3rd party solutions for SP2010 and Managed Navigation for SP2013, the problem becomes how important is top-menu security trimming.</li>
</ul>
</ul>
<br />
What are some gotcha's if you decide to consolidate?<br />
<ul>
<li>Depending on the tool you use you need to match Site Collection Features in the Source and Target.</li>
<ul>
<li>Many Collection level features install content types and list templates, if these aren't in the target you're going to run into trouble.</li>
<li>In SP2013 if your going from a Publishing Site to another site, <span style="font-size: x-small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Export-SPWeb</span></span> and <span style="font-size: x-small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Import-SPWeb</span></span> won't let you pass unless Publishing Infrastructure is turned on.</li>
</ul>
<li>SP2013 Workflows: They may not enable after merging site collections. Scenario:</li>
<ul>
<li>Source site collection has some SP2010 workflow remnants, and aren't necessarily in use.</li>
<li>Destination site didn't have Workflows enabled before the merge.</li>
<li>After the merge the Workflow feature won't enable because some of the content types are already present, and marked as non-replacable.</li>
<li>It's really a bug in the installer that it doesn't recognize that these are the same, but it sill won't go.</li>
<li>Solution: Enable Workflows prior to merging, or you're going to have to re-merge with a site collection where it is enabled, or workflows will be a no-go.</li>
</ul>
</ul>
<br />
<br />
Short story, Site Collection consolidation is something that requires more than a few moments of thought. Make sure you're doing it for the right reasons, take precautionary steps, and you'll meet with success.Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-28350311856907982572015-02-16T11:50:00.003-08:002015-02-16T11:50:55.298-08:00Site Collection ConsolidationSite Collection consolidation is an interesting topic, and in my opinion one that bears some significant consideration before proceeding. Why this article? I recently worked with a client who wanted to consolidate from 50+ Site Collections to ~3. The reason, the number of site collections seemed unmanageable at that point. There was a only a single Content Database as well. So since then I've been putting more and more thought in to the issue. Here's some of the talking points:<br />
<br />
Size:<br />
<ul>
<li>Microsoft recommends limiting content databases to <a href="https://technet.microsoft.com/en-us/library/cc262787.aspx">200 GB</a>.</li>
<li>Each site collection may reside in a single content database</li>
<ul>
<li>Thus recommend maximum size for a site collection is also 200 GB. </li>
</ul>
</ul>
Security: <br />
<ul>
<li>Site Collections represent a monolithic security context, i.e. they do not inherit permissions from other objects.</li>
<ul>
<li>One object may be that a Site Collection inherits the <b>ability </b>to provide <i>anonymous access</i> from the Web Application that surrounds it.</li>
<li>Site Collections inherit the authentication mechanism(s) defined by the Web App.</li>
<li>Neither of these are permissions, but rather mechanical 'illities that are granted to the Site Collection by it's parent Web App.</li>
</ul>
</ul>
Content and Navigation:<br />
<ul>
<li>With Publishing Infrastructure (SharePoint Enterprise), navigation can be auto-generated based on the Site-Subsite relationships <img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /><img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /><img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /></li>
<ul>
</ul>
<li>Automatic security trimming based user access <img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /><img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /><img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" />
</li>
<ul>
</ul>
<li>Publishing based navigation doesn't cross the Site Collection boundary</li>
<ul>
<li>I'm not sure if this is good or bad. I'm usually building single tenant intranet sites, so this isn't a plus, but recently I've had a chance to work with a client who provides SharePoint sites to multiple tenants, and this feature is a plus.</li>
</ul>
<li>SharePoint 2013 brought about pinned Managed Metadata for navigation. <img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /><img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/f4/StarIconBronze.png" height="15" width="16" /></li>
<ul>
<li>Each site collection requires a copy of the pinned data, which can clutter the metadata tree.</li>
<li>Security Trimming doesn't occur here</li>
</ul>
</ul>
<ul>
<li>Lists that refer to other lists only occur with in a single site collection.</li>
<ul>
<li>Again more of a problem for a single tenant with lots of site collections, a requirement for one collection per tenant.</li>
</ul>
<li>Controls that pull resources like XSLT from inside the SharePoint Web structure can't access content from other Site Collections.</li>
<ul>
<li>You'll need to duplicate those resources across collections.</li>
</ul>
<li>Master Pages must be installed in each site collection.</li>
<ul>
<li>Pages can't reference a master page from another collection.</li>
</ul>
</ul>
<br />
So next post, more on Issues with Consolidating Site Collections. <br />
<ul>
</ul>
Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-62652964288161791712014-10-23T10:19:00.004-07:002014-10-23T10:20:06.092-07:00Famous OmahansOK, so not really a technical post, but being from Omaha, I just hit me that I should catalog some the famous among us. (Listed by birth date)<br />
<br />
<b>Past</b>:<br />
<a href="http://en.wikipedia.org/wiki/Fred_Astaire">Fred Astaire</a> - b. 5/10/1899 d. 6/22/1987 -- Actor, Dancer, Choreographer, Singer, Musician <br />
<a href="http://en.wikipedia.org/wiki/Henry_Fonda">Henry Fonda</a> - b. 5/19/1905 d. 8/12/1982 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Gerald_Ford">Gerald R. Ford</a> - b. 7/14/1913 d. 12/26/2006 -- President of the United States <br />
<a href="http://en.wikipedia.org/wiki/Marlon_Brando">Marlon Brando</a> - b. 4/3/1925 d. 7/1/2004 -- Actor<br />
<a href="http://www.forbes.com/profile/warren-buffett/">Malcolm X</a> - b. 5/19/1925 d. 2/21/1965 -- Muslim Minister & Activist<br />
<br />
<b>Living</b>:<br />
<a href="http://en.wikipedia.org/wiki/Warren_Buffett">Warren Buffet</a> - b. 8/30/1930 -- 3<sup>rd</sup> richest man in the world (<a href="http://www.forbes.com/profile/warren-buffett/">Forbes Profile</a>)<br />
<a href="http://www.imdb.com/name/nm0000560/">Nick Nolte</a> - b. 2/8/1941 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Joe_Ricketts">Joe Ricketts</a> - b. 7/16/1941 -- Owner Chicago Cubs, CEO of TD Ameritrade (fmr.) <br />
<a href="http://en.wikipedia.org/wiki/Gale_Sayers">Gale Sayers</a> - b. 5/30/1943 -- NFL Running back (raised in Omaha)<br />
<a href="http://en.wikipedia.org/wiki/John_Beasley_%28actor%29">John Beasley</a> - b. 6/26/1943 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Johnny_Rodgers">Johny Rogers</a> - b. 7/5/1951 -- Heisman Trophy Winner<br />
<a href="http://en.wikipedia.org/wiki/Swoosie_Kurtz">Swoosie Kurtz</a> - b.9/6/1955 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Paula_Zahn">Paula Zahn</a> - b. 2/24/1956 -- Journalist & Newscaster<br />
<a href="http://en.wikipedia.org/wiki/Wade_Boggs">Wade Boggs</a> - b. 6/15/1958 -- Professional Baseball Third Baseman<br />
<a href="http://www.imdb.com/name/nm0175415/">James M. Connor</a> - b. 6/16/1960 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Alexander_Payne">Alexander Payne</a> - b. 2/10/1961 -- Director, Screenwriter & Producer<br />
<a href="http://en.wikipedia.org/wiki/Nicholas_Sparks">Nicholas Sparks</a> - b. 12/31/1965 -- Novelist, Screenwriter, & Producer<br />
<a href="http://en.wikipedia.org/wiki/Calvin_Jones_%28running_back%29">Calvin Jones</a> - b. 11/27/1970 -- Raiders, Packers & Nebraska Cornhusker Runningback<br />
<a href="http://en.wikipedia.org/wiki/Houston_Alexander">Huston Alexander</a> - b. 3/22/1972 -- Mixed Martial Artist<br />
<a href="http://www.imdb.com/name/nm0005517">Gabriell Union</a> - b. 10/29/1972 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Ahman_Green">Ahman Green</a> - b. 2/16/1977 -- Seahawks, Packers & Nebraska Cornhusker Runningback<br />
<a href="http://www.imdb.com/name/nm1034965/">Brian Greenberg</a> -b. 5/24/1978 -- Actor<br />
<a href="http://en.wikipedia.org/wiki/Eric_Crouch">Eric Crouch</a> - b. 9/16/1978 -- Heisman Trophy Winner & Sports Analyst<br />
<a href="http://en.wikipedia.org/wiki/Chris_Klein_%28actor%29">Chris Klein</a> - b. 3/14/1979 -- Actor (Graduated form Millard West High School) <br />
<a href="http://en.wikipedia.org/wiki/Andy_Roddick">Andy Roddick</a> - b. 8/30/1982 -- Former World #1 Professional Tennis Player<br />
<a href="http://en.wikipedia.org/wiki/311_%28band%29">311</a> - b. 1988 -- OK, technically a band and not a person<br />
<br />
<br />
<br />Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0tag:blogger.com,1999:blog-1718232897544424237.post-88460916217603367482014-08-29T13:42:00.001-07:002014-08-29T13:48:26.273-07:00SQL Server Access Control & Synonyms<span style="font-size: small;">OK. So, say you have a SQL Server database and you want to provide varying levels access to different users groups. This database was created for one application, and now you are being asked to provide access to a report development team. How do you go about doing that in some rational way, say the way an admin assigns access to files on a file server. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Well, that would be great, only there aren't any folders in SQL Server. BUT, since SQL Server 2005 we've been given real Schema objects and Synonyms to boot.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">SO, how does that help us? Lets take a look, say you built your database and like any rational developer you built everything in DBO. Here's a list of your tables:</span><br />
<span style="font-size: small;"><br /></span>
<span style="color: #134f5c; font-size: small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">dbo.Customers</span></span><br />
<span style="color: #134f5c; font-size: small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">dbo.PurchaseOrders</span></span><br />
<span style="color: #134f5c; font-size: small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">dbo.Invoices</span></span><br />
<span style="color: #134f5c; font-size: small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">dbo.UserLogins</span></span><br />
<span style="color: #134f5c; font-size: small;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">dbo.ApplicationSettings</span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Obviously you don't want the report developers having access to the <span style="color: #134f5c;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">UserLogins</span> </span>and <span style="color: #134f5c;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">ApplicationSettings</span></span>. One, they just don't need it, and two, there's sensitive stuff in there.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Our approach:</span><br />
<ul>
<li><span style="font-size: small;">Use an active directory group (<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">My_Domain\Report Writers</span>) to control access.</span></li>
<li><span style="font-size: small;">Create a Schema for the report writers to access</span></li>
<li><span style="font-size: small;">Assign access to the new schema and not the old one.</span></li>
</ul>
<span style="font-size: small;"> Step 1) Create the new schema:</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">CREATE SCHEMA</span> reports</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Step 2) Add some table synonyms to the schema:</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">CREATE SYNONYM</span> reports.PurchaseOrders <span style="color: blue;">FOR </span>dbo.PurchaseOrders</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">CREATE SYNONYM</span> reports.Invoices <span style="color: blue;">FOR </span>dbo.Invoices</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">CREATE SYNONYM</span> reports.Customers <span style="color: blue;">FOR </span>dbo.Customers</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"> Step 3) Map the AD group to your database </span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">CREATE LOGIN </span>[MY_DOMAIN\Report Writers] <span style="color: blue;">FROM WINDOWS WITH DEFAULT_DATABASE</span>=[master]</span><br />
<span style="color: blue; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">GO</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">CREATE USER</span> [MY_DOMAIN\Report Writers] <span style="color: blue;">FOR LOGIN</span> [</span><span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">MY_DOMAIN\Report Writers</span>]</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><i>(This is the same as adding a Login at the server level, and mapping to the public role on a database catalog).</i></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Step 4) Give the report writers access to the <span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">reports </span>schema.</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="color: blue;">GRANT SELECT ON SCHEMA</span> :: reports <span style="color: blue;">TO </span>[MY_DOMAIN\Report Writers]</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">What have we accomplished?</span><br />
<ul>
<li><span style="font-size: small;">Your report writer team can log into your database</span></li>
<li><span style="font-size: small;">Your report writer team can view all of the table synonyms in Management Studio</span></li>
<li><span style="font-size: small;">Your report writer team doesn't have any write permissions (<span style="font-family: "Courier New",Courier,monospace;">INSERT/DELETE/UDPATE</span>) to anything. </span></li>
<li><span style="font-size: small;">Your report writer team cannot query the objects in DBO directly, so they don't have access to sensitive tables like <span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">UserLogins </span>and <span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">ApplicationSettings</span>.</span></li>
</ul>
<span style="font-size: small;">Why did this work?</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Turns out that in SQL Server Synonyms are like file system hard links. So if you had a file in one directory, and took away permissions on that directory. Then created a hard link in another directory and give permissions, the user would have access. The same idea works here. Since the report writers didn't have access to the <span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">DBO </span>schema, they can't view the tables there. But since they have access to <span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">REPORTS </span>they may read the synonyms and query them as well.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Turns out that you can customize access to the synonyms once they are created. All of the <span style="font-family: "Courier New",Courier,monospace;">GANT/DENY/REVOKE</span> commands work the same. You'll even be able to apply column level security!</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>Matthttp://www.blogger.com/profile/15169847588323399466noreply@blogger.com0